@openclaw/crabline 0.1.11 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/README.md +137 -23
  2. package/dist/src/bin/crabline.js +3 -1
  3. package/dist/src/bin/crabline.js.map +1 -1
  4. package/dist/src/cli/program.d.ts +5 -1
  5. package/dist/src/cli/program.js +281 -52
  6. package/dist/src/cli/program.js.map +1 -1
  7. package/dist/src/config/load.js +39 -3
  8. package/dist/src/config/load.js.map +1 -1
  9. package/dist/src/config/schema.d.ts +20 -0
  10. package/dist/src/config/schema.js +163 -35
  11. package/dist/src/config/schema.js.map +1 -1
  12. package/dist/src/core/errors.d.ts +1 -0
  13. package/dist/src/core/errors.js +6 -3
  14. package/dist/src/core/errors.js.map +1 -1
  15. package/dist/src/core/http-path.d.ts +1 -0
  16. package/dist/src/core/http-path.js +14 -0
  17. package/dist/src/core/http-path.js.map +1 -0
  18. package/dist/src/core/matcher.d.ts +3 -1
  19. package/dist/src/core/matcher.js +58 -2
  20. package/dist/src/core/matcher.js.map +1 -1
  21. package/dist/src/core/nonces.d.ts +2 -0
  22. package/dist/src/core/nonces.js +11 -1
  23. package/dist/src/core/nonces.js.map +1 -1
  24. package/dist/src/core/reporters.d.ts +5 -0
  25. package/dist/src/core/reporters.js +26 -2
  26. package/dist/src/core/reporters.js.map +1 -1
  27. package/dist/src/core/run.d.ts +3 -1
  28. package/dist/src/core/run.js +178 -66
  29. package/dist/src/core/run.js.map +1 -1
  30. package/dist/src/index.d.ts +12 -10
  31. package/dist/src/index.js +6 -5
  32. package/dist/src/index.js.map +1 -1
  33. package/dist/src/matrix-ids.d.ts +5 -0
  34. package/dist/src/matrix-ids.js +83 -0
  35. package/dist/src/matrix-ids.js.map +1 -0
  36. package/dist/src/openclaw/artifact-generation.d.ts +7 -6
  37. package/dist/src/openclaw/artifact-generation.js +385 -41
  38. package/dist/src/openclaw/artifact-generation.js.map +1 -1
  39. package/dist/src/openclaw/bridges/discord.d.ts +1 -0
  40. package/dist/src/openclaw/bridges/discord.js +149 -0
  41. package/dist/src/openclaw/bridges/discord.js.map +1 -0
  42. package/dist/src/openclaw/bridges/matrix.js +22 -5
  43. package/dist/src/openclaw/bridges/matrix.js.map +1 -1
  44. package/dist/src/openclaw/bridges/mattermost.js +14 -9
  45. package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
  46. package/dist/src/openclaw/bridges/probe-response.d.ts +1 -0
  47. package/dist/src/openclaw/bridges/probe-response.js +5 -0
  48. package/dist/src/openclaw/bridges/probe-response.js.map +1 -0
  49. package/dist/src/openclaw/bridges/signal.js +16 -7
  50. package/dist/src/openclaw/bridges/signal.js.map +1 -1
  51. package/dist/src/openclaw/bridges/slack.js +117 -24
  52. package/dist/src/openclaw/bridges/slack.js.map +1 -1
  53. package/dist/src/openclaw/bridges/telegram.js +46 -20
  54. package/dist/src/openclaw/bridges/telegram.js.map +1 -1
  55. package/dist/src/openclaw/bridges/whatsapp.js +33 -17
  56. package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
  57. package/dist/src/openclaw/bridges/zalo.js +9 -4
  58. package/dist/src/openclaw/bridges/zalo.js.map +1 -1
  59. package/dist/src/openclaw/outbound-contract.js +3 -0
  60. package/dist/src/openclaw/outbound-contract.js.map +1 -1
  61. package/dist/src/openclaw/private-file.d.ts +38 -3
  62. package/dist/src/openclaw/private-file.js +2008 -87
  63. package/dist/src/openclaw/private-file.js.map +1 -1
  64. package/dist/src/openclaw/{smoke-lock.d.ts → provider-readiness-lock.d.ts} +14 -5
  65. package/dist/src/openclaw/provider-readiness-lock.js +1320 -0
  66. package/dist/src/openclaw/provider-readiness-lock.js.map +1 -0
  67. package/dist/src/openclaw/shared.d.ts +10 -17
  68. package/dist/src/openclaw/shared.js +53 -19
  69. package/dist/src/openclaw/shared.js.map +1 -1
  70. package/dist/src/openclaw.d.ts +3 -5
  71. package/dist/src/openclaw.js +245 -60
  72. package/dist/src/openclaw.js.map +1 -1
  73. package/dist/src/platform/process-owned-lock.d.ts +11 -0
  74. package/dist/src/platform/process-owned-lock.js +1698 -0
  75. package/dist/src/platform/process-owned-lock.js.map +1 -0
  76. package/dist/src/platform/recorder-directory.d.ts +1 -0
  77. package/dist/src/platform/recorder-directory.js +14 -0
  78. package/dist/src/platform/recorder-directory.js.map +1 -0
  79. package/dist/src/platform/windows-acl.d.ts +18 -0
  80. package/dist/src/platform/windows-acl.js +1367 -0
  81. package/dist/src/platform/windows-acl.js.map +1 -0
  82. package/dist/src/platform/windows-lock-root.d.ts +13 -0
  83. package/dist/src/platform/windows-lock-root.js +98 -0
  84. package/dist/src/platform/windows-lock-root.js.map +1 -0
  85. package/dist/src/providers/builtin/discord.d.ts +4 -0
  86. package/dist/src/providers/builtin/discord.js +52 -9
  87. package/dist/src/providers/builtin/discord.js.map +1 -1
  88. package/dist/src/providers/builtin/external-webhook-auth.d.ts +1 -0
  89. package/dist/src/providers/builtin/external-webhook-auth.js +38 -1
  90. package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -1
  91. package/dist/src/providers/builtin/feishu.d.ts +1 -0
  92. package/dist/src/providers/builtin/feishu.js +96 -26
  93. package/dist/src/providers/builtin/feishu.js.map +1 -1
  94. package/dist/src/providers/builtin/googlechat.d.ts +1 -0
  95. package/dist/src/providers/builtin/googlechat.js +95 -26
  96. package/dist/src/providers/builtin/googlechat.js.map +1 -1
  97. package/dist/src/providers/builtin/imessage.js +60 -17
  98. package/dist/src/providers/builtin/imessage.js.map +1 -1
  99. package/dist/src/providers/builtin/loopback.js +88 -35
  100. package/dist/src/providers/builtin/loopback.js.map +1 -1
  101. package/dist/src/providers/builtin/matrix.d.ts +2 -2
  102. package/dist/src/providers/builtin/matrix.js +78 -21
  103. package/dist/src/providers/builtin/matrix.js.map +1 -1
  104. package/dist/src/providers/builtin/mattermost.d.ts +11 -7
  105. package/dist/src/providers/builtin/mattermost.js +138 -24
  106. package/dist/src/providers/builtin/mattermost.js.map +1 -1
  107. package/dist/src/providers/builtin/msteams.d.ts +1 -0
  108. package/dist/src/providers/builtin/msteams.js +118 -38
  109. package/dist/src/providers/builtin/msteams.js.map +1 -1
  110. package/dist/src/providers/builtin/native-local-mock.js +4 -4
  111. package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
  112. package/dist/src/providers/builtin/script.js +1057 -146
  113. package/dist/src/providers/builtin/script.js.map +1 -1
  114. package/dist/src/providers/builtin/slack.d.ts +8 -1
  115. package/dist/src/providers/builtin/slack.js +327 -24
  116. package/dist/src/providers/builtin/slack.js.map +1 -1
  117. package/dist/src/providers/builtin/telegram.d.ts +1 -1
  118. package/dist/src/providers/builtin/telegram.js +55 -14
  119. package/dist/src/providers/builtin/telegram.js.map +1 -1
  120. package/dist/src/providers/builtin/whatsapp.d.ts +4 -3
  121. package/dist/src/providers/builtin/whatsapp.js +157 -29
  122. package/dist/src/providers/builtin/whatsapp.js.map +1 -1
  123. package/dist/src/providers/builtin/zalo.d.ts +5 -2
  124. package/dist/src/providers/builtin/zalo.js +31 -7
  125. package/dist/src/providers/builtin/zalo.js.map +1 -1
  126. package/dist/src/providers/catalog.d.ts +1 -1
  127. package/dist/src/providers/catalog.js +1 -1
  128. package/dist/src/providers/catalog.js.map +1 -1
  129. package/dist/src/providers/local-mock.d.ts +4 -0
  130. package/dist/src/providers/local-mock.js +162 -35
  131. package/dist/src/providers/local-mock.js.map +1 -1
  132. package/dist/src/providers/native-ids.d.ts +2 -0
  133. package/dist/src/providers/native-ids.js +3 -0
  134. package/dist/src/providers/native-ids.js.map +1 -1
  135. package/dist/src/providers/recorder.d.ts +14 -3
  136. package/dist/src/providers/recorder.js +521 -41
  137. package/dist/src/providers/recorder.js.map +1 -1
  138. package/dist/src/providers/registry.d.ts +1 -0
  139. package/dist/src/providers/registry.js +65 -20
  140. package/dist/src/providers/registry.js.map +1 -1
  141. package/dist/src/providers/signed-jwt.d.ts +6 -1
  142. package/dist/src/providers/signed-jwt.js +241 -50
  143. package/dist/src/providers/signed-jwt.js.map +1 -1
  144. package/dist/src/providers/slack-ids.d.ts +1 -0
  145. package/dist/src/providers/slack-ids.js +5 -0
  146. package/dist/src/providers/slack-ids.js.map +1 -1
  147. package/dist/src/providers/target-normalizers.d.ts +9 -1
  148. package/dist/src/providers/target-normalizers.js +177 -58
  149. package/dist/src/providers/target-normalizers.js.map +1 -1
  150. package/dist/src/providers/webhook-server.d.ts +3 -0
  151. package/dist/src/providers/webhook-server.js +268 -47
  152. package/dist/src/providers/webhook-server.js.map +1 -1
  153. package/dist/src/servers/discord.d.ts +40 -0
  154. package/dist/src/servers/discord.js +842 -0
  155. package/dist/src/servers/discord.js.map +1 -0
  156. package/dist/src/servers/http.d.ts +14 -2
  157. package/dist/src/servers/http.js +229 -58
  158. package/dist/src/servers/http.js.map +1 -1
  159. package/dist/src/servers/index.d.ts +10 -4
  160. package/dist/src/servers/index.js +4 -0
  161. package/dist/src/servers/index.js.map +1 -1
  162. package/dist/src/servers/matrix.d.ts +3 -0
  163. package/dist/src/servers/matrix.js +268 -110
  164. package/dist/src/servers/matrix.js.map +1 -1
  165. package/dist/src/servers/mattermost.d.ts +5 -0
  166. package/dist/src/servers/mattermost.js +389 -91
  167. package/dist/src/servers/mattermost.js.map +1 -1
  168. package/dist/src/servers/recorder.d.ts +11 -0
  169. package/dist/src/servers/recorder.js +1072 -69
  170. package/dist/src/servers/recorder.js.map +1 -1
  171. package/dist/src/servers/signal.d.ts +1 -0
  172. package/dist/src/servers/signal.js +279 -44
  173. package/dist/src/servers/signal.js.map +1 -1
  174. package/dist/src/servers/slack.d.ts +15 -0
  175. package/dist/src/servers/slack.js +270 -54
  176. package/dist/src/servers/slack.js.map +1 -1
  177. package/dist/src/servers/telegram-identity.d.ts +6 -0
  178. package/dist/src/servers/telegram-identity.js +27 -0
  179. package/dist/src/servers/telegram-identity.js.map +1 -0
  180. package/dist/src/servers/telegram.d.ts +17 -6
  181. package/dist/src/servers/telegram.js +1218 -107
  182. package/dist/src/servers/telegram.js.map +1 -1
  183. package/dist/src/servers/webhook-target.d.ts +12 -4
  184. package/dist/src/servers/webhook-target.js +226 -28
  185. package/dist/src/servers/webhook-target.js.map +1 -1
  186. package/dist/src/servers/whatsapp-baileys-websocket.d.ts +60 -1
  187. package/dist/src/servers/whatsapp-baileys-websocket.js +782 -112
  188. package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
  189. package/dist/src/servers/whatsapp-jid.d.ts +1 -0
  190. package/dist/src/servers/whatsapp-jid.js +9 -5
  191. package/dist/src/servers/whatsapp-jid.js.map +1 -1
  192. package/dist/src/servers/whatsapp-wire/binary-node.d.ts +1 -0
  193. package/dist/src/servers/whatsapp-wire/binary-node.js +37 -13
  194. package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
  195. package/dist/src/servers/whatsapp-wire/crypto.d.ts +3 -0
  196. package/dist/src/servers/whatsapp-wire/crypto.js +23 -8
  197. package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
  198. package/dist/src/servers/whatsapp-wire/handshake.d.ts +9 -3
  199. package/dist/src/servers/whatsapp-wire/handshake.js +173 -12
  200. package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
  201. package/dist/src/servers/whatsapp-wire/signal.js +3 -3
  202. package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
  203. package/dist/src/servers/whatsapp.d.ts +7 -1
  204. package/dist/src/servers/whatsapp.js +149 -25
  205. package/dist/src/servers/whatsapp.js.map +1 -1
  206. package/dist/src/servers/zalo.d.ts +1 -0
  207. package/dist/src/servers/zalo.js +193 -82
  208. package/dist/src/servers/zalo.js.map +1 -1
  209. package/docs/channel-setup.md +251 -64
  210. package/fixtures/examples/crabline.example.yaml +3 -2
  211. package/package.json +18 -10
  212. package/dist/src/openclaw/smoke-lock.js +0 -1004
  213. package/dist/src/openclaw/smoke-lock.js.map +0 -1
  214. package/fixtures/examples/openclaw-bridge.yaml +0 -125
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-owned-lock.js","sourceRoot":"","sources":["../../../src/platform/process-owned-lock.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport fs, { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { performance } from \"node:perf_hooks\";\nimport { resolveWindowsPowerShellPath } from \"./windows-acl.js\";\n\ntype LockOwner = {\n executionIdentity: string | null;\n machineIdentity: string | null;\n pid: number;\n processIdentity: string | null;\n processNamespace: string | null;\n processStartedAtMs: number;\n token: string;\n version: 1 | 2 | 3 | 4;\n};\n\ntype OwnerStatus = \"active\" | \"dead\" | \"foreign\" | \"superseded\" | \"unknown\";\n\ntype ParsedLockOwner = {\n lockDirectory: string;\n owner: LockOwner;\n publishedAtMs: number;\n};\n\ntype RecoveryClaim = {\n activeIdentity: DirectoryIdentity;\n activePath: string;\n ownerGenerationKey: string;\n supersededPaths: SupersededRecoveryClaim[];\n};\n\ntype DirectoryIdentity = {\n dev: bigint;\n ino: bigint;\n};\n\ntype SupersededRecoveryClaim = {\n identity: DirectoryIdentity & { mtimeMs: bigint };\n ownerFingerprint: string;\n path: string;\n};\n\ntype RetainedRecoveryClaim = {\n claim: RecoveryClaim;\n retainedByToken: string;\n};\n\ntype AbandonedDirectoryIdentity = DirectoryIdentity & {\n ownerGenerationKey: string;\n};\n\nconst retainedCoordinationClaims = new Map<string, RetainedRecoveryClaim>();\nconst abandonedOwnerKeys = new Set<string>();\nconst abandonedDirectoryIdentities = new Map<string, AbandonedDirectoryIdentity>();\n\nconst OWNER_FILE = \"crabline-owner.json\";\nconst ABANDONED_OWNER_PREFIX = \".crabline-abandoned-\";\nconst ABANDONED_OWNER_NAME_PATTERN = /^\\.crabline-abandoned-[0-9a-f]{64}$/u;\nconst MAX_OWNER_BYTES = 4096;\nconst MAX_PROCESS_ID = 2_147_483_647;\nconst IDENTITY_CACHE_MS = 1000;\nconst CURRENT_IDENTITY_ATTEMPTS = 3;\nconst COORDINATION_RELEASE_RETRY_MS = 10;\nconst COORDINATION_RELEASE_WAIT_MS = 5000;\nconst LEGACY_PROCESS_START_TOLERANCE_MS = 2000;\nconst OWNERLESS_LOCK_RECOVERY_MS = 10 * 60 * 1000;\nconst CURRENT_PROCESS_STARTED_AT_MS = Math.trunc(performance.timeOrigin);\nconst CURRENT_EXECUTION_IDENTITY = randomUUID();\nconst DARWIN_PRECISE_IDENTITY_PATTERN = /^darwin:\\d+\\.\\d+:us:\\d+$/u;\nconst DARWIN_COARSE_IDENTITY_PATTERN = /^darwin:\\d+\\.\\d+:s:(\\d+)$/u;\nconst LINUX_PID_NAMESPACE_PATTERN = /^pid:\\[\\d+\\]$/u;\nconst DARWIN_MONTHS = new Map([\n [\"Jan\", 0],\n [\"Feb\", 1],\n [\"Mar\", 2],\n [\"Apr\", 3],\n [\"May\", 4],\n [\"Jun\", 5],\n [\"Jul\", 6],\n [\"Aug\", 7],\n [\"Sep\", 8],\n [\"Oct\", 9],\n [\"Nov\", 10],\n [\"Dec\", 11],\n]);\n\nfunction isValidProcessId(pid: number): boolean {\n return Number.isSafeInteger(pid) && pid > 0 && pid <= MAX_PROCESS_ID;\n}\n\nfunction isProcessAlive(pid: number): boolean {\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 isDeadLinuxProcessState(value: string): boolean {\n const commandEnd = value.lastIndexOf(\") \");\n if (commandEnd < 0) {\n return false;\n }\n const state = value\n .slice(commandEnd + 2)\n .trim()\n .split(/\\s+/u)[0];\n return state === \"Z\" || state === \"X\" || state === \"x\";\n}\n\nfunction isDefunctProcess(pid: number): boolean {\n if (process.platform === \"linux\") {\n try {\n return isDeadLinuxProcessState(readFileSync(`/proc/${pid}/stat`, \"utf8\"));\n } catch {\n return false;\n }\n }\n if (process.platform === \"darwin\") {\n const result = spawnSync(\"/bin/ps\", [\"-o\", \"stat=\", \"-p\", String(pid)], {\n encoding: \"utf8\",\n env: { ...process.env, LC_ALL: \"C\" },\n timeout: 1000,\n });\n return result.status === 0 && /^Z/u.test(result.stdout.trim());\n }\n return false;\n}\n\nfunction 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 startTicks = value\n .slice(commandEnd + 2)\n .trim()\n .split(/\\s+/u)[19];\n return startTicks && /^\\d+$/u.test(startTicks) ? `linux:${normalizedBootId}:${startTicks}` : null;\n}\n\nfunction processIdentityFromDarwin(processDetails: string, bootTime: string): string | null {\n const bootMatch = /\\bsec = (\\d+), usec = (\\d+)\\b/u.exec(bootTime);\n const launchMatch =\n /^Launch Time:\\s*(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}):(\\d{2}):(\\d{2})\\.(\\d{3,6}) ([+-])(\\d{2})(\\d{2})$/mu.exec(\n processDetails,\n );\n if (!bootMatch) {\n return null;\n }\n if (launchMatch) {\n const [, year, month, day, hour, minute, second, fraction, sign, offsetHour, offsetMinute] =\n launchMatch as RegExpExecArray &\n [string, string, string, string, string, string, string, string, string, string, string];\n const offsetMs =\n (Number(offsetHour) * 60 + Number(offsetMinute)) * 60_000 * (sign === \"+\" ? 1 : -1);\n const fractionMicros = Number(fraction.padEnd(6, \"0\"));\n const utcMilliseconds =\n Date.UTC(\n Number(year),\n Number(month) - 1,\n Number(day),\n Number(hour),\n Number(minute),\n Number(second),\n Math.floor(fractionMicros / 1000),\n ) - offsetMs;\n if (Number.isSafeInteger(utcMilliseconds) && utcMilliseconds > 0) {\n const startedAtMicros = BigInt(utcMilliseconds) * 1000n + BigInt(fractionMicros % 1000);\n return `darwin:${bootMatch[1]}.${bootMatch[2]}:us:${startedAtMicros}`;\n }\n }\n const normalizedDetails = processDetails.trim().replace(/\\s+/gu, \" \");\n if (normalizedDetails.length === 0 || normalizedDetails.length > 64) {\n return null;\n }\n return `darwin:${bootMatch[1]}.${bootMatch[2]}:${normalizedDetails}`;\n}\n\nfunction coarseProcessIdentityFromDarwin(processDetails: string, bootTime: string): string | null {\n const bootMatch = /\\bsec = (\\d+), usec = (\\d+)\\b/u.exec(bootTime);\n const startMatch =\n /^(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)\\s+([A-Z][a-z]{2})\\s+(\\d{1,2})\\s+(\\d{2}):(\\d{2}):(\\d{2})\\s+(\\d{4})\\s*$/u.exec(\n processDetails,\n );\n const month = DARWIN_MONTHS.get(startMatch?.[1] ?? \"\");\n if (!bootMatch || !startMatch || month === undefined) {\n return null;\n }\n const startedAtMs = Date.UTC(\n Number(startMatch[6]),\n month,\n Number(startMatch[2]),\n Number(startMatch[3]),\n Number(startMatch[4]),\n Number(startMatch[5]),\n );\n return Number.isSafeInteger(startedAtMs) && startedAtMs > 0\n ? `darwin:${bootMatch[1]}.${bootMatch[2]}:s:${Math.trunc(startedAtMs / 1000)}`\n : null;\n}\n\nfunction readProcessIdentity(pid: number): string | null {\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: { ...process.env, LC_ALL: \"C\", TZ: \"UTC\" },\n maxBuffer: 512 * 1024,\n timeout: 1000,\n };\n const bootTime = spawnSync(\"/usr/sbin/sysctl\", [\"-n\", \"kern.boottime\"], options);\n const preciseDetails = spawnSync(\"/usr/bin/vmmap\", [\"-summary\", String(pid)], {\n ...options,\n timeout: 3000,\n });\n const sampleDetails =\n preciseDetails.status === 0\n ? undefined\n : spawnSync(\"/usr/bin/sample\", [String(pid), \"1\", \"1\"], {\n ...options,\n timeout: 3000,\n });\n const nativeDetails =\n preciseDetails.status === 0\n ? preciseDetails\n : sampleDetails?.status === 0\n ? sampleDetails\n : undefined;\n const identity =\n bootTime.status === 0 && nativeDetails\n ? processIdentityFromDarwin(nativeDetails.stdout, bootTime.stdout)\n : null;\n if (identity !== null && DARWIN_PRECISE_IDENTITY_PATTERN.test(identity)) {\n return identity;\n }\n const coarseDetails = spawnSync(\"/bin/ps\", [\"-o\", \"lstart=\", \"-p\", String(pid)], options);\n return bootTime.status === 0 && coarseDetails.status === 0\n ? coarseProcessIdentityFromDarwin(coarseDetails.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: 1000, windowsHide: true },\n );\n const ticks = result.status === 0 ? result.stdout.trim() : \"\";\n return /^\\d+$/u.test(ticks) ? `windows:${ticks}` : null;\n}\n\nfunction readProcessNamespace(pid: number): string | null {\n if (process.platform !== \"linux\") {\n return null;\n }\n try {\n const namespace = fs.readlinkSync(`/proc/${pid}/ns/pid`);\n return LINUX_PID_NAMESPACE_PATTERN.test(namespace) ? namespace : null;\n } catch {\n return null;\n }\n}\n\nfunction readMachineIdentity(): string | null {\n if (process.platform === \"linux\") {\n try {\n const bootId = readFileSync(\"/proc/sys/kernel/random/boot_id\", \"utf8\").trim();\n return /^[0-9a-f-]{16,64}$/iu.test(bootId) ? `linux:${bootId}` : null;\n } catch {\n return null;\n }\n }\n if (process.platform === \"darwin\") {\n const result = spawnSync(\"/usr/sbin/ioreg\", [\"-rd1\", \"-c\", \"IOPlatformExpertDevice\"], {\n encoding: \"utf8\",\n env: { ...process.env, LC_ALL: \"C\" },\n timeout: 1000,\n });\n const platformUuid = /\"IOPlatformUUID\"\\s*=\\s*\"([^\"]+)\"/u.exec(result.stdout)?.[1];\n return result.status === 0 && platformUuid ? `darwin:${platformUuid.toLowerCase()}` : 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-ItemProperty -LiteralPath 'HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Cryptography' -Name MachineGuid -ErrorAction Stop).MachineGuid\",\n ],\n { encoding: \"utf8\", timeout: 1000, windowsHide: true },\n );\n const machineGuid = result.status === 0 ? result.stdout.trim() : \"\";\n return /^[0-9a-f-]{16,64}$/iu.test(machineGuid) ? `windows:${machineGuid.toLowerCase()}` : null;\n}\n\nlet cachedLinuxClockTicks: number | undefined;\n\nfunction processStartedAtMsFromIdentity(identity: string | null): number | null {\n const darwinStart = /^darwin:\\d+\\.\\d+:us:(\\d+)$/u.exec(identity ?? \"\")?.[1];\n if (darwinStart) {\n return Number(BigInt(darwinStart) / 1000n);\n }\n const coarseDarwinStart = DARWIN_COARSE_IDENTITY_PATTERN.exec(identity ?? \"\")?.[1];\n if (coarseDarwinStart) {\n return Number(coarseDarwinStart) * 1000;\n }\n const windowsStart = /^windows:(\\d+)$/u.exec(identity ?? \"\")?.[1];\n if (windowsStart) {\n const unixEpochTicks = 621_355_968_000_000_000n;\n const ticks = BigInt(windowsStart);\n return ticks >= unixEpochTicks ? Number((ticks - unixEpochTicks) / 10_000n) : null;\n }\n return null;\n}\n\nfunction readLegacyProcessStartedAtMs(pid: number): number | null {\n if (process.platform === \"linux\") {\n try {\n const processStat = readFileSync(`/proc/${pid}/stat`, \"utf8\");\n const commandEnd = processStat.lastIndexOf(\") \");\n const startTicks =\n commandEnd < 0\n ? undefined\n : processStat\n .slice(commandEnd + 2)\n .trim()\n .split(/\\s+/u)[19];\n const bootTime = /^btime\\s+(\\d+)$/mu.exec(readFileSync(\"/proc/stat\", \"utf8\"))?.[1];\n if (!startTicks || !/^\\d+$/u.test(startTicks) || !bootTime) {\n return null;\n }\n if (cachedLinuxClockTicks === undefined) {\n const result = spawnSync(\"/usr/bin/getconf\", [\"CLK_TCK\"], {\n encoding: \"utf8\",\n timeout: 1000,\n });\n const ticks = result.status === 0 ? Number(result.stdout.trim()) : Number.NaN;\n if (!Number.isSafeInteger(ticks) || ticks <= 0) {\n return null;\n }\n cachedLinuxClockTicks = ticks;\n }\n return Number(bootTime) * 1000 + (Number(startTicks) * 1000) / cachedLinuxClockTicks;\n } catch {\n return null;\n }\n }\n return processStartedAtMsFromIdentity(readProcessIdentity(pid));\n}\n\nfunction legacyProcessStartMatches(expected: number, observed: number): boolean {\n return Math.abs(expected - observed) <= LEGACY_PROCESS_START_TOLERANCE_MS;\n}\n\nfunction isCoarseDarwinIdentity(identity: string): boolean {\n return DARWIN_COARSE_IDENTITY_PATTERN.test(identity);\n}\n\nfunction isExactProcessIdentity(identity: string): boolean {\n return (\n /^linux:[0-9a-f-]{16,64}:\\d+$/iu.test(identity) ||\n DARWIN_PRECISE_IDENTITY_PATTERN.test(identity) ||\n /^windows:\\d+$/u.test(identity)\n );\n}\n\nfunction directoryIdentity(stats: Pick<fs.BigIntStats, \"dev\" | \"ino\">): DirectoryIdentity {\n return { dev: stats.dev, ino: stats.ino };\n}\n\nfunction directoryIdentityMatches(\n expected: DirectoryIdentity | undefined,\n actual: Pick<fs.BigIntStats, \"dev\" | \"ino\">,\n): boolean {\n return expected !== undefined && expected.dev === actual.dev && expected.ino === actual.ino;\n}\n\nfunction lockCleanupError(message: string): NodeJS.ErrnoException {\n return Object.assign(new Error(message), { code: \"ELOCKED\" });\n}\n\nfunction isLockArtifactName(name: string): boolean {\n return name === OWNER_FILE || ABANDONED_OWNER_NAME_PATTERN.test(name);\n}\n\nfunction verifiedLockDirectoryStats(\n directoryPath: fs.PathLike,\n expectedIdentity: DirectoryIdentity,\n expectedMtimeMs?: bigint,\n): fs.BigIntStats | undefined {\n let stats: fs.BigIntStats;\n try {\n stats = fs.lstatSync(directoryPath, { bigint: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n if (\n !stats.isDirectory() ||\n stats.isSymbolicLink() ||\n !directoryIdentityMatches(expectedIdentity, stats) ||\n (expectedMtimeMs !== undefined && stats.mtimeMs !== expectedMtimeMs)\n ) {\n throw lockCleanupError(\"Recorder lock cleanup target changed.\");\n }\n return stats;\n}\n\nfunction removeVerifiedLockDirectorySync(\n directoryPath: fs.PathLike,\n expectedIdentity: DirectoryIdentity,\n expectedMtimeMs?: bigint,\n beforeRemove?: (directoryPath: string) => void,\n afterClaim?: (directoryPath: string) => void,\n): void {\n if (!verifiedLockDirectoryStats(directoryPath, expectedIdentity, expectedMtimeMs)) {\n return;\n }\n const sourcePath = String(directoryPath);\n const quarantinePath = `${sourcePath}.cleanup.${randomUUID()}`;\n beforeRemove?.(sourcePath);\n if (!verifiedLockDirectoryStats(sourcePath, expectedIdentity, expectedMtimeMs)) {\n return;\n }\n fs.renameSync(directoryPath, quarantinePath);\n if (!verifiedLockDirectoryStats(quarantinePath, expectedIdentity, expectedMtimeMs)) {\n throw lockCleanupError(\"Recorder lock cleanup target disappeared.\");\n }\n afterClaim?.(quarantinePath);\n try {\n const entries = fs.readdirSync(quarantinePath);\n if (!verifiedLockDirectoryStats(quarantinePath, expectedIdentity)) {\n throw lockCleanupError(\"Recorder lock cleanup target changed.\");\n }\n const artifacts: string[] = [];\n for (const entry of entries) {\n if (!isLockArtifactName(entry)) {\n throw lockCleanupError(\"Recorder lock cleanup found an unexpected artifact.\");\n }\n if (!verifiedLockDirectoryStats(quarantinePath, expectedIdentity)) {\n throw lockCleanupError(\"Recorder lock cleanup target changed.\");\n }\n const artifactPath = path.join(quarantinePath, entry);\n const artifact = fs.lstatSync(artifactPath, { bigint: true });\n if (!artifact.isFile() || artifact.isSymbolicLink()) {\n throw lockCleanupError(\"Recorder lock cleanup found an unsafe artifact.\");\n }\n artifacts.push(artifactPath);\n }\n artifacts.sort(\n (left, right) =>\n Number(path.basename(left) === OWNER_FILE) - Number(path.basename(right) === OWNER_FILE),\n );\n for (const artifactPath of artifacts) {\n if (!verifiedLockDirectoryStats(quarantinePath, expectedIdentity)) {\n throw lockCleanupError(\"Recorder lock cleanup target changed.\");\n }\n const artifact = fs.lstatSync(artifactPath, { bigint: true });\n if (!artifact.isFile() || artifact.isSymbolicLink()) {\n throw lockCleanupError(\"Recorder lock cleanup artifact changed.\");\n }\n fs.unlinkSync(artifactPath);\n }\n if (!verifiedLockDirectoryStats(quarantinePath, expectedIdentity)) {\n throw lockCleanupError(\"Recorder lock cleanup target disappeared.\");\n }\n fs.rmdirSync(quarantinePath);\n } catch (error) {\n try {\n if (verifiedLockDirectoryStats(quarantinePath, expectedIdentity)) {\n fs.utimesSync(quarantinePath, new Date(0), new Date(0));\n }\n } catch {\n // Do not mutate a replacement directory after cleanup loses its identity fence.\n }\n throw error;\n }\n}\n\nfunction canonicalLockDirectoryPath(directoryPath: fs.PathLike): string {\n const resolved = path.resolve(String(directoryPath));\n let canonicalParent: string;\n try {\n canonicalParent = fs.realpathSync.native(path.dirname(resolved));\n } catch {\n canonicalParent = path.dirname(resolved);\n }\n const canonical = path.join(canonicalParent, path.basename(resolved));\n return process.platform === \"win32\" ? path.win32.normalize(canonical).toLowerCase() : canonical;\n}\n\nfunction abandonedOwnerKey(directoryPath: fs.PathLike, ownerToken: string): string {\n return `${canonicalLockDirectoryPath(directoryPath)}\\0${ownerToken}`;\n}\n\nfunction recoveryClaimPath(directoryPath: fs.PathLike, fingerprint = \"coordination\"): string {\n const canonicalDirectory = canonicalLockDirectoryPath(directoryPath);\n const digest = createHash(\"sha256\")\n .update(canonicalDirectory)\n .update(\"\\0\")\n .update(fingerprint)\n .digest(\"hex\");\n return path.join(path.dirname(canonicalDirectory), `.crabline-reclaim-${digest}`);\n}\n\nfunction lockOwnerMatches(\n left: ParsedLockOwner | null | undefined,\n right: ParsedLockOwner | null | undefined,\n): boolean {\n if (!left || !right) {\n return left === right;\n }\n return left.owner.token === right.owner.token;\n}\n\nlet cachedCurrentProcessIdentity: string | undefined;\nlet cachedCurrentMachineIdentity: string | undefined;\n\nfunction readProcessIdentityWithRetry(\n pid: number,\n reader: (candidatePid: number) => string | null,\n): string | null {\n for (let attempt = 0; attempt < CURRENT_IDENTITY_ATTEMPTS; attempt++) {\n const identity = reader(pid);\n if (identity !== null) {\n return identity;\n }\n }\n return null;\n}\n\nfunction readProcessNamespaceWithRetry(pid: number): string | null {\n for (let attempt = 0; attempt < CURRENT_IDENTITY_ATTEMPTS; attempt++) {\n const namespace = readProcessNamespace(pid);\n if (namespace !== null) {\n return namespace;\n }\n }\n return null;\n}\n\nfunction parseOpenedOwner(ownerHandle: number): Omit<ParsedLockOwner, \"lockDirectory\"> | undefined {\n const stats = fs.fstatSync(ownerHandle);\n if (!stats.isFile() || stats.size === 0 || stats.size > MAX_OWNER_BYTES) {\n return undefined;\n }\n const raw = Buffer.alloc(stats.size);\n let offset = 0;\n while (offset < raw.byteLength) {\n const bytesRead = fs.readSync(ownerHandle, raw, offset, raw.byteLength - offset, offset);\n if (bytesRead === 0) {\n return undefined;\n }\n offset += bytesRead;\n }\n const value = JSON.parse(raw.toString(\"utf8\")) as Partial<LockOwner>;\n if (\n (value.version !== 1 && value.version !== 2 && value.version !== 3 && value.version !== 4) ||\n !isValidProcessId(value.pid ?? 0) ||\n typeof value.token !== \"string\" ||\n value.token.length === 0 ||\n value.token.length > 128 ||\n !Number.isSafeInteger(value.processStartedAtMs) ||\n (value.executionIdentity !== undefined &&\n value.executionIdentity !== null &&\n (typeof value.executionIdentity !== \"string\" ||\n value.executionIdentity.length === 0 ||\n value.executionIdentity.length > 128)) ||\n (value.machineIdentity !== undefined &&\n value.machineIdentity !== null &&\n (typeof value.machineIdentity !== \"string\" ||\n value.machineIdentity.length === 0 ||\n value.machineIdentity.length > 256)) ||\n (value.processNamespace !== undefined &&\n value.processNamespace !== null &&\n (typeof value.processNamespace !== \"string\" ||\n !LINUX_PID_NAMESPACE_PATTERN.test(value.processNamespace))) ||\n (value.processIdentity !== null &&\n (typeof value.processIdentity !== \"string\" ||\n value.processIdentity.length === 0 ||\n value.processIdentity.length > 256))\n ) {\n return undefined;\n }\n if (\n (value.version === 2 || value.version === 3 || value.version === 4) &&\n (value.processIdentity === null ||\n !isExactProcessIdentity(value.processIdentity) ||\n (/^linux:/u.test(value.processIdentity) &&\n (value.processNamespace === null ||\n value.processNamespace === undefined ||\n !LINUX_PID_NAMESPACE_PATTERN.test(value.processNamespace))))\n ) {\n return undefined;\n }\n if (\n (value.version === 3 || value.version === 4) &&\n (value.machineIdentity === null ||\n value.machineIdentity === undefined ||\n !/^(darwin|linux|windows):.+$/u.test(value.machineIdentity))\n ) {\n return undefined;\n }\n if (\n value.version === 4 &&\n (value.executionIdentity === null ||\n value.executionIdentity === undefined ||\n !/^[0-9a-f-]{36}$/iu.test(value.executionIdentity))\n ) {\n return undefined;\n }\n return {\n owner: {\n ...(value as LockOwner),\n executionIdentity: value.executionIdentity ?? null,\n machineIdentity: value.machineIdentity ?? null,\n processNamespace: value.processNamespace ?? null,\n },\n publishedAtMs: stats.mtimeMs,\n };\n}\n\nfunction parseOwner(lockDirectory: fs.PathLike): ParsedLockOwner | null | undefined {\n let ownerHandle: number;\n try {\n ownerHandle = fs.openSync(\n path.join(String(lockDirectory), OWNER_FILE),\n fs.constants.O_RDONLY | fs.constants.O_NONBLOCK | fs.constants.O_NOFOLLOW,\n );\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === \"ENOENT\" ? undefined : null;\n }\n let parsed: Omit<ParsedLockOwner, \"lockDirectory\"> | undefined;\n try {\n parsed = parseOpenedOwner(ownerHandle);\n } catch {\n parsed = undefined;\n }\n try {\n fs.closeSync(ownerHandle);\n } catch {\n return null;\n }\n return parsed === undefined\n ? null\n : {\n ...parsed,\n lockDirectory: String(lockDirectory),\n };\n}\n\nfunction restoreDisplacedPublishedLockDirectory(\n displacedPath: string,\n lockDirectory: string,\n): void {\n try {\n const displaced = fs.lstatSync(displacedPath, { bigint: true });\n const owner = parseOwner(displacedPath);\n if (\n !displaced.isDirectory() ||\n displaced.isSymbolicLink() ||\n owner === null ||\n owner === undefined\n ) {\n return;\n }\n } catch {\n return;\n }\n try {\n fs.lstatSync(lockDirectory);\n return;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n return;\n }\n }\n try {\n // The coordination claim excludes compliant publishers. If an unexpected\n // published directory races this restore, its owner file makes it nonempty,\n // so rename refuses to replace it and the displaced directory stays preserved.\n fs.renameSync(displacedPath, lockDirectory);\n } catch {\n // Preserve the displaced directory at its claim-local path if restoration races.\n }\n}\n\nfunction renamedDirectoryMatches(\n claimedPath: string,\n lockDirectory: string,\n expectedIdentity: DirectoryIdentity,\n): boolean {\n try {\n const claimed = fs.lstatSync(claimedPath, { bigint: true });\n if (\n claimed.isDirectory() &&\n !claimed.isSymbolicLink() &&\n directoryIdentityMatches(expectedIdentity, claimed)\n ) {\n return true;\n }\n } catch {\n // Restore or preserve any directory displaced after the final identity check.\n }\n restoreDisplacedPublishedLockDirectory(claimedPath, lockDirectory);\n return false;\n}\n\nfunction abandonedOwnerMarkerPath(lockDirectory: fs.PathLike, ownerToken: string): string {\n const digest = createHash(\"sha256\").update(ownerToken).digest(\"hex\");\n return path.join(String(lockDirectory), `${ABANDONED_OWNER_PREFIX}${digest}`);\n}\n\nfunction hasAbandonedOwnerMarker(candidate: ParsedLockOwner): boolean {\n const markerPath = abandonedOwnerMarkerPath(candidate.lockDirectory, candidate.owner.token);\n let markerHandle: number;\n try {\n markerHandle = fs.openSync(markerPath, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW);\n } catch {\n return false;\n }\n let matches = false;\n try {\n const stats = fs.fstatSync(markerHandle);\n if (stats.isFile() && stats.size > 0 && stats.size <= 256) {\n const raw = Buffer.alloc(stats.size);\n let offset = 0;\n while (offset < raw.byteLength) {\n const bytesRead = fs.readSync(markerHandle, raw, offset, raw.byteLength - offset, offset);\n if (bytesRead === 0) {\n break;\n }\n offset += bytesRead;\n }\n matches = offset === raw.byteLength && raw.toString(\"utf8\").trim() === candidate.owner.token;\n }\n } catch {\n matches = false;\n }\n try {\n fs.closeSync(markerHandle);\n } catch {\n return false;\n }\n return matches;\n}\n\nfunction publishAbandonedOwnerMarker(lockDirectory: fs.PathLike, ownerToken: string): boolean {\n const candidate = parseOwner(lockDirectory);\n if (!candidate || candidate.owner.token !== ownerToken) {\n return false;\n }\n const markerPath = abandonedOwnerMarkerPath(lockDirectory, ownerToken);\n let markerHandle: number | undefined;\n let markerIdentity: fs.BigIntStats | undefined;\n try {\n markerHandle = fs.openSync(\n markerPath,\n fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_NOFOLLOW,\n 0o600,\n );\n markerIdentity = fs.fstatSync(markerHandle, { bigint: true });\n const contents = Buffer.from(`${ownerToken}\\n`);\n let offset = 0;\n while (offset < contents.byteLength) {\n const written = fs.writeSync(\n markerHandle,\n contents,\n offset,\n contents.byteLength - offset,\n offset,\n );\n if (written === 0) {\n throw new Error(\"Recorder lock abandonment publication made no progress.\");\n }\n offset += written;\n }\n fs.fsyncSync(markerHandle);\n fs.closeSync(markerHandle);\n markerHandle = undefined;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"EEXIST\") {\n return hasAbandonedOwnerMarker(candidate);\n }\n if (markerIdentity !== undefined) {\n try {\n const current = fs.lstatSync(markerPath, { bigint: true });\n if (markerIdentity.dev === current.dev && markerIdentity.ino === current.ino) {\n fs.unlinkSync(markerPath);\n }\n } catch {\n // Preserve a replacement marker that cannot be proven to be ours.\n }\n }\n return false;\n } finally {\n if (markerHandle !== undefined) {\n try {\n fs.closeSync(markerHandle);\n } catch {\n // The failed abandonment publication remains non-authoritative.\n }\n }\n }\n const refreshed = parseOwner(lockDirectory);\n if (!refreshed || refreshed.owner.token !== ownerToken || !hasAbandonedOwnerMarker(refreshed)) {\n try {\n fs.unlinkSync(markerPath);\n } catch {\n // A changed marker is ignored unless it matches the current owner token.\n }\n return false;\n }\n return true;\n}\n\nfunction hasRecoverableMalformedOwner(lockDirectory: fs.PathLike): boolean {\n let ownerHandle: number;\n try {\n ownerHandle = fs.openSync(\n path.join(String(lockDirectory), OWNER_FILE),\n fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW,\n );\n } catch {\n return false;\n }\n let recoverable = false;\n try {\n const stats = fs.fstatSync(ownerHandle);\n if (!stats.isFile() || stats.size > MAX_OWNER_BYTES) {\n recoverable = false;\n } else if (stats.size === 0) {\n recoverable = true;\n } else {\n const raw = Buffer.alloc(stats.size);\n let offset = 0;\n while (offset < raw.byteLength) {\n const bytesRead = fs.readSync(ownerHandle, raw, offset, raw.byteLength - offset, offset);\n if (bytesRead === 0) {\n recoverable = true;\n break;\n }\n offset += bytesRead;\n }\n if (offset === raw.byteLength) {\n JSON.parse(raw.toString(\"utf8\"));\n }\n }\n } catch (error) {\n recoverable = error instanceof SyntaxError;\n }\n try {\n fs.closeSync(ownerHandle);\n } catch {\n return false;\n }\n return recoverable;\n}\n\nfunction syntheticFreshStat(stats: fs.Stats): fs.Stats {\n const fresh = Object.assign(Object.create(Object.getPrototypeOf(stats)), stats) as fs.Stats;\n Object.defineProperty(fresh, \"mtime\", {\n configurable: true,\n enumerable: true,\n value: new Date(),\n });\n return fresh;\n}\n\nfunction syntheticStaleStat(stats: fs.Stats): fs.Stats {\n const stale = Object.assign(Object.create(Object.getPrototypeOf(stats)), stats) as fs.Stats;\n Object.defineProperty(stale, \"mtime\", {\n configurable: true,\n enumerable: true,\n value: new Date(0),\n });\n return stale;\n}\n\nfunction statMtimeMs(stats: { mtimeMs: bigint | number }): number {\n return typeof stats.mtimeMs === \"bigint\" ? Number(stats.mtimeMs) : stats.mtimeMs;\n}\n\nfunction isRecoverableOwnerlessClaim(stats: { mtimeMs: bigint | number }): boolean {\n return Date.now() - statMtimeMs(stats) >= OWNERLESS_LOCK_RECOVERY_MS;\n}\n\nfunction isRecoverableUnverifiableOwner(candidate: ParsedLockOwner, status: OwnerStatus): boolean {\n return (\n status === \"superseded\" &&\n candidate.owner.version === 1 &&\n (candidate.owner.processIdentity === null ||\n isCoarseDarwinIdentity(candidate.owner.processIdentity)) &&\n Date.now() - candidate.publishedAtMs >= OWNERLESS_LOCK_RECOVERY_MS\n );\n}\n\nfunction isRecoverableForeignOwner(\n candidate: ParsedLockOwner,\n status: OwnerStatus,\n stats: { mtimeMs: bigint | number },\n): boolean {\n return (\n status === \"foreign\" &&\n candidate.owner.version >= 2 &&\n Date.now() - statMtimeMs(stats) >= OWNERLESS_LOCK_RECOVERY_MS\n );\n}\n\nfunction isRecoverableUnknownOwner(\n candidate: ParsedLockOwner,\n status: OwnerStatus,\n stats: { mtimeMs: bigint | number },\n): boolean {\n return (\n status === \"unknown\" &&\n candidate.owner.version >= 2 &&\n candidate.owner.processIdentity !== null &&\n isExactProcessIdentity(candidate.owner.processIdentity) &&\n Date.now() - candidate.publishedAtMs >= OWNERLESS_LOCK_RECOVERY_MS &&\n Date.now() - statMtimeMs(stats) >= OWNERLESS_LOCK_RECOVERY_MS\n );\n}\n\nexport function createProcessOwnedLockFileSystem(\n options: {\n beforeDirectoryRemoval?: (directoryPath: string) => void;\n machineIdentityReader?: () => string | null;\n onDirectoryOwned?: (directoryPath: string, identity: { dev: bigint; ino: bigint }) => void;\n processIdentityReader?: (pid: number) => string | null;\n } = {},\n): typeof fs {\n if (\n process.platform !== \"linux\" &&\n process.platform !== \"darwin\" &&\n process.platform !== \"win32\"\n ) {\n return fs;\n }\n const token = randomUUID();\n const removeLockDirectorySync = (\n directoryPath: fs.PathLike,\n expectedIdentity: DirectoryIdentity,\n expectedMtimeMs?: bigint,\n afterClaim?: (directoryPath: string) => void,\n ): void => {\n removeVerifiedLockDirectorySync(\n directoryPath,\n expectedIdentity,\n expectedMtimeMs,\n options.beforeDirectoryRemoval,\n afterClaim,\n );\n };\n const identityReader = options.processIdentityReader ?? readProcessIdentity;\n let currentProcessIdentity: string | null;\n if (options.processIdentityReader) {\n currentProcessIdentity = readProcessIdentityWithRetry(process.pid, identityReader);\n } else {\n if (cachedCurrentProcessIdentity === undefined) {\n const currentIdentity = readProcessIdentityWithRetry(process.pid, identityReader);\n if (currentIdentity !== null) {\n cachedCurrentProcessIdentity = currentIdentity;\n }\n }\n currentProcessIdentity = cachedCurrentProcessIdentity ?? null;\n }\n if (\n currentProcessIdentity === null ||\n (!isExactProcessIdentity(currentProcessIdentity) &&\n !(process.platform === \"darwin\" && isCoarseDarwinIdentity(currentProcessIdentity)))\n ) {\n throw new Error(\"Recorder lock process identity is unavailable.\");\n }\n let currentMachineIdentity: string | null;\n if (options.machineIdentityReader) {\n currentMachineIdentity = options.machineIdentityReader();\n } else {\n if (cachedCurrentMachineIdentity === undefined) {\n const machineIdentity = readMachineIdentity();\n if (machineIdentity !== null) {\n cachedCurrentMachineIdentity = machineIdentity;\n }\n }\n currentMachineIdentity = cachedCurrentMachineIdentity ?? null;\n }\n if (currentMachineIdentity === null) {\n throw new Error(\"Recorder lock machine identity is unavailable.\");\n }\n const currentProcessNamespace = readProcessNamespaceWithRetry(process.pid);\n if (process.platform === \"linux\" && currentProcessNamespace === null) {\n throw new Error(\"Recorder lock process namespace is unavailable.\");\n }\n const ownedDirectories = new Map<string, DirectoryIdentity>();\n const interruptedPublicationIdentities = new Map<string, DirectoryIdentity>();\n let cachedForeignIdentity:\n | {\n checkedAt: number;\n ownerGenerationKey: string;\n identity: string | null;\n pid: number;\n startedAtMs: number | null;\n }\n | undefined;\n const owner: LockOwner = {\n executionIdentity: CURRENT_EXECUTION_IDENTITY,\n machineIdentity: currentMachineIdentity,\n pid: process.pid,\n processIdentity: currentProcessIdentity,\n processNamespace: currentProcessNamespace,\n processStartedAtMs: CURRENT_PROCESS_STARTED_AT_MS,\n token,\n version: isExactProcessIdentity(currentProcessIdentity) ? 4 : 1,\n };\n\n const publishOwner = (directory: string): void => {\n const ownerPath = path.join(directory, OWNER_FILE);\n let ownerHandle: number | undefined;\n let openedIdentity: fs.BigIntStats | undefined;\n try {\n ownerHandle = fs.openSync(\n ownerPath,\n fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL,\n 0o600,\n );\n openedIdentity = fs.fstatSync(ownerHandle, { bigint: true });\n const contents = Buffer.from(`${JSON.stringify(owner)}\\n`);\n let offset = 0;\n while (offset < contents.byteLength) {\n const written = fs.writeSync(\n ownerHandle,\n contents,\n offset,\n contents.byteLength - offset,\n offset,\n );\n if (written === 0) {\n throw new Error(\"Recorder lock owner publication made no progress.\");\n }\n offset += written;\n }\n fs.closeSync(ownerHandle);\n ownerHandle = undefined;\n } catch (error) {\n if (openedIdentity !== undefined) {\n try {\n const current = fs.lstatSync(ownerPath, { bigint: true });\n if (openedIdentity.dev === current.dev && openedIdentity.ino === current.ino) {\n fs.unlinkSync(ownerPath);\n }\n } catch {\n // Preserve a replacement path that cannot be proven to be ours.\n }\n }\n throw error;\n } finally {\n if (ownerHandle !== undefined) {\n try {\n fs.closeSync(ownerHandle);\n } catch {\n // Preserve the publication error already being reported.\n }\n }\n }\n };\n\n const abandonOwner = (directory: string): boolean => {\n abandonedOwnerKeys.add(abandonedOwnerKey(directory, token));\n const published = publishAbandonedOwnerMarker(directory, token);\n const coordinationKey = canonicalLockDirectoryPath(directory);\n const ownedIdentity = ownedDirectories.get(coordinationKey);\n if (!ownedIdentity) {\n return published;\n }\n try {\n const current = fs.lstatSync(directory, { bigint: true });\n if (current.isDirectory() && directoryIdentityMatches(ownedIdentity, current)) {\n abandonedDirectoryIdentities.set(coordinationKey, {\n ...ownedIdentity,\n ownerGenerationKey: token,\n });\n }\n } catch {\n // The path no longer names the directory published by this wrapper.\n }\n return published;\n };\n\n const ownerStatus = (\n candidate: ParsedLockOwner | null | undefined,\n forceIdentityRefresh = false,\n ): OwnerStatus => {\n if (!candidate) {\n return \"unknown\";\n }\n const claim = candidate.owner;\n if (\n abandonedOwnerKeys.has(abandonedOwnerKey(candidate.lockDirectory, claim.token)) ||\n hasAbandonedOwnerMarker(candidate)\n ) {\n return \"dead\";\n }\n if (\n claim.version >= 3 &&\n claim.machineIdentity !== null &&\n claim.machineIdentity !== currentMachineIdentity\n ) {\n return \"foreign\";\n }\n if (\n process.platform === \"linux\" &&\n claim.version >= 2 &&\n (claim.processNamespace === null ||\n currentProcessNamespace === null ||\n claim.processNamespace !== currentProcessNamespace)\n ) {\n return \"foreign\";\n }\n if (claim.version === 2 && (process.platform === \"darwin\" || process.platform === \"win32\")) {\n return \"foreign\";\n }\n if (!isProcessAlive(claim.pid)) {\n if (process.platform === \"linux\" && claim.version === 1 && claim.processNamespace === null) {\n return \"unknown\";\n }\n return \"dead\";\n }\n if (isDefunctProcess(claim.pid)) {\n return \"dead\";\n }\n if (claim.pid === process.pid) {\n if (claim.processIdentity !== null && isExactProcessIdentity(claim.processIdentity)) {\n if (claim.processIdentity !== currentProcessIdentity) {\n return \"dead\";\n }\n return claim.version === 4 &&\n claim.executionIdentity !== null &&\n claim.executionIdentity !== CURRENT_EXECUTION_IDENTITY\n ? \"foreign\"\n : \"active\";\n }\n if (claim.processStartedAtMs !== CURRENT_PROCESS_STARTED_AT_MS) {\n return \"superseded\";\n }\n return claim.executionIdentity !== null &&\n claim.executionIdentity !== CURRENT_EXECUTION_IDENTITY\n ? \"superseded\"\n : \"active\";\n }\n const now = Date.now();\n if (\n forceIdentityRefresh ||\n !cachedForeignIdentity ||\n cachedForeignIdentity.pid !== claim.pid ||\n cachedForeignIdentity.ownerGenerationKey !== claim.token ||\n now - cachedForeignIdentity.checkedAt >= IDENTITY_CACHE_MS\n ) {\n const observedIdentity = identityReader(claim.pid);\n cachedForeignIdentity = {\n checkedAt: now,\n identity: observedIdentity,\n ownerGenerationKey: claim.token,\n pid: claim.pid,\n startedAtMs:\n processStartedAtMsFromIdentity(observedIdentity) ??\n readLegacyProcessStartedAtMs(claim.pid),\n };\n }\n if (\n claim.processIdentity === null ||\n isCoarseDarwinIdentity(claim.processIdentity) ||\n !isExactProcessIdentity(claim.processIdentity)\n ) {\n if (claim.version !== 1 || cachedForeignIdentity.startedAtMs === null) {\n return \"unknown\";\n }\n return legacyProcessStartMatches(claim.processStartedAtMs, cachedForeignIdentity.startedAtMs)\n ? \"active\"\n : \"superseded\";\n }\n if (cachedForeignIdentity.identity === null) {\n return \"unknown\";\n }\n if (process.platform === \"darwin\" && isCoarseDarwinIdentity(cachedForeignIdentity.identity)) {\n return cachedForeignIdentity.startedAtMs === null\n ? \"unknown\"\n : legacyProcessStartMatches(claim.processStartedAtMs, cachedForeignIdentity.startedAtMs)\n ? \"active\"\n : \"superseded\";\n }\n return cachedForeignIdentity.identity === claim.processIdentity ? \"active\" : \"dead\";\n };\n\n const createRecoveryClaim = (\n claimPath: string,\n callback: (error: NodeJS.ErrnoException | null, claim?: RecoveryClaim) => void,\n ): void => {\n fs.mkdir(claimPath, { mode: 0o700 }, (claimError) => {\n if (!claimError) {\n let createdIdentity: DirectoryIdentity | undefined;\n try {\n const created = fs.lstatSync(claimPath, { bigint: true });\n if (!created.isDirectory() || created.isSymbolicLink()) {\n throw lockCleanupError(\"Recorder lock recovery claim changed during creation.\");\n }\n createdIdentity = directoryIdentity(created);\n publishOwner(claimPath);\n const published = verifiedLockDirectoryStats(claimPath, createdIdentity);\n if (!published) {\n throw lockCleanupError(\"Recorder lock recovery claim disappeared during publication.\");\n }\n callback(null, {\n activeIdentity: directoryIdentity(published),\n activePath: claimPath,\n ownerGenerationKey: token,\n supersededPaths: [],\n });\n } catch (ownerError) {\n if (createdIdentity) {\n try {\n removeLockDirectorySync(claimPath, createdIdentity);\n } catch {\n // Preserve an unverified replacement instead of deleting it by pathname.\n }\n }\n callback(ownerError as NodeJS.ErrnoException);\n }\n return;\n }\n if (claimError.code !== \"EEXIST\") {\n callback(claimError);\n return;\n }\n let existingFingerprint: string | undefined;\n let existingIdentity: SupersededRecoveryClaim[\"identity\"] | undefined;\n let existingOwnerFingerprint: string | undefined;\n try {\n const initialStats = fs.lstatSync(claimPath, { bigint: true });\n if (initialStats.isDirectory() && !initialStats.isSymbolicLink()) {\n const initialIdentity = directoryIdentity(initialStats);\n const existingClaim = parseOwner(claimPath);\n const stats = verifiedLockDirectoryStats(\n claimPath,\n initialIdentity,\n initialStats.mtimeMs,\n );\n if (!stats) {\n throw lockCleanupError(\"Recorder lock recovery claim disappeared during inspection.\");\n }\n if (existingClaim) {\n const status = ownerStatus(existingClaim);\n const recoverableForeign =\n status === \"foreign\" && isRecoverableForeignOwner(existingClaim, status, stats);\n const recoverableUnverifiable = isRecoverableUnverifiableOwner(existingClaim, status);\n const recoverableUnknown =\n isRecoverableUnknownOwner(existingClaim, status, stats) &&\n isRecoverableUnknownOwner(existingClaim, ownerStatus(existingClaim, true), stats);\n if (\n status === \"dead\" ||\n recoverableForeign ||\n recoverableUnverifiable ||\n recoverableUnknown\n ) {\n existingFingerprint = `owner:${existingClaim.owner.token}`;\n existingOwnerFingerprint = existingFingerprint;\n }\n } else if (isRecoverableOwnerlessClaim(stats)) {\n existingOwnerFingerprint = existingClaim === undefined ? \"ownerless\" : \"malformed\";\n existingFingerprint = `${existingOwnerFingerprint}:${stats.dev}:${stats.ino}:${stats.mtimeMs}`;\n }\n if (existingFingerprint) {\n existingIdentity = {\n ...directoryIdentity(stats),\n mtimeMs: stats.mtimeMs,\n };\n }\n }\n } catch {\n // Treat a concurrently changing claim as active.\n }\n if (!existingFingerprint || !existingIdentity || !existingOwnerFingerprint) {\n callback(\n Object.assign(new Error(\"Recorder lock recovery is already in progress.\"), {\n code: \"ELOCKED\",\n }),\n );\n return;\n }\n const takeoverPath = recoveryClaimPath(claimPath, existingFingerprint);\n createRecoveryClaim(takeoverPath, (takeoverError, takeoverClaim) => {\n if (takeoverError || !takeoverClaim) {\n callback(\n takeoverError ??\n Object.assign(new Error(\"Recorder lock recovery claim failed.\"), {\n code: \"ELOCKED\",\n }),\n );\n } else {\n callback(null, {\n activeIdentity: takeoverClaim.activeIdentity,\n activePath: takeoverClaim.activePath,\n ownerGenerationKey: takeoverClaim.ownerGenerationKey,\n supersededPaths: [\n {\n identity: existingIdentity,\n ownerFingerprint: existingOwnerFingerprint,\n path: claimPath,\n },\n ...takeoverClaim.supersededPaths,\n ],\n });\n }\n });\n });\n };\n\n const releaseRecoveryClaim = (\n directory: string,\n claim: RecoveryClaim,\n callback: () => void,\n ): void => {\n const coordinationKey = canonicalLockDirectoryPath(directory);\n // Retire nested takeover paths before the base claim so any failure leaves\n // the active claim discoverable through the original coordination path.\n const supersededPaths = [...claim.supersededPaths].reverse();\n let removedSupersededPath = false;\n const removeActiveClaim = (): void => {\n let activeError: NodeJS.ErrnoException | null = null;\n try {\n removeLockDirectorySync(\n claim.activePath,\n claim.activeIdentity,\n undefined,\n (claimedPath) => {\n claim.activePath = claimedPath;\n },\n );\n } catch (error) {\n activeError = error as NodeJS.ErrnoException;\n }\n if (activeError && !abandonOwner(claim.activePath)) {\n retainedCoordinationClaims.set(coordinationKey, {\n claim,\n retainedByToken: token,\n });\n }\n callback();\n };\n const preserveActiveClaim = (): void => {\n if (!abandonOwner(claim.activePath)) {\n retainedCoordinationClaims.set(coordinationKey, {\n claim,\n retainedByToken: token,\n });\n }\n callback();\n };\n const removeSuperseded = (index: number): void => {\n const superseded = supersededPaths[index];\n if (!superseded) {\n removeActiveClaim();\n return;\n }\n let current: fs.BigIntStats | undefined;\n try {\n current = verifiedLockDirectoryStats(\n superseded.path,\n superseded.identity,\n superseded.identity.mtimeMs,\n );\n } catch {\n if (!removedSupersededPath) {\n preserveActiveClaim();\n return;\n }\n removeActiveClaim();\n return;\n }\n if (!current) {\n removedSupersededPath = true;\n removeSuperseded(index + 1);\n return;\n }\n const currentOwner = parseOwner(superseded.path);\n try {\n current = verifiedLockDirectoryStats(\n superseded.path,\n superseded.identity,\n superseded.identity.mtimeMs,\n );\n } catch {\n if (!removedSupersededPath) {\n preserveActiveClaim();\n return;\n }\n removeActiveClaim();\n return;\n }\n if (!current) {\n removedSupersededPath = true;\n removeSuperseded(index + 1);\n return;\n }\n const currentFingerprint = currentOwner\n ? `owner:${currentOwner.owner.token}`\n : currentOwner === undefined\n ? \"ownerless\"\n : \"malformed\";\n if (currentFingerprint !== superseded.ownerFingerprint) {\n if (!removedSupersededPath) {\n preserveActiveClaim();\n return;\n }\n removeActiveClaim();\n return;\n }\n try {\n removeLockDirectorySync(superseded.path, superseded.identity, superseded.identity.mtimeMs);\n } catch {\n if (!removedSupersededPath) {\n preserveActiveClaim();\n return;\n }\n removeActiveClaim();\n return;\n }\n removedSupersededPath = true;\n removeSuperseded(index + 1);\n };\n removeSuperseded(0);\n };\n\n const acquireCoordinationClaim = (\n directory: string,\n callback: (error: NodeJS.ErrnoException | null, claim?: RecoveryClaim) => void,\n ): void => {\n const coordinationKey = canonicalLockDirectoryPath(directory);\n const retained = retainedCoordinationClaims.get(coordinationKey);\n if (retained) {\n if (retained.retainedByToken !== token && !ownedDirectories.has(coordinationKey)) {\n callback(lockCleanupError(\"Recorder lock retained coordination claim is owned elsewhere.\"));\n return;\n }\n const { claim: retainedClaim } = retained;\n let retainedClaimIsOwned = false;\n try {\n const current = verifiedLockDirectoryStats(\n retainedClaim.activePath,\n retainedClaim.activeIdentity,\n );\n const retainedOwner = current ? parseOwner(retainedClaim.activePath) : undefined;\n retainedClaimIsOwned =\n retainedOwner !== undefined &&\n retainedOwner !== null &&\n retainedOwner.owner.token === retainedClaim.ownerGenerationKey &&\n ownerStatus(retainedOwner) === \"active\";\n } catch {\n retainedClaimIsOwned = false;\n }\n if (retainedClaimIsOwned) {\n if (retainedCoordinationClaims.get(coordinationKey) === retained) {\n retainedCoordinationClaims.delete(coordinationKey);\n }\n callback(null, retainedClaim);\n return;\n }\n if (retainedCoordinationClaims.get(coordinationKey) === retained) {\n retainedCoordinationClaims.delete(coordinationKey);\n }\n }\n createRecoveryClaim(recoveryClaimPath(directory), callback);\n };\n\n const lockFs = Object.create(fs) as typeof fs;\n lockFs.mkdir = ((\n directoryPath: fs.PathLike,\n callback: (error: NodeJS.ErrnoException | null) => void,\n ) => {\n const directory = String(directoryPath);\n acquireCoordinationClaim(directory, (claimError, coordinationClaim) => {\n if (claimError || !coordinationClaim) {\n callback(\n claimError ??\n Object.assign(new Error(\"Recorder lock coordination failed.\"), {\n code: \"ELOCKED\",\n }),\n );\n return;\n }\n fs.mkdir(directoryPath, (error) => {\n if (error) {\n if (error.code === \"EEXIST\" && coordinationClaim.supersededPaths.length > 0) {\n try {\n const existing = fs.lstatSync(directoryPath, { bigint: true });\n const candidate = parseOwner(directoryPath);\n if (\n existing.isDirectory() &&\n !existing.isSymbolicLink() &&\n (candidate === undefined || candidate === null)\n ) {\n const coordinationKey = canonicalLockDirectoryPath(directory);\n interruptedPublicationIdentities.set(coordinationKey, directoryIdentity(existing));\n retainedCoordinationClaims.set(coordinationKey, {\n claim: coordinationClaim,\n retainedByToken: token,\n });\n callback(error);\n return;\n }\n } catch {\n // Fall through to normal cleanup for a changing target.\n }\n }\n releaseRecoveryClaim(directory, coordinationClaim, () => callback(error));\n return;\n }\n let createdIdentity: DirectoryIdentity | undefined;\n let ownerPublished = false;\n let publicationError: NodeJS.ErrnoException | null = null;\n try {\n const createdDirectory = fs.lstatSync(directoryPath, { bigint: true });\n if (!createdDirectory.isDirectory() || createdDirectory.isSymbolicLink()) {\n throw new Error(\"Recorder lock directory changed during creation.\");\n }\n const candidateIdentity = directoryIdentity(createdDirectory);\n const createdEntries = fs.readdirSync(directoryPath);\n if (\n createdEntries.length > 0 ||\n !verifiedLockDirectoryStats(directoryPath, candidateIdentity)\n ) {\n throw lockCleanupError(\"Recorder lock directory changed during creation.\");\n }\n createdIdentity = candidateIdentity;\n publishOwner(directory);\n ownerPublished = true;\n const publishedDirectory = verifiedLockDirectoryStats(directory, createdIdentity);\n if (!publishedDirectory) {\n throw new Error(\"Recorder lock directory changed during owner publication.\");\n }\n const publishedIdentity = directoryIdentity(publishedDirectory);\n options.onDirectoryOwned?.(directory, { ...publishedIdentity });\n ownedDirectories.set(canonicalLockDirectoryPath(directory), publishedIdentity);\n interruptedPublicationIdentities.delete(canonicalLockDirectoryPath(directory));\n } catch (ownerError) {\n publicationError = ownerError as NodeJS.ErrnoException;\n }\n if (publicationError) {\n if (ownerPublished && createdIdentity) {\n try {\n if (verifiedLockDirectoryStats(directory, createdIdentity)) {\n abandonOwner(directory);\n }\n } catch {\n // Preserve an unverified replacement instead of mutating it by pathname.\n }\n } else if (createdIdentity) {\n try {\n removeLockDirectorySync(directoryPath, createdIdentity);\n } catch {\n // Preserve an unverified replacement instead of deleting it by pathname.\n }\n }\n releaseRecoveryClaim(directory, coordinationClaim, () => callback(publicationError));\n return;\n }\n releaseRecoveryClaim(directory, coordinationClaim, () => callback(null));\n });\n });\n }) as typeof fs.mkdir;\n lockFs.stat = ((\n filePath: fs.PathLike,\n callback: (error: NodeJS.ErrnoException | null, stats?: fs.Stats) => void,\n ) => {\n fs.stat(filePath, (error, stats) => {\n if (error) {\n callback(error);\n return;\n }\n const coordinationKey = canonicalLockDirectoryPath(filePath);\n let identityStats: fs.BigIntStats | undefined;\n try {\n const current = fs.lstatSync(filePath, { bigint: true });\n if (current.isDirectory() && !current.isSymbolicLink()) {\n identityStats = current;\n }\n } catch {\n // A changing path cannot match an identity-based recovery fence.\n }\n if (\n identityStats &&\n directoryIdentityMatches(abandonedDirectoryIdentities.get(coordinationKey), identityStats)\n ) {\n callback(null, syntheticStaleStat(stats));\n return;\n }\n const candidate = parseOwner(filePath);\n const status = ownerStatus(candidate);\n if (candidate !== undefined && candidate !== null) {\n interruptedPublicationIdentities.delete(coordinationKey);\n }\n const recoverableInterruptedPublication =\n (candidate === undefined || candidate === null) &&\n identityStats !== undefined &&\n directoryIdentityMatches(\n interruptedPublicationIdentities.get(coordinationKey),\n identityStats,\n ) &&\n Date.now() - stats.mtimeMs >= OWNERLESS_LOCK_RECOVERY_MS;\n const recoverableAgedUnverifiableOwner =\n isRecoverableOwnerlessClaim(stats) &&\n (candidate === undefined || (candidate === null && hasRecoverableMalformedOwner(filePath)));\n const recoverableForeign =\n candidate !== undefined &&\n candidate !== null &&\n isRecoverableForeignOwner(candidate, status, stats);\n const recoverableUnknown =\n candidate !== undefined &&\n candidate !== null &&\n isRecoverableUnknownOwner(candidate, status, stats);\n if (\n candidate &&\n abandonedOwnerKeys.has(abandonedOwnerKey(candidate.lockDirectory, candidate.owner.token))\n ) {\n callback(null, syntheticStaleStat(stats));\n return;\n }\n if (candidate && hasAbandonedOwnerMarker(candidate)) {\n callback(null, syntheticStaleStat(stats));\n return;\n }\n callback(\n null,\n candidate?.owner.token === token ||\n status === \"dead\" ||\n recoverableForeign ||\n recoverableUnknown ||\n recoverableInterruptedPublication ||\n recoverableAgedUnverifiableOwner ||\n (candidate !== undefined &&\n candidate !== null &&\n isRecoverableUnverifiableOwner(candidate, status))\n ? stats\n : syntheticFreshStat(stats),\n );\n });\n }) as typeof fs.stat;\n lockFs.rmdir = ((\n directoryPath: fs.PathLike,\n callback: (error: NodeJS.ErrnoException | null) => void,\n ) => {\n const directory = String(directoryPath);\n const coordinationKey = canonicalLockDirectoryPath(directory);\n const releaseDeadline = Date.now() + COORDINATION_RELEASE_WAIT_MS;\n const acquireForRemoval = (): void => {\n acquireCoordinationClaim(directory, (claimError, coordinationClaim) => {\n if (\n claimError?.code === \"ELOCKED\" &&\n ownedDirectories.has(coordinationKey) &&\n Date.now() < releaseDeadline\n ) {\n setTimeout(acquireForRemoval, COORDINATION_RELEASE_RETRY_MS);\n return;\n }\n if (claimError || !coordinationClaim) {\n if (ownedDirectories.has(coordinationKey)) {\n abandonOwner(directory);\n }\n callback(\n claimError ??\n Object.assign(new Error(\"Recorder lock coordination failed.\"), {\n code: \"ELOCKED\",\n }),\n );\n return;\n }\n const finish = (error: NodeJS.ErrnoException | null): void => {\n releaseRecoveryClaim(directory, coordinationClaim, () => callback(error));\n };\n const candidate = parseOwner(directoryPath);\n let initialStats: fs.BigIntStats;\n try {\n initialStats = fs.lstatSync(directoryPath, { bigint: true });\n if (!initialStats.isDirectory() || initialStats.isSymbolicLink()) {\n throw lockCleanupError(\"Recorder lock recovery target is not a directory.\");\n }\n } catch (error) {\n const pathError = error as NodeJS.ErrnoException;\n finish(\n pathError.code === \"ENOENT\" && ownedDirectories.has(coordinationKey)\n ? lockCleanupError(\"Recorder lock owned release target disappeared.\")\n : pathError,\n );\n return;\n }\n if (candidate !== undefined && candidate !== null) {\n interruptedPublicationIdentities.delete(coordinationKey);\n }\n const ownedIdentity = ownedDirectories.get(coordinationKey);\n const ownsPublishedDirectory = directoryIdentityMatches(ownedIdentity, initialStats);\n if (\n (candidate?.owner.token === token && ownsPublishedDirectory) ||\n ((candidate === null || candidate === undefined) && ownsPublishedDirectory)\n ) {\n const tombstonePath = `${coordinationClaim.activePath}.${token}.release`;\n fs.rename(directoryPath, tombstonePath, (renameError) => {\n if (renameError) {\n abandonOwner(directory);\n finish(renameError);\n return;\n }\n if (\n !renamedDirectoryMatches(tombstonePath, directory, directoryIdentity(initialStats))\n ) {\n finish(lockCleanupError(\"Recorder lock release displaced a replacement directory.\"));\n return;\n }\n ownedDirectories.delete(coordinationKey);\n abandonedDirectoryIdentities.delete(coordinationKey);\n abandonedOwnerKeys.delete(abandonedOwnerKey(directory, token));\n try {\n removeLockDirectorySync(tombstonePath, directoryIdentity(initialStats));\n finish(null);\n } catch (error) {\n finish(error as NodeJS.ErrnoException);\n }\n });\n return;\n }\n if (candidate === null && ownedDirectories.has(coordinationKey)) {\n abandonOwner(directory);\n finish(\n Object.assign(\n new Error(\"Recorder lock owner metadata cannot be verified for release.\"),\n {\n code: \"ELOCKED\",\n },\n ),\n );\n return;\n }\n let ownerlessStats: fs.BigIntStats | undefined;\n let foreignStats: fs.BigIntStats | undefined;\n let recoverableAbandoned = false;\n let recoverableInterruptedPublication = false;\n let recoverableAgedUnverifiableOwner = false;\n const status = ownerStatus(candidate);\n const recoverableUnverifiable =\n candidate !== undefined &&\n candidate !== null &&\n isRecoverableUnverifiableOwner(candidate, status);\n const recoverableForeign =\n candidate !== undefined &&\n candidate !== null &&\n isRecoverableForeignOwner(candidate, status, initialStats);\n const recoverableUnknown =\n candidate !== undefined &&\n candidate !== null &&\n isRecoverableUnknownOwner(candidate, status, initialStats);\n if (recoverableForeign) {\n foreignStats = initialStats;\n }\n if (candidate === undefined || candidate === null) {\n ownerlessStats = initialStats;\n recoverableAbandoned = directoryIdentityMatches(\n abandonedDirectoryIdentities.get(coordinationKey),\n ownerlessStats,\n );\n recoverableInterruptedPublication =\n directoryIdentityMatches(\n interruptedPublicationIdentities.get(coordinationKey),\n ownerlessStats,\n ) && Date.now() - statMtimeMs(ownerlessStats) >= OWNERLESS_LOCK_RECOVERY_MS;\n recoverableAgedUnverifiableOwner =\n isRecoverableOwnerlessClaim(ownerlessStats) &&\n (candidate === undefined ||\n (candidate === null && hasRecoverableMalformedOwner(directoryPath)));\n }\n if (\n status !== \"dead\" &&\n !recoverableForeign &&\n !recoverableUnknown &&\n !recoverableUnverifiable &&\n !recoverableAbandoned &&\n !recoverableInterruptedPublication &&\n !recoverableAgedUnverifiableOwner\n ) {\n finish(\n Object.assign(new Error(\"Recorder lock owner is still active or cannot be verified.\"), {\n code: \"ELOCKED\",\n }),\n );\n return;\n }\n const refreshed = parseOwner(directoryPath);\n const refreshedStatus = ownerStatus(refreshed, recoverableUnknown);\n let refreshedStats: fs.BigIntStats | undefined;\n try {\n const current = fs.lstatSync(directoryPath, { bigint: true });\n if (\n current.isDirectory() &&\n !current.isSymbolicLink() &&\n current.dev === initialStats.dev &&\n current.ino === initialStats.ino &&\n current.mtimeMs === initialStats.mtimeMs\n ) {\n refreshedStats = current;\n }\n } catch {\n // A changed recovery target fails authorization below.\n }\n let recoveryStillAuthorized =\n candidate !== undefined &&\n candidate !== null &&\n refreshedStats !== undefined &&\n lockOwnerMatches(candidate, refreshed) &&\n (refreshedStatus === \"dead\" ||\n (recoverableForeign &&\n refreshed !== undefined &&\n refreshed !== null &&\n foreignStats !== undefined &&\n refreshedStats.dev === foreignStats.dev &&\n refreshedStats.ino === foreignStats.ino &&\n refreshedStats.mtimeMs === foreignStats.mtimeMs &&\n isRecoverableForeignOwner(refreshed, refreshedStatus, refreshedStats)) ||\n (recoverableUnknown &&\n refreshed !== undefined &&\n refreshed !== null &&\n isRecoverableUnknownOwner(refreshed, refreshedStatus, refreshedStats)) ||\n (refreshed !== undefined &&\n refreshed !== null &&\n isRecoverableUnverifiableOwner(refreshed, refreshedStatus)));\n if (recoverableAbandoned && ownerlessStats) {\n try {\n recoveryStillAuthorized =\n refreshedStats !== undefined &&\n directoryIdentityMatches(\n abandonedDirectoryIdentities.get(coordinationKey),\n refreshedStats,\n );\n } catch {\n recoveryStillAuthorized = false;\n }\n }\n if (recoverableInterruptedPublication && ownerlessStats) {\n try {\n recoveryStillAuthorized =\n refreshedStats !== undefined &&\n refreshed === undefined &&\n refreshedStats.dev === ownerlessStats.dev &&\n refreshedStats.ino === ownerlessStats.ino &&\n refreshedStats.mtimeMs === ownerlessStats.mtimeMs &&\n directoryIdentityMatches(\n interruptedPublicationIdentities.get(coordinationKey),\n refreshedStats,\n ) &&\n Date.now() - statMtimeMs(refreshedStats) >= OWNERLESS_LOCK_RECOVERY_MS;\n } catch {\n recoveryStillAuthorized = false;\n }\n }\n if (recoverableAgedUnverifiableOwner && ownerlessStats) {\n try {\n recoveryStillAuthorized =\n refreshedStats !== undefined &&\n (candidate === undefined ? refreshed === undefined : refreshed === null) &&\n (candidate !== null || hasRecoverableMalformedOwner(directoryPath)) &&\n refreshedStats.dev === ownerlessStats.dev &&\n refreshedStats.ino === ownerlessStats.ino &&\n refreshedStats.mtimeMs === ownerlessStats.mtimeMs &&\n isRecoverableOwnerlessClaim(refreshedStats);\n } catch {\n recoveryStillAuthorized = false;\n }\n }\n if (!recoveryStillAuthorized) {\n finish(\n Object.assign(new Error(\"Recorder lock owner changed during recovery.\"), {\n code: \"ELOCKED\",\n }),\n );\n return;\n }\n const tombstonePath = `${coordinationClaim.activePath}.${token}.lock`;\n fs.rename(directoryPath, tombstonePath, (renameError) => {\n if (renameError) {\n finish(renameError);\n return;\n }\n if (!renamedDirectoryMatches(tombstonePath, directory, directoryIdentity(initialStats))) {\n finish(lockCleanupError(\"Recorder lock recovery displaced a replacement directory.\"));\n return;\n }\n try {\n removeLockDirectorySync(tombstonePath, directoryIdentity(initialStats));\n if (candidate) {\n abandonedOwnerKeys.delete(\n abandonedOwnerKey(candidate.lockDirectory, candidate.owner.token),\n );\n }\n interruptedPublicationIdentities.delete(coordinationKey);\n const abandonedIdentity = abandonedDirectoryIdentities.get(coordinationKey);\n if (abandonedIdentity) {\n abandonedOwnerKeys.delete(\n abandonedOwnerKey(directory, abandonedIdentity.ownerGenerationKey),\n );\n abandonedDirectoryIdentities.delete(coordinationKey);\n }\n retainedCoordinationClaims.set(canonicalLockDirectoryPath(directory), {\n claim: coordinationClaim,\n retainedByToken: token,\n });\n callback(null);\n } catch (error) {\n finish(error as NodeJS.ErrnoException);\n }\n });\n });\n };\n acquireForRemoval();\n }) as typeof fs.rmdir;\n lockFs.rmdirSync = ((directoryPath: fs.PathLike) => {\n const directory = String(directoryPath);\n const claimPath = recoveryClaimPath(directory);\n fs.mkdirSync(claimPath, { mode: 0o700 });\n const createdClaim = fs.lstatSync(claimPath, { bigint: true });\n if (!createdClaim.isDirectory() || createdClaim.isSymbolicLink()) {\n throw lockCleanupError(\"Recorder lock recovery claim changed during creation.\");\n }\n const coordinationClaim: RecoveryClaim = {\n activeIdentity: directoryIdentity(createdClaim),\n activePath: claimPath,\n ownerGenerationKey: token,\n supersededPaths: [],\n };\n try {\n publishOwner(claimPath);\n if (!verifiedLockDirectoryStats(claimPath, coordinationClaim.activeIdentity)) {\n throw lockCleanupError(\"Recorder lock recovery claim disappeared during publication.\");\n }\n const candidate = parseOwner(directoryPath);\n if (candidate?.owner.token !== token) {\n throw Object.assign(new Error(\"Recorder lock is not owned by this process.\"), {\n code: \"ELOCKED\",\n });\n }\n const ownedIdentity = ownedDirectories.get(canonicalLockDirectoryPath(directory));\n const ownedDirectory = fs.lstatSync(directoryPath, { bigint: true });\n if (\n !ownedDirectory.isDirectory() ||\n ownedDirectory.isSymbolicLink() ||\n !directoryIdentityMatches(ownedIdentity, ownedDirectory)\n ) {\n throw lockCleanupError(\"Recorder lock ownership changed before release.\");\n }\n const tombstonePath = `${claimPath}.${token}.release`;\n fs.renameSync(directoryPath, tombstonePath);\n if (!renamedDirectoryMatches(tombstonePath, directory, directoryIdentity(ownedDirectory))) {\n throw lockCleanupError(\"Recorder lock release displaced a replacement directory.\");\n }\n removeLockDirectorySync(tombstonePath, directoryIdentity(ownedDirectory));\n ownedDirectories.delete(canonicalLockDirectoryPath(directory));\n } finally {\n try {\n removeLockDirectorySync(coordinationClaim.activePath, coordinationClaim.activeIdentity);\n } catch {\n // Exit cleanup is best-effort; a live coordination claim is safer than an ABA race.\n }\n }\n }) as typeof fs.rmdirSync;\n return lockFs;\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function isManagedRecorderDirectory(directory: string, platform?: NodeJS.Platform): boolean;
@@ -0,0 +1,14 @@
1
+ import path from "node:path";
2
+ export function isManagedRecorderDirectory(directory, platform = process.platform) {
3
+ const resolved = path.resolve(directory);
4
+ const managedDirectories = [
5
+ path.resolve(".crabline", "servers"),
6
+ path.resolve("artifacts", "crabline"),
7
+ ];
8
+ if (platform !== "win32") {
9
+ return managedDirectories.includes(resolved);
10
+ }
11
+ const key = path.win32.normalize(resolved).toLowerCase();
12
+ return managedDirectories.some((candidate) => path.win32.normalize(candidate).toLowerCase() === key);
13
+ }
14
+ //# sourceMappingURL=recorder-directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder-directory.js","sourceRoot":"","sources":["../../../src/platform/recorder-directory.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,0BAA0B,CACxC,SAAiB,EACjB,QAAQ,GAAoB,OAAO,CAAC,QAAQ;IAE5C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,kBAAkB,GAAG;QACzB,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC;KACtC,CAAC;IACF,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACzD,OAAO,kBAAkB,CAAC,IAAI,CAC5B,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG,CACrE,CAAC;AACJ,CAAC","sourcesContent":["import path from \"node:path\";\n\nexport function isManagedRecorderDirectory(\n directory: string,\n platform: NodeJS.Platform = process.platform,\n): boolean {\n const resolved = path.resolve(directory);\n const managedDirectories = [\n path.resolve(\".crabline\", \"servers\"),\n path.resolve(\"artifacts\", \"crabline\"),\n ];\n if (platform !== \"win32\") {\n return managedDirectories.includes(resolved);\n }\n const key = path.win32.normalize(resolved).toLowerCase();\n return managedDirectories.some(\n (candidate) => path.win32.normalize(candidate).toLowerCase() === key,\n );\n}\n"]}
@@ -0,0 +1,18 @@
1
+ export type WindowsAclRunner = (command: string, args: string[], options: {
2
+ env: NodeJS.ProcessEnv;
3
+ killSignal: NodeJS.Signals;
4
+ timeout: number;
5
+ windowsHide: boolean;
6
+ }) => Promise<string>;
7
+ export type WindowsDirectorySecuritySnapshot = {
8
+ identity: string;
9
+ pathIdentity: string;
10
+ securityDescriptor: string;
11
+ };
12
+ export declare function resolveWindowsPowerShellPath(systemRoot: string | null | undefined): string;
13
+ export declare function applyOwnerOnlyWindowsDirectoryAcl(directoryPath: string, run?: WindowsAclRunner, systemRoot?: string | null | undefined): Promise<void>;
14
+ export declare function createOwnerOnlyWindowsDirectoryAncestry(directoryPath: string, run?: WindowsAclRunner, systemRoot?: string | null | undefined): Promise<string | undefined>;
15
+ export declare function createOwnerOnlyWindowsDirectory(directoryPath: string, run?: WindowsAclRunner, systemRoot?: string | null | undefined): Promise<void>;
16
+ export declare function readWindowsDirectorySecuritySnapshot(directoryPath: string, run?: WindowsAclRunner, systemRoot?: string | null | undefined): Promise<WindowsDirectorySecuritySnapshot>;
17
+ export declare function readWindowsDirectoryNamespaceSecuritySnapshot(directoryPath: string, run?: WindowsAclRunner, systemRoot?: string | null | undefined): Promise<WindowsDirectorySecuritySnapshot>;
18
+ export declare function readWindowsDirectorySecurityDescriptor(directoryPath: string, run?: WindowsAclRunner, systemRoot?: string | null | undefined): Promise<string>;