@openclaw/crabline 0.1.11 → 0.1.12

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 (197) hide show
  1. package/README.md +99 -12
  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 +264 -50
  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/matrix-ids.d.ts +5 -0
  31. package/dist/src/matrix-ids.js +83 -0
  32. package/dist/src/matrix-ids.js.map +1 -0
  33. package/dist/src/openclaw/artifact-generation.d.ts +7 -2
  34. package/dist/src/openclaw/artifact-generation.js +399 -27
  35. package/dist/src/openclaw/artifact-generation.js.map +1 -1
  36. package/dist/src/openclaw/bridges/matrix.js +21 -4
  37. package/dist/src/openclaw/bridges/matrix.js.map +1 -1
  38. package/dist/src/openclaw/bridges/mattermost.js +13 -8
  39. package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
  40. package/dist/src/openclaw/bridges/probe-response.d.ts +1 -0
  41. package/dist/src/openclaw/bridges/probe-response.js +5 -0
  42. package/dist/src/openclaw/bridges/probe-response.js.map +1 -0
  43. package/dist/src/openclaw/bridges/signal.js +15 -6
  44. package/dist/src/openclaw/bridges/signal.js.map +1 -1
  45. package/dist/src/openclaw/bridges/slack.js +116 -23
  46. package/dist/src/openclaw/bridges/slack.js.map +1 -1
  47. package/dist/src/openclaw/bridges/telegram.js +45 -19
  48. package/dist/src/openclaw/bridges/telegram.js.map +1 -1
  49. package/dist/src/openclaw/bridges/whatsapp.js +32 -16
  50. package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
  51. package/dist/src/openclaw/bridges/zalo.js +8 -3
  52. package/dist/src/openclaw/bridges/zalo.js.map +1 -1
  53. package/dist/src/openclaw/private-file.d.ts +38 -3
  54. package/dist/src/openclaw/private-file.js +2008 -87
  55. package/dist/src/openclaw/private-file.js.map +1 -1
  56. package/dist/src/openclaw/shared.d.ts +1 -0
  57. package/dist/src/openclaw/shared.js +48 -13
  58. package/dist/src/openclaw/shared.js.map +1 -1
  59. package/dist/src/openclaw/smoke-lock.d.ts +9 -0
  60. package/dist/src/openclaw/smoke-lock.js +626 -172
  61. package/dist/src/openclaw/smoke-lock.js.map +1 -1
  62. package/dist/src/openclaw.js +225 -42
  63. package/dist/src/openclaw.js.map +1 -1
  64. package/dist/src/platform/process-owned-lock.d.ts +11 -0
  65. package/dist/src/platform/process-owned-lock.js +1698 -0
  66. package/dist/src/platform/process-owned-lock.js.map +1 -0
  67. package/dist/src/platform/recorder-directory.d.ts +1 -0
  68. package/dist/src/platform/recorder-directory.js +14 -0
  69. package/dist/src/platform/recorder-directory.js.map +1 -0
  70. package/dist/src/platform/windows-acl.d.ts +18 -0
  71. package/dist/src/platform/windows-acl.js +1367 -0
  72. package/dist/src/platform/windows-acl.js.map +1 -0
  73. package/dist/src/platform/windows-lock-root.d.ts +13 -0
  74. package/dist/src/platform/windows-lock-root.js +98 -0
  75. package/dist/src/platform/windows-lock-root.js.map +1 -0
  76. package/dist/src/providers/builtin/discord.d.ts +4 -0
  77. package/dist/src/providers/builtin/discord.js +52 -9
  78. package/dist/src/providers/builtin/discord.js.map +1 -1
  79. package/dist/src/providers/builtin/external-webhook-auth.d.ts +1 -0
  80. package/dist/src/providers/builtin/external-webhook-auth.js +38 -1
  81. package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -1
  82. package/dist/src/providers/builtin/feishu.d.ts +1 -0
  83. package/dist/src/providers/builtin/feishu.js +96 -26
  84. package/dist/src/providers/builtin/feishu.js.map +1 -1
  85. package/dist/src/providers/builtin/googlechat.d.ts +1 -0
  86. package/dist/src/providers/builtin/googlechat.js +95 -26
  87. package/dist/src/providers/builtin/googlechat.js.map +1 -1
  88. package/dist/src/providers/builtin/imessage.js +60 -17
  89. package/dist/src/providers/builtin/imessage.js.map +1 -1
  90. package/dist/src/providers/builtin/loopback.js +88 -35
  91. package/dist/src/providers/builtin/loopback.js.map +1 -1
  92. package/dist/src/providers/builtin/matrix.d.ts +2 -2
  93. package/dist/src/providers/builtin/matrix.js +78 -21
  94. package/dist/src/providers/builtin/matrix.js.map +1 -1
  95. package/dist/src/providers/builtin/mattermost.d.ts +11 -7
  96. package/dist/src/providers/builtin/mattermost.js +138 -24
  97. package/dist/src/providers/builtin/mattermost.js.map +1 -1
  98. package/dist/src/providers/builtin/msteams.d.ts +1 -0
  99. package/dist/src/providers/builtin/msteams.js +118 -38
  100. package/dist/src/providers/builtin/msteams.js.map +1 -1
  101. package/dist/src/providers/builtin/native-local-mock.js +4 -4
  102. package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
  103. package/dist/src/providers/builtin/script.js +1057 -146
  104. package/dist/src/providers/builtin/script.js.map +1 -1
  105. package/dist/src/providers/builtin/slack.d.ts +8 -1
  106. package/dist/src/providers/builtin/slack.js +327 -24
  107. package/dist/src/providers/builtin/slack.js.map +1 -1
  108. package/dist/src/providers/builtin/telegram.d.ts +1 -1
  109. package/dist/src/providers/builtin/telegram.js +55 -14
  110. package/dist/src/providers/builtin/telegram.js.map +1 -1
  111. package/dist/src/providers/builtin/whatsapp.d.ts +4 -3
  112. package/dist/src/providers/builtin/whatsapp.js +157 -29
  113. package/dist/src/providers/builtin/whatsapp.js.map +1 -1
  114. package/dist/src/providers/builtin/zalo.d.ts +5 -2
  115. package/dist/src/providers/builtin/zalo.js +31 -7
  116. package/dist/src/providers/builtin/zalo.js.map +1 -1
  117. package/dist/src/providers/catalog.d.ts +1 -1
  118. package/dist/src/providers/catalog.js +1 -1
  119. package/dist/src/providers/catalog.js.map +1 -1
  120. package/dist/src/providers/local-mock.d.ts +4 -0
  121. package/dist/src/providers/local-mock.js +162 -35
  122. package/dist/src/providers/local-mock.js.map +1 -1
  123. package/dist/src/providers/native-ids.d.ts +2 -0
  124. package/dist/src/providers/native-ids.js +3 -0
  125. package/dist/src/providers/native-ids.js.map +1 -1
  126. package/dist/src/providers/recorder.d.ts +14 -3
  127. package/dist/src/providers/recorder.js +521 -41
  128. package/dist/src/providers/recorder.js.map +1 -1
  129. package/dist/src/providers/registry.d.ts +1 -0
  130. package/dist/src/providers/registry.js +65 -20
  131. package/dist/src/providers/registry.js.map +1 -1
  132. package/dist/src/providers/signed-jwt.d.ts +6 -1
  133. package/dist/src/providers/signed-jwt.js +241 -50
  134. package/dist/src/providers/signed-jwt.js.map +1 -1
  135. package/dist/src/providers/slack-ids.d.ts +1 -0
  136. package/dist/src/providers/slack-ids.js +5 -0
  137. package/dist/src/providers/slack-ids.js.map +1 -1
  138. package/dist/src/providers/target-normalizers.d.ts +9 -1
  139. package/dist/src/providers/target-normalizers.js +177 -58
  140. package/dist/src/providers/target-normalizers.js.map +1 -1
  141. package/dist/src/providers/webhook-server.d.ts +3 -0
  142. package/dist/src/providers/webhook-server.js +268 -47
  143. package/dist/src/providers/webhook-server.js.map +1 -1
  144. package/dist/src/servers/http.d.ts +14 -2
  145. package/dist/src/servers/http.js +229 -58
  146. package/dist/src/servers/http.js.map +1 -1
  147. package/dist/src/servers/matrix.d.ts +3 -0
  148. package/dist/src/servers/matrix.js +268 -110
  149. package/dist/src/servers/matrix.js.map +1 -1
  150. package/dist/src/servers/mattermost.d.ts +5 -0
  151. package/dist/src/servers/mattermost.js +389 -91
  152. package/dist/src/servers/mattermost.js.map +1 -1
  153. package/dist/src/servers/recorder.d.ts +11 -0
  154. package/dist/src/servers/recorder.js +1072 -69
  155. package/dist/src/servers/recorder.js.map +1 -1
  156. package/dist/src/servers/signal.d.ts +1 -0
  157. package/dist/src/servers/signal.js +279 -44
  158. package/dist/src/servers/signal.js.map +1 -1
  159. package/dist/src/servers/slack.d.ts +15 -0
  160. package/dist/src/servers/slack.js +259 -51
  161. package/dist/src/servers/slack.js.map +1 -1
  162. package/dist/src/servers/telegram-identity.d.ts +6 -0
  163. package/dist/src/servers/telegram-identity.js +27 -0
  164. package/dist/src/servers/telegram-identity.js.map +1 -0
  165. package/dist/src/servers/telegram.d.ts +17 -6
  166. package/dist/src/servers/telegram.js +1169 -107
  167. package/dist/src/servers/telegram.js.map +1 -1
  168. package/dist/src/servers/webhook-target.d.ts +12 -4
  169. package/dist/src/servers/webhook-target.js +226 -28
  170. package/dist/src/servers/webhook-target.js.map +1 -1
  171. package/dist/src/servers/whatsapp-baileys-websocket.d.ts +60 -1
  172. package/dist/src/servers/whatsapp-baileys-websocket.js +782 -112
  173. package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
  174. package/dist/src/servers/whatsapp-jid.d.ts +1 -0
  175. package/dist/src/servers/whatsapp-jid.js +9 -5
  176. package/dist/src/servers/whatsapp-jid.js.map +1 -1
  177. package/dist/src/servers/whatsapp-wire/binary-node.d.ts +1 -0
  178. package/dist/src/servers/whatsapp-wire/binary-node.js +37 -13
  179. package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
  180. package/dist/src/servers/whatsapp-wire/crypto.d.ts +3 -0
  181. package/dist/src/servers/whatsapp-wire/crypto.js +23 -8
  182. package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
  183. package/dist/src/servers/whatsapp-wire/handshake.d.ts +9 -3
  184. package/dist/src/servers/whatsapp-wire/handshake.js +173 -12
  185. package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
  186. package/dist/src/servers/whatsapp-wire/signal.js +3 -3
  187. package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
  188. package/dist/src/servers/whatsapp.d.ts +7 -0
  189. package/dist/src/servers/whatsapp.js +149 -24
  190. package/dist/src/servers/whatsapp.js.map +1 -1
  191. package/dist/src/servers/zalo.d.ts +1 -0
  192. package/dist/src/servers/zalo.js +193 -82
  193. package/dist/src/servers/zalo.js.map +1 -1
  194. package/docs/channel-setup.md +185 -43
  195. package/fixtures/examples/crabline.example.yaml +3 -2
  196. package/package.json +18 -10
  197. package/fixtures/examples/openclaw-bridge.yaml +0 -125
@@ -1,5 +1,6 @@
1
1
  import { createAdminInboundRequest, createOpenClawCrablineProviderBridge, DEFAULT_ACCOUNT_ID, isRecord, qaTargetForInbound, readNonBlankString, readString, } from "../shared.js";
2
- import { canonicalizeWhatsAppChatJid, canonicalizeWhatsAppUserCorrelationJid, canonicalizeWhatsAppUserJid, } from "../../servers/whatsapp-jid.js";
2
+ import { canonicalizeWhatsAppChatCorrelationJid, canonicalizeWhatsAppChatJid, canonicalizeWhatsAppUserCorrelationJid, canonicalizeWhatsAppUserJid, } from "../../servers/whatsapp-jid.js";
3
+ import { throwProbeHttpError } from "./probe-response.js";
3
4
  function requireWhatsAppJid(value, label, userOnly = false) {
4
5
  const canonical = userOnly
5
6
  ? canonicalizeWhatsAppUserJid(value)
@@ -37,7 +38,7 @@ export const WHATSAPP_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrabline
37
38
  ...(signal ? { signal } : {}),
38
39
  });
39
40
  if (!response.ok) {
40
- throw new Error(`Crabline WhatsApp probe failed with HTTP ${response.status}.`);
41
+ await throwProbeHttpError(response, `Crabline WhatsApp probe failed with HTTP ${response.status}.`);
41
42
  }
42
43
  const payload = await response.json();
43
44
  if (!isRecord(payload) || readString(payload.id) !== whatsapp.phoneNumberId) {
@@ -90,11 +91,12 @@ export const WHATSAPP_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrabline
90
91
  if (parsed.threadId !== undefined) {
91
92
  throw new Error("WhatsApp does not support thread targets.");
92
93
  }
93
- const to = requireWhatsAppJid(parsed.id, "WhatsApp target");
94
- requireWhatsAppTargetKind(parsed, to);
95
- if (to.endsWith("@g.us")) {
94
+ const nativeTo = requireWhatsAppJid(parsed.id, "WhatsApp target");
95
+ requireWhatsAppTargetKind(parsed, nativeTo);
96
+ if (nativeTo.endsWith("@g.us")) {
96
97
  throw new Error("WhatsApp Crabline WebSocket outbound supports direct targets only.");
97
98
  }
99
+ const to = canonicalizeWhatsAppUserCorrelationJid(nativeTo);
98
100
  return {
99
101
  channel: "whatsapp",
100
102
  to,
@@ -106,25 +108,31 @@ export const WHATSAPP_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrabline
106
108
  if (input.threadId !== undefined) {
107
109
  throw new Error("WhatsApp does not support thread targets.");
108
110
  }
109
- const chatJid = requireWhatsAppJid(input.conversation.id, "WhatsApp conversation");
110
- requireWhatsAppConversationKind(input.conversation.kind, chatJid);
111
- const senderJid = requireWhatsAppJid(input.senderId, "WhatsApp sender", true);
111
+ const nativeChatJid = requireWhatsAppJid(input.conversation.id, "WhatsApp conversation");
112
+ requireWhatsAppConversationKind(input.conversation.kind, nativeChatJid);
113
+ const nativeSenderJid = requireWhatsAppJid(input.senderId, "WhatsApp sender", true);
114
+ const providerTargetKey = canonicalizeWhatsAppChatCorrelationJid(nativeChatJid);
115
+ if (input.conversation.kind === "direct" &&
116
+ canonicalizeWhatsAppUserCorrelationJid(nativeChatJid) !==
117
+ canonicalizeWhatsAppUserCorrelationJid(nativeSenderJid)) {
118
+ throw new Error("WhatsApp direct conversation and sender must identify the same recipient.");
119
+ }
112
120
  return {
113
121
  ...createAdminInboundRequest(whatsapp),
114
122
  providerBody: {
115
- chatJid,
116
- senderJid,
123
+ chatJid: nativeChatJid,
124
+ senderJid: nativeSenderJid,
117
125
  ...(input.senderName ? { pushName: input.senderName } : {}),
118
126
  text: input.text,
119
127
  },
120
- providerTargetKey: chatJid,
128
+ providerTargetKey,
121
129
  qaTarget: qaTargetForInbound({
122
130
  ...input,
123
- conversation: { ...input.conversation, id: chatJid },
131
+ conversation: { ...input.conversation, id: providerTargetKey },
124
132
  }),
125
133
  stateConversation: {
126
- id: chatJid,
127
- kind: chatJid.endsWith("@g.us") ? "group" : "direct",
134
+ id: nativeChatJid,
135
+ kind: nativeChatJid.endsWith("@g.us") ? "group" : "direct",
128
136
  },
129
137
  };
130
138
  },
@@ -141,7 +149,15 @@ export const WHATSAPP_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrabline
141
149
  const baileysKey = isRecord(event.body.key) ? event.body.key : undefined;
142
150
  const baileysMessage = isRecord(event.body.message) ? event.body.message : undefined;
143
151
  const isBaileysSend = event.method === "WEBSOCKET" && event.path === "/ws/chat";
144
- if (!isBaileysSend && event.path !== messagesPath) {
152
+ const messagingProduct = readString(event.body.messaging_product);
153
+ const messageType = readString(event.body.type);
154
+ const isCloudTextSend = event.method === "POST" &&
155
+ event.path === messagesPath &&
156
+ (!("messaging_product" in event.body) || messagingProduct === "whatsapp") &&
157
+ (!("type" in event.body) || messageType === "text") &&
158
+ !("status" in event.body) &&
159
+ !("message_id" in event.body);
160
+ if (!isBaileysSend && !isCloudTextSend) {
145
161
  return null;
146
162
  }
147
163
  const to = isBaileysSend ? readString(baileysKey?.remoteJid) : readString(event.body.to);
@@ -155,7 +171,7 @@ export const WHATSAPP_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrabline
155
171
  return null;
156
172
  }
157
173
  const providerTarget = isBaileysSend
158
- ? canonicalizeWhatsAppUserCorrelationJid(to)
174
+ ? canonicalizeWhatsAppChatCorrelationJid(to)
159
175
  : (canonicalizeWhatsAppChatJid(to) ??
160
176
  (/^\d{7,15}$/u.test(to) ? `${to}@s.whatsapp.net` : to));
161
177
  if (!providerTarget) {
@@ -1 +1 @@
1
- {"version":3,"file":"whatsapp.js","sourceRoot":"","sources":["../../../../src/openclaw/bridges/whatsapp.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createAdminInboundRequest,\n createOpenClawCrablineProviderBridge,\n DEFAULT_ACCOUNT_ID,\n isRecord,\n qaTargetForInbound,\n readNonBlankString,\n readString,\n} from \"../shared.js\";\nimport {\n canonicalizeWhatsAppChatJid,\n canonicalizeWhatsAppUserCorrelationJid,\n canonicalizeWhatsAppUserJid,\n} from \"../../servers/whatsapp-jid.js\";\n\nfunction requireWhatsAppJid(value: string, label: string, userOnly = false): string {\n const canonical = userOnly\n ? canonicalizeWhatsAppUserJid(value)\n : canonicalizeWhatsAppChatJid(value);\n if (!canonical) {\n throw new Error(`${label} must be a native WhatsApp JID.`);\n }\n return canonical;\n}\n\nfunction requireWhatsAppTargetKind(\n parsed: { kind: \"direct\" | \"group\"; native: boolean },\n targetId: string,\n): void {\n if (parsed.native) {\n return;\n }\n const nativeKind = targetId.endsWith(\"@g.us\") ? \"group\" : \"direct\";\n if (parsed.kind !== nativeKind) {\n throw new Error(\"WhatsApp target kind does not match the native JID.\");\n }\n}\n\nfunction requireWhatsAppConversationKind(kind: \"direct\" | \"group\", targetId: string): void {\n const nativeKind = targetId.endsWith(\"@g.us\") ? \"group\" : \"direct\";\n if (kind !== nativeKind) {\n throw new Error(\"WhatsApp inbound conversation kind does not match the native JID.\");\n }\n}\n\nexport const WHATSAPP_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablineProviderBridge({\n provider: \"whatsapp\",\n createAdapter(whatsapp) {\n const messagesPath = new URL(whatsapp.endpoints.messagesUrl).pathname;\n return {\n async probe(signal) {\n const response = await fetch(whatsapp.endpoints.phoneNumberUrl, {\n headers: {\n authorization: `Bearer ${whatsapp.accessToken}`,\n },\n ...(signal ? { signal } : {}),\n });\n if (!response.ok) {\n throw new Error(`Crabline WhatsApp probe failed with HTTP ${response.status}.`);\n }\n const payload: unknown = await response.json();\n if (!isRecord(payload) || readString(payload.id) !== whatsapp.phoneNumberId) {\n throw new Error(\"Crabline WhatsApp probe returned an unexpected phone number.\");\n }\n return payload;\n },\n createBinding() {\n return {\n accountId: DEFAULT_ACCOUNT_ID,\n channel: \"whatsapp\",\n createChannelDriverSmokeEnv: (env) => ({\n ...env,\n CRABLINE_WHATSAPP_ADMIN_TOKEN: whatsapp.adminToken,\n CRABLINE_WHATSAPP_RECORDER_PATH: whatsapp.recorderPath,\n CRABLINE_WHATSAPP_SELF_JID: whatsapp.selfJid,\n OPENCLAW_WHATSAPP_WEB_SOCKET_URL: whatsapp.endpoints.baileysWebSocketUrl,\n }),\n createGatewayConfig: (openclawConfig = {}) => {\n const channels = isRecord(openclawConfig.channels) ? openclawConfig.channels : {};\n const whatsappConfig = isRecord(channels.whatsapp) ? channels.whatsapp : {};\n const groups = isRecord(whatsappConfig.groups) ? whatsappConfig.groups : {};\n const defaultGroup = isRecord(groups[\"*\"]) ? groups[\"*\"] : {};\n\n return {\n ...openclawConfig,\n channels: {\n ...channels,\n whatsapp: {\n ...whatsappConfig,\n enabled: true,\n dmPolicy: \"open\",\n groupPolicy: \"open\",\n allowFrom: [\"*\"],\n groupAllowFrom: [\"*\"],\n groups: {\n ...groups,\n \"*\": {\n ...defaultGroup,\n requireMention: false,\n },\n },\n },\n },\n };\n },\n requiredPluginIds: [\"whatsapp\"],\n };\n },\n createAgentDelivery(parsed) {\n if (parsed.threadId !== undefined) {\n throw new Error(\"WhatsApp does not support thread targets.\");\n }\n const to = requireWhatsAppJid(parsed.id, \"WhatsApp target\");\n requireWhatsAppTargetKind(parsed, to);\n if (to.endsWith(\"@g.us\")) {\n throw new Error(\"WhatsApp Crabline WebSocket outbound supports direct targets only.\");\n }\n return {\n channel: \"whatsapp\",\n to,\n replyChannel: \"whatsapp\",\n replyTo: to,\n };\n },\n createInbound(input) {\n if (input.threadId !== undefined) {\n throw new Error(\"WhatsApp does not support thread targets.\");\n }\n const chatJid = requireWhatsAppJid(input.conversation.id, \"WhatsApp conversation\");\n requireWhatsAppConversationKind(input.conversation.kind, chatJid);\n const senderJid = requireWhatsAppJid(input.senderId, \"WhatsApp sender\", true);\n return {\n ...createAdminInboundRequest(whatsapp),\n providerBody: {\n chatJid,\n senderJid,\n ...(input.senderName ? { pushName: input.senderName } : {}),\n text: input.text,\n },\n providerTargetKey: chatJid,\n qaTarget: qaTargetForInbound({\n ...input,\n conversation: { ...input.conversation, id: chatJid },\n }),\n stateConversation: {\n id: chatJid,\n kind: chatJid.endsWith(\"@g.us\") ? \"group\" : \"direct\",\n },\n };\n },\n createOutboundFromRecorderEvent({ event, targetByProviderTarget }) {\n if (\n !isRecord(event) ||\n event.type !== \"api\" ||\n event.accepted !== true ||\n typeof event.path !== \"string\"\n ) {\n return null;\n }\n if (!isRecord(event.body)) {\n return null;\n }\n const baileysKey = isRecord(event.body.key) ? event.body.key : undefined;\n const baileysMessage = isRecord(event.body.message) ? event.body.message : undefined;\n const isBaileysSend = event.method === \"WEBSOCKET\" && event.path === \"/ws/chat\";\n if (!isBaileysSend && event.path !== messagesPath) {\n return null;\n }\n const to = isBaileysSend ? readString(baileysKey?.remoteJid) : readString(event.body.to);\n const textPayload = event.body.text;\n const text = isBaileysSend\n ? readNonBlankString(baileysMessage?.conversation)\n : isRecord(textPayload)\n ? readNonBlankString(textPayload.body)\n : undefined;\n if (!to || !text) {\n return null;\n }\n const providerTarget = isBaileysSend\n ? canonicalizeWhatsAppUserCorrelationJid(to)\n : (canonicalizeWhatsAppChatJid(to) ??\n (/^\\d{7,15}$/u.test(to) ? `${to}@s.whatsapp.net` : to));\n if (!providerTarget) {\n return null;\n }\n return {\n accountId: DEFAULT_ACCOUNT_ID,\n senderId: \"openclaw\",\n senderName: \"OpenClaw QA\",\n text,\n to: targetByProviderTarget.get(providerTarget) ?? providerTarget,\n };\n },\n };\n },\n});\n"]}
1
+ {"version":3,"file":"whatsapp.js","sourceRoot":"","sources":["../../../../src/openclaw/bridges/whatsapp.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createAdminInboundRequest,\n createOpenClawCrablineProviderBridge,\n DEFAULT_ACCOUNT_ID,\n isRecord,\n qaTargetForInbound,\n readNonBlankString,\n readString,\n} from \"../shared.js\";\nimport {\n canonicalizeWhatsAppChatCorrelationJid,\n canonicalizeWhatsAppChatJid,\n canonicalizeWhatsAppUserCorrelationJid,\n canonicalizeWhatsAppUserJid,\n} from \"../../servers/whatsapp-jid.js\";\nimport { throwProbeHttpError } from \"./probe-response.js\";\n\nfunction requireWhatsAppJid(value: string, label: string, userOnly = false): string {\n const canonical = userOnly\n ? canonicalizeWhatsAppUserJid(value)\n : canonicalizeWhatsAppChatJid(value);\n if (!canonical) {\n throw new Error(`${label} must be a native WhatsApp JID.`);\n }\n return canonical;\n}\n\nfunction requireWhatsAppTargetKind(\n parsed: { kind: \"direct\" | \"group\"; native: boolean },\n targetId: string,\n): void {\n if (parsed.native) {\n return;\n }\n const nativeKind = targetId.endsWith(\"@g.us\") ? \"group\" : \"direct\";\n if (parsed.kind !== nativeKind) {\n throw new Error(\"WhatsApp target kind does not match the native JID.\");\n }\n}\n\nfunction requireWhatsAppConversationKind(kind: \"direct\" | \"group\", targetId: string): void {\n const nativeKind = targetId.endsWith(\"@g.us\") ? \"group\" : \"direct\";\n if (kind !== nativeKind) {\n throw new Error(\"WhatsApp inbound conversation kind does not match the native JID.\");\n }\n}\n\nexport const WHATSAPP_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablineProviderBridge({\n provider: \"whatsapp\",\n createAdapter(whatsapp) {\n const messagesPath = new URL(whatsapp.endpoints.messagesUrl).pathname;\n return {\n async probe(signal) {\n const response = await fetch(whatsapp.endpoints.phoneNumberUrl, {\n headers: {\n authorization: `Bearer ${whatsapp.accessToken}`,\n },\n ...(signal ? { signal } : {}),\n });\n if (!response.ok) {\n await throwProbeHttpError(\n response,\n `Crabline WhatsApp probe failed with HTTP ${response.status}.`,\n );\n }\n const payload: unknown = await response.json();\n if (!isRecord(payload) || readString(payload.id) !== whatsapp.phoneNumberId) {\n throw new Error(\"Crabline WhatsApp probe returned an unexpected phone number.\");\n }\n return payload;\n },\n createBinding() {\n return {\n accountId: DEFAULT_ACCOUNT_ID,\n channel: \"whatsapp\",\n createChannelDriverSmokeEnv: (env) => ({\n ...env,\n CRABLINE_WHATSAPP_ADMIN_TOKEN: whatsapp.adminToken,\n CRABLINE_WHATSAPP_RECORDER_PATH: whatsapp.recorderPath,\n CRABLINE_WHATSAPP_SELF_JID: whatsapp.selfJid,\n OPENCLAW_WHATSAPP_WEB_SOCKET_URL: whatsapp.endpoints.baileysWebSocketUrl,\n }),\n createGatewayConfig: (openclawConfig = {}) => {\n const channels = isRecord(openclawConfig.channels) ? openclawConfig.channels : {};\n const whatsappConfig = isRecord(channels.whatsapp) ? channels.whatsapp : {};\n const groups = isRecord(whatsappConfig.groups) ? whatsappConfig.groups : {};\n const defaultGroup = isRecord(groups[\"*\"]) ? groups[\"*\"] : {};\n\n return {\n ...openclawConfig,\n channels: {\n ...channels,\n whatsapp: {\n ...whatsappConfig,\n enabled: true,\n dmPolicy: \"open\",\n groupPolicy: \"open\",\n allowFrom: [\"*\"],\n groupAllowFrom: [\"*\"],\n groups: {\n ...groups,\n \"*\": {\n ...defaultGroup,\n requireMention: false,\n },\n },\n },\n },\n };\n },\n requiredPluginIds: [\"whatsapp\"],\n };\n },\n createAgentDelivery(parsed) {\n if (parsed.threadId !== undefined) {\n throw new Error(\"WhatsApp does not support thread targets.\");\n }\n const nativeTo = requireWhatsAppJid(parsed.id, \"WhatsApp target\");\n requireWhatsAppTargetKind(parsed, nativeTo);\n if (nativeTo.endsWith(\"@g.us\")) {\n throw new Error(\"WhatsApp Crabline WebSocket outbound supports direct targets only.\");\n }\n const to = canonicalizeWhatsAppUserCorrelationJid(nativeTo)!;\n return {\n channel: \"whatsapp\",\n to,\n replyChannel: \"whatsapp\",\n replyTo: to,\n };\n },\n createInbound(input) {\n if (input.threadId !== undefined) {\n throw new Error(\"WhatsApp does not support thread targets.\");\n }\n const nativeChatJid = requireWhatsAppJid(input.conversation.id, \"WhatsApp conversation\");\n requireWhatsAppConversationKind(input.conversation.kind, nativeChatJid);\n const nativeSenderJid = requireWhatsAppJid(input.senderId, \"WhatsApp sender\", true);\n const providerTargetKey = canonicalizeWhatsAppChatCorrelationJid(nativeChatJid)!;\n if (\n input.conversation.kind === \"direct\" &&\n canonicalizeWhatsAppUserCorrelationJid(nativeChatJid) !==\n canonicalizeWhatsAppUserCorrelationJid(nativeSenderJid)\n ) {\n throw new Error(\n \"WhatsApp direct conversation and sender must identify the same recipient.\",\n );\n }\n return {\n ...createAdminInboundRequest(whatsapp),\n providerBody: {\n chatJid: nativeChatJid,\n senderJid: nativeSenderJid,\n ...(input.senderName ? { pushName: input.senderName } : {}),\n text: input.text,\n },\n providerTargetKey,\n qaTarget: qaTargetForInbound({\n ...input,\n conversation: { ...input.conversation, id: providerTargetKey },\n }),\n stateConversation: {\n id: nativeChatJid,\n kind: nativeChatJid.endsWith(\"@g.us\") ? \"group\" : \"direct\",\n },\n };\n },\n createOutboundFromRecorderEvent({ event, targetByProviderTarget }) {\n if (\n !isRecord(event) ||\n event.type !== \"api\" ||\n event.accepted !== true ||\n typeof event.path !== \"string\"\n ) {\n return null;\n }\n if (!isRecord(event.body)) {\n return null;\n }\n const baileysKey = isRecord(event.body.key) ? event.body.key : undefined;\n const baileysMessage = isRecord(event.body.message) ? event.body.message : undefined;\n const isBaileysSend = event.method === \"WEBSOCKET\" && event.path === \"/ws/chat\";\n const messagingProduct = readString(event.body.messaging_product);\n const messageType = readString(event.body.type);\n const isCloudTextSend =\n event.method === \"POST\" &&\n event.path === messagesPath &&\n (!(\"messaging_product\" in event.body) || messagingProduct === \"whatsapp\") &&\n (!(\"type\" in event.body) || messageType === \"text\") &&\n !(\"status\" in event.body) &&\n !(\"message_id\" in event.body);\n if (!isBaileysSend && !isCloudTextSend) {\n return null;\n }\n const to = isBaileysSend ? readString(baileysKey?.remoteJid) : readString(event.body.to);\n const textPayload = event.body.text;\n const text = isBaileysSend\n ? readNonBlankString(baileysMessage?.conversation)\n : isRecord(textPayload)\n ? readNonBlankString(textPayload.body)\n : undefined;\n if (!to || !text) {\n return null;\n }\n const providerTarget = isBaileysSend\n ? canonicalizeWhatsAppChatCorrelationJid(to)\n : (canonicalizeWhatsAppChatJid(to) ??\n (/^\\d{7,15}$/u.test(to) ? `${to}@s.whatsapp.net` : to));\n if (!providerTarget) {\n return null;\n }\n return {\n accountId: DEFAULT_ACCOUNT_ID,\n senderId: \"openclaw\",\n senderName: \"OpenClaw QA\",\n text,\n to: targetByProviderTarget.get(providerTarget) ?? providerTarget,\n };\n },\n };\n },\n});\n"]}
@@ -1,9 +1,14 @@
1
+ import { ZALO_ID_RULE, ZALO_UNSUPPORTED_THREAD_TARGET_ERROR, } from "../../providers/target-normalizers.js";
1
2
  import { createAdminInboundRequest, createOpenClawCrablineProviderBridge, DEFAULT_ACCOUNT_ID, isRecord, qaTargetForInbound, readNonBlankString, readString, } from "../shared.js";
3
+ import { throwProbeHttpError } from "./probe-response.js";
2
4
  function nativeId(value) {
3
5
  const id = value.trim();
4
6
  if (!id) {
5
7
  throw new Error("Zalo target is required.");
6
8
  }
9
+ if (!ZALO_ID_RULE.pattern.test(id)) {
10
+ throw new Error("Zalo target must be a native Zalo string id without whitespace.");
11
+ }
7
12
  return id;
8
13
  }
9
14
  export const ZALO_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablineProviderBridge({
@@ -16,7 +21,7 @@ export const ZALO_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablineProv
16
21
  ...(signal ? { signal } : {}),
17
22
  });
18
23
  if (!response.ok) {
19
- throw new Error(`Crabline Zalo getMe probe failed with HTTP ${response.status}.`);
24
+ await throwProbeHttpError(response, `Crabline Zalo getMe probe failed with HTTP ${response.status}.`);
20
25
  }
21
26
  const result = await response.json();
22
27
  const bot = isRecord(result) && isRecord(result.result) ? result.result : undefined;
@@ -57,14 +62,14 @@ export const ZALO_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablineProv
57
62
  },
58
63
  createAgentDelivery(parsed) {
59
64
  if (parsed.threadId) {
60
- throw new Error("Zalo does not support thread targets.");
65
+ throw new Error(ZALO_UNSUPPORTED_THREAD_TARGET_ERROR);
61
66
  }
62
67
  const to = nativeId(parsed.id);
63
68
  return { channel: "zalo", replyChannel: "zalo", replyTo: to, to };
64
69
  },
65
70
  createInbound(input) {
66
71
  if (input.threadId) {
67
- throw new Error("Zalo does not support thread targets.");
72
+ throw new Error(ZALO_UNSUPPORTED_THREAD_TARGET_ERROR);
68
73
  }
69
74
  const kind = input.conversation.kind === "direct" ? "direct" : "group";
70
75
  const chatId = nativeId(input.conversation.id);
@@ -1 +1 @@
1
- {"version":3,"file":"zalo.js","sourceRoot":"","sources":["../../../../src/openclaw/bridges/zalo.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createAdminInboundRequest,\n createOpenClawCrablineProviderBridge,\n DEFAULT_ACCOUNT_ID,\n isRecord,\n qaTargetForInbound,\n readNonBlankString,\n readString,\n} from \"../shared.js\";\n\nfunction nativeId(value: string): string {\n const id = value.trim();\n if (!id) {\n throw new Error(\"Zalo target is required.\");\n }\n return id;\n}\n\nexport const ZALO_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablineProviderBridge({\n provider: \"zalo\",\n createAdapter(zalo) {\n return {\n async probe(signal) {\n const response = await fetch(`${zalo.endpoints.apiRoot}/bot${zalo.botToken}/getMe`, {\n method: \"POST\",\n ...(signal ? { signal } : {}),\n });\n if (!response.ok) {\n throw new Error(`Crabline Zalo getMe probe failed with HTTP ${response.status}.`);\n }\n const result = await response.json();\n const bot = isRecord(result) && isRecord(result.result) ? result.result : undefined;\n if (!isRecord(result) || result.ok !== true || readNonBlankString(bot?.id) !== zalo.botId) {\n const detail =\n (isRecord(result) ? readNonBlankString(result.description) : undefined) ??\n (isRecord(result) ? readNonBlankString(result.error) : undefined) ??\n \"invalid response\";\n throw new Error(`Crabline Zalo getMe probe failed: ${detail}.`);\n }\n return result;\n },\n createBinding() {\n return {\n accountId: DEFAULT_ACCOUNT_ID,\n channel: \"zalo\",\n createChannelDriverSmokeEnv: (env) => ({ ...env, ...zalo.env }),\n createGatewayConfig: (openclawConfig = {}) => {\n const channels = isRecord(openclawConfig.channels) ? openclawConfig.channels : {};\n const zaloConfig = isRecord(channels.zalo) ? channels.zalo : {};\n return {\n ...openclawConfig,\n channels: {\n ...channels,\n zalo: {\n ...zaloConfig,\n allowFrom: [\"*\"],\n botToken: zalo.botToken,\n dmPolicy: \"open\",\n enabled: true,\n groupAllowFrom: [\"*\"],\n groupPolicy: \"open\",\n },\n },\n };\n },\n requiredPluginIds: [\"zalo\"],\n };\n },\n createAgentDelivery(parsed) {\n if (parsed.threadId) {\n throw new Error(\"Zalo does not support thread targets.\");\n }\n const to = nativeId(parsed.id);\n return { channel: \"zalo\", replyChannel: \"zalo\", replyTo: to, to };\n },\n createInbound(input) {\n if (input.threadId) {\n throw new Error(\"Zalo does not support thread targets.\");\n }\n const kind = input.conversation.kind === \"direct\" ? \"direct\" : \"group\";\n const chatId = nativeId(input.conversation.id);\n return {\n ...createAdminInboundRequest(zalo),\n providerBody: {\n chatId,\n chatType: kind === \"direct\" ? \"PRIVATE\" : \"GROUP\",\n senderId: nativeId(input.senderId),\n ...(input.senderName ? { senderName: input.senderName } : {}),\n text: input.text,\n },\n providerTargetKey: chatId,\n qaTarget: qaTargetForInbound(input),\n stateConversation: { id: chatId, kind },\n };\n },\n createOutboundFromRecorderEvent({ event, targetByProviderTarget }) {\n if (\n !isRecord(event) ||\n event.type !== \"api\" ||\n (event.method !== \"GET\" && event.method !== \"POST\") ||\n !isRecord(event.body) ||\n (event.path !== \"/bot<redacted>/sendMessage\" && event.path !== \"/bot<redacted>/sendPhoto\")\n ) {\n return null;\n }\n const chatId = readString(event.body.chat_id);\n const text =\n event.path === \"/bot<redacted>/sendMessage\"\n ? readNonBlankString(event.body.text)\n : readNonBlankString(event.body.caption);\n if (!chatId || !text) {\n return null;\n }\n return {\n accountId: DEFAULT_ACCOUNT_ID,\n senderId: zalo.botId,\n senderName: \"OpenClaw QA\",\n text,\n to: targetByProviderTarget.get(chatId) ?? chatId,\n };\n },\n };\n },\n});\n"]}
1
+ {"version":3,"file":"zalo.js","sourceRoot":"","sources":["../../../../src/openclaw/bridges/zalo.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ZALO_ID_RULE,\n ZALO_UNSUPPORTED_THREAD_TARGET_ERROR,\n} from \"../../providers/target-normalizers.js\";\nimport {\n createAdminInboundRequest,\n createOpenClawCrablineProviderBridge,\n DEFAULT_ACCOUNT_ID,\n isRecord,\n qaTargetForInbound,\n readNonBlankString,\n readString,\n} from \"../shared.js\";\nimport { throwProbeHttpError } from \"./probe-response.js\";\n\nfunction nativeId(value: string): string {\n const id = value.trim();\n if (!id) {\n throw new Error(\"Zalo target is required.\");\n }\n if (!ZALO_ID_RULE.pattern.test(id)) {\n throw new Error(\"Zalo target must be a native Zalo string id without whitespace.\");\n }\n return id;\n}\n\nexport const ZALO_OPENCLAW_CRABLINE_PROVIDER_BRIDGE = createOpenClawCrablineProviderBridge({\n provider: \"zalo\",\n createAdapter(zalo) {\n return {\n async probe(signal) {\n const response = await fetch(`${zalo.endpoints.apiRoot}/bot${zalo.botToken}/getMe`, {\n method: \"POST\",\n ...(signal ? { signal } : {}),\n });\n if (!response.ok) {\n await throwProbeHttpError(\n response,\n `Crabline Zalo getMe probe failed with HTTP ${response.status}.`,\n );\n }\n const result = await response.json();\n const bot = isRecord(result) && isRecord(result.result) ? result.result : undefined;\n if (!isRecord(result) || result.ok !== true || readNonBlankString(bot?.id) !== zalo.botId) {\n const detail =\n (isRecord(result) ? readNonBlankString(result.description) : undefined) ??\n (isRecord(result) ? readNonBlankString(result.error) : undefined) ??\n \"invalid response\";\n throw new Error(`Crabline Zalo getMe probe failed: ${detail}.`);\n }\n return result;\n },\n createBinding() {\n return {\n accountId: DEFAULT_ACCOUNT_ID,\n channel: \"zalo\",\n createChannelDriverSmokeEnv: (env) => ({ ...env, ...zalo.env }),\n createGatewayConfig: (openclawConfig = {}) => {\n const channels = isRecord(openclawConfig.channels) ? openclawConfig.channels : {};\n const zaloConfig = isRecord(channels.zalo) ? channels.zalo : {};\n return {\n ...openclawConfig,\n channels: {\n ...channels,\n zalo: {\n ...zaloConfig,\n allowFrom: [\"*\"],\n botToken: zalo.botToken,\n dmPolicy: \"open\",\n enabled: true,\n groupAllowFrom: [\"*\"],\n groupPolicy: \"open\",\n },\n },\n };\n },\n requiredPluginIds: [\"zalo\"],\n };\n },\n createAgentDelivery(parsed) {\n if (parsed.threadId) {\n throw new Error(ZALO_UNSUPPORTED_THREAD_TARGET_ERROR);\n }\n const to = nativeId(parsed.id);\n return { channel: \"zalo\", replyChannel: \"zalo\", replyTo: to, to };\n },\n createInbound(input) {\n if (input.threadId) {\n throw new Error(ZALO_UNSUPPORTED_THREAD_TARGET_ERROR);\n }\n const kind = input.conversation.kind === \"direct\" ? \"direct\" : \"group\";\n const chatId = nativeId(input.conversation.id);\n return {\n ...createAdminInboundRequest(zalo),\n providerBody: {\n chatId,\n chatType: kind === \"direct\" ? \"PRIVATE\" : \"GROUP\",\n senderId: nativeId(input.senderId),\n ...(input.senderName ? { senderName: input.senderName } : {}),\n text: input.text,\n },\n providerTargetKey: chatId,\n qaTarget: qaTargetForInbound(input),\n stateConversation: { id: chatId, kind },\n };\n },\n createOutboundFromRecorderEvent({ event, targetByProviderTarget }) {\n if (\n !isRecord(event) ||\n event.type !== \"api\" ||\n (event.method !== \"GET\" && event.method !== \"POST\") ||\n !isRecord(event.body) ||\n (event.path !== \"/bot<redacted>/sendMessage\" && event.path !== \"/bot<redacted>/sendPhoto\")\n ) {\n return null;\n }\n const chatId = readString(event.body.chat_id);\n const text =\n event.path === \"/bot<redacted>/sendMessage\"\n ? readNonBlankString(event.body.text)\n : readNonBlankString(event.body.caption);\n if (!chatId || !text) {\n return null;\n }\n return {\n accountId: DEFAULT_ACCOUNT_ID,\n senderId: zalo.botId,\n senderName: \"OpenClaw QA\",\n text,\n to: targetByProviderTarget.get(chatId) ?? chatId,\n };\n },\n };\n },\n});\n"]}
@@ -1,28 +1,63 @@
1
1
  export type WindowsAclRunner = (command: string, args: string[], options: {
2
2
  env: NodeJS.ProcessEnv;
3
+ killSignal: NodeJS.Signals;
4
+ timeout: number;
3
5
  windowsHide: boolean;
4
- }) => Promise<void>;
6
+ }) => Promise<string>;
5
7
  export declare function resolveWindowsPowerShellPath(systemRoot: string | null | undefined): string;
6
- export declare function applyOwnerOnlyWindowsAcl(filePath: string, run?: WindowsAclRunner, systemRoot?: string | null | undefined): Promise<void>;
8
+ export declare function createOwnerOnlyWindowsFile(filePath: string, run?: WindowsAclRunner, systemRoot?: string | null | undefined): Promise<FileIdentity>;
7
9
  export declare function applyOwnerOnlyWindowsDirectoryAcl(directoryPath: string, run?: WindowsAclRunner, systemRoot?: string | null | undefined): Promise<void>;
10
+ export declare function createOwnerOnlyWindowsDirectoryAncestry(directoryPath: string, run?: WindowsAclRunner, systemRoot?: string | null | undefined): Promise<string | undefined>;
11
+ export declare function verifyOwnerOnlyWindowsDirectoryAcl(directoryPath: string, run?: WindowsAclRunner, systemRoot?: string | null | undefined): Promise<void>;
12
+ export declare function verifyOwnerOnlyWindowsFileAcl(filePath: string, run?: WindowsAclRunner, systemRoot?: string | null | undefined): Promise<void>;
13
+ export declare function verifySafeWindowsDirectoryEntryParent(directoryPath: string, run?: WindowsAclRunner, systemRoot?: string | null | undefined): Promise<void>;
14
+ export declare function verifySafeWindowsDirectoryMutationBoundary(directoryPath: string, run?: WindowsAclRunner, systemRoot?: string | null | undefined): Promise<void>;
15
+ type FileIdentity = {
16
+ device: bigint;
17
+ inode: bigint;
18
+ };
8
19
  export type SecuredPrivateDirectory = {
9
20
  assertIdentityAt(directoryPath?: string): Promise<void>;
10
21
  directoryPath: string;
11
22
  };
12
23
  export declare function captureDirectoryIdentity(directoryPath: string): Promise<SecuredPrivateDirectory>;
13
24
  export declare function syncParentDirectory(filePath: string, platform?: NodeJS.Platform): Promise<void>;
14
- export declare function removeSecuredPrivateDirectory(secured: SecuredPrivateDirectory, currentPath?: string, quarantineBaseName?: string): Promise<void>;
25
+ export declare function removeSecuredPrivateDirectory(secured: SecuredPrivateDirectory, currentPath?: string, quarantineBaseName?: string, options?: {
26
+ beforeRecursiveRemove?: (quarantinePath: string) => Promise<void>;
27
+ beforeRename?: (currentPath: string) => Promise<void>;
28
+ claimRuntime?: PrivateMutationClaimRuntime;
29
+ createWindowsFile?: (filePath: string) => Promise<FileIdentity>;
30
+ platform?: NodeJS.Platform;
31
+ removeDirectory?: (quarantinePath: string) => Promise<void>;
32
+ syncParent?: (filePath: string, platform?: NodeJS.Platform) => Promise<void>;
33
+ }): Promise<void>;
15
34
  export declare function securePrivateDirectory(directoryPath: string, options?: {
35
+ createWindowsDirectories?: (directoryPath: string) => Promise<string | undefined>;
16
36
  currentUserId?: number;
37
+ markMutationRoot?: boolean;
17
38
  platform?: NodeJS.Platform;
18
39
  secureWindowsDirectory?: (directoryPath: string) => Promise<void>;
40
+ syncDirectory?: () => Promise<void>;
19
41
  syncParent?: (filePath: string, platform?: NodeJS.Platform) => Promise<void>;
20
42
  }): Promise<SecuredPrivateDirectory>;
43
+ export type PrivateMutationClaimRuntime = {
44
+ getProcessIdentity(pid: number): string | null;
45
+ isProcessAlive(pid: number): boolean;
46
+ ownerId: string;
47
+ pid: number;
48
+ processIdentity?: string;
49
+ processStartedAtMs: number;
50
+ };
21
51
  export declare function publishPrivateFileAtomically(filePath: string, contents: string, options?: {
22
52
  afterRename?: (filePath: string) => Promise<void>;
53
+ beforeCommitRename?: (temporaryPath: string) => Promise<void>;
23
54
  beforeRename?: (temporaryPath: string) => Promise<void>;
55
+ claimRuntime?: PrivateMutationClaimRuntime;
56
+ createWindowsFile?: (temporaryPath: string) => Promise<FileIdentity>;
57
+ createWindowsDirectories?: (directoryPath: string) => Promise<string | undefined>;
24
58
  platform?: NodeJS.Platform;
25
59
  removeTemporaryFile?: (temporaryPath: string) => Promise<void>;
26
60
  secureWindowsFile?: (temporaryPath: string) => Promise<void>;
27
61
  syncParent?: (filePath: string, platform?: NodeJS.Platform) => Promise<void>;
28
62
  }): Promise<void>;
63
+ export {};