@openclaw/signal 2026.9.6 → 2026.9.7

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 (279) hide show
  1. package/assets/icon.png +0 -0
  2. package/dist/.setup/{accounts-BV6tDOTc.mjs → accounts-DMtj2E-4.mjs} +6 -35
  3. package/dist/.setup/api-DEB0Obj8.mjs +16 -0
  4. package/dist/.setup/{api-CGh4eWR8.mjs → api-DmCb6e7E.mjs} +10 -10
  5. package/dist/.setup/{approval-auth-BBI9BTRm.mjs → approval-auth-CszS7gwf.mjs} +7 -13
  6. package/dist/.setup/{approval-handler.runtime-C3vN5OWd.mjs → approval-handler.runtime-D9ofZcZW.mjs} +10 -29
  7. package/dist/.setup/{approval-reactions-DDQvPP_z.mjs → approval-reactions-BKkjIAoi.mjs} +25 -36
  8. package/dist/.setup/{channel-DhzTcFsK.mjs → channel-DrUxv5cf.mjs} +567 -136
  9. package/dist/.setup/{client-BseAt7F7.mjs → client-AXcDteBZ.mjs} +63 -152
  10. package/dist/.setup/client-adapter-c_O1ouxZ.mjs +30 -0
  11. package/dist/.setup/{config-schema-aQwwMGUj.mjs → config-schema-DvxZ18SD.mjs} +3 -13
  12. package/dist/.setup/{doctor-contract-api-Rbq_sRTI.mjs → doctor-contract-api-Db9V9gsY.mjs} +212 -91
  13. package/dist/.setup/{identity-YXPmgFMu.mjs → identity-B3JyPqGO.mjs} +2 -6
  14. package/dist/.setup/{install-signal-cli-BDbzFcU2.mjs → install-signal-cli-ChvjzM6X.mjs} +0 -4
  15. package/dist/.setup/legacy-transport-QIpaMNST.mjs +18 -0
  16. package/dist/.setup/{monitor-Dnz6Ygz5.mjs → monitor-BfwQr78f.mjs} +95 -124
  17. package/dist/.setup/{probe-DXT2eLnw.mjs → probe-BYLzra6D.mjs} +9 -9
  18. package/dist/.setup/{reaction-runtime-api-BnQGHcrB.mjs → reaction-runtime-api-DDi5x2wC.mjs} +3 -17
  19. package/dist/.setup/{question-reactions-C8cSEjVf.mjs → reaction-targets-CEdyjtrC.mjs} +11 -8
  20. package/dist/.setup/{rpc-context-CwwADZ1b.mjs → rpc-context-D26RxFIm.mjs} +1 -1
  21. package/dist/.setup/runtime-8sxUF217.mjs +8 -0
  22. package/dist/.setup/{send-B78M_eFp.mjs → send-DEjrbpIC.mjs} +25 -55
  23. package/dist/.setup/{channel.runtime-CG79z_Vy.mjs → setup-surface-Drt-4t3R.mjs} +4 -6
  24. package/dist/.setup/transport-detection-BVUDE42e.mjs +25 -0
  25. package/dist/.setup/{transport-policy-5VSnj5ma.mjs → transport-policy-B6C_LogW.mjs} +19 -1
  26. package/dist/.setup/transport-probes.runtime-DwXEHnXr.mjs +2 -0
  27. package/dist/api.js +10 -10
  28. package/dist/channel-config-api.js +1 -1
  29. package/dist/channel-plugin-api.js +1 -1
  30. package/dist/contract-api.js +2 -2
  31. package/dist/doctor-contract-api.js +1 -1
  32. package/dist/reaction-runtime-api.js +1 -1
  33. package/dist/runtime-api.js +2 -19
  34. package/dist/setup-entry.js +1 -1
  35. package/node_modules/@openclaw/fs-safe/CHANGELOG.md +102 -0
  36. package/node_modules/@openclaw/fs-safe/README.md +24 -6
  37. package/node_modules/@openclaw/fs-safe/dist/advanced.d.ts +6 -1
  38. package/node_modules/@openclaw/fs-safe/dist/advanced.js +3 -1
  39. package/node_modules/@openclaw/fs-safe/dist/archive-durability.js +1 -1
  40. package/node_modules/@openclaw/fs-safe/dist/archive-merge.js +1 -2
  41. package/node_modules/@openclaw/fs-safe/dist/archive-plan.d.ts +2 -7
  42. package/node_modules/@openclaw/fs-safe/dist/archive-read.js +9 -18
  43. package/node_modules/@openclaw/fs-safe/dist/archive-staging.d.ts +1 -2
  44. package/node_modules/@openclaw/fs-safe/dist/archive-staging.js +3 -3
  45. package/node_modules/@openclaw/fs-safe/dist/archive-zip-directory.js +4 -0
  46. package/node_modules/@openclaw/fs-safe/dist/archive-zip-entry.d.ts +11 -11
  47. package/node_modules/@openclaw/fs-safe/dist/archive-zip-entry.js +3 -35
  48. package/node_modules/@openclaw/fs-safe/dist/archive-zip-integrity.d.ts +2 -2
  49. package/node_modules/@openclaw/fs-safe/dist/archive-zip-integrity.js +2 -12
  50. package/node_modules/@openclaw/fs-safe/dist/archive-zip-loader.d.ts +7 -3
  51. package/node_modules/@openclaw/fs-safe/dist/archive-zip-loader.js +13 -10
  52. package/node_modules/@openclaw/fs-safe/dist/archive-zip-manifest.js +3 -1
  53. package/node_modules/@openclaw/fs-safe/dist/archive-zip-preflight.d.ts +2 -3
  54. package/node_modules/@openclaw/fs-safe/dist/archive-zip-preflight.js +16 -8
  55. package/node_modules/@openclaw/fs-safe/dist/archive.d.ts +6 -3
  56. package/node_modules/@openclaw/fs-safe/dist/archive.js +22 -19
  57. package/node_modules/@openclaw/fs-safe/dist/atomic.d.ts +1 -1
  58. package/node_modules/@openclaw/fs-safe/dist/copy-publication.d.ts +1 -3
  59. package/node_modules/@openclaw/fs-safe/dist/copy-publication.js +2 -6
  60. package/node_modules/@openclaw/fs-safe/dist/deny-mutation-match.d.ts +2 -0
  61. package/node_modules/@openclaw/fs-safe/dist/deny-mutation-match.js +71 -0
  62. package/node_modules/@openclaw/fs-safe/dist/deny-mutations.js +4 -3
  63. package/node_modules/@openclaw/fs-safe/dist/directory-guard.d.ts +0 -1
  64. package/node_modules/@openclaw/fs-safe/dist/directory-guard.js +0 -3
  65. package/node_modules/@openclaw/fs-safe/dist/directory-mode-node.d.ts +20 -2
  66. package/node_modules/@openclaw/fs-safe/dist/directory-mode-node.js +77 -1
  67. package/node_modules/@openclaw/fs-safe/dist/directory-receipt.js +5 -7
  68. package/node_modules/@openclaw/fs-safe/dist/effective-uid.js +1 -4
  69. package/node_modules/@openclaw/fs-safe/dist/errors.d.ts +3 -1
  70. package/node_modules/@openclaw/fs-safe/dist/errors.js +3 -2
  71. package/node_modules/@openclaw/fs-safe/dist/file-identity.js +10 -2
  72. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-acquisition.js +1 -1
  73. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-admission.js +5 -1
  74. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-held.d.ts +4 -11
  75. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-held.js +1 -4
  76. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-io.d.ts +3 -6
  77. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-io.js +1 -1
  78. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root-options.d.ts +2 -10
  79. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync-root.d.ts +2 -4
  80. package/node_modules/@openclaw/fs-safe/dist/file-lock-sync.js +2 -2
  81. package/node_modules/@openclaw/fs-safe/dist/file-store-boundary.d.ts +3 -7
  82. package/node_modules/@openclaw/fs-safe/dist/file-store-boundary.js +7 -10
  83. package/node_modules/@openclaw/fs-safe/dist/file-store-prune.js +7 -6
  84. package/node_modules/@openclaw/fs-safe/dist/file-store.d.ts +4 -7
  85. package/node_modules/@openclaw/fs-safe/dist/file-store.js +19 -21
  86. package/node_modules/@openclaw/fs-safe/dist/guest-native-python.js +23 -31
  87. package/node_modules/@openclaw/fs-safe/dist/guest.js +21 -12
  88. package/node_modules/@openclaw/fs-safe/dist/json-document-store.d.ts +4 -9
  89. package/node_modules/@openclaw/fs-safe/dist/json-durable-queue-ownership.d.ts +1 -5
  90. package/node_modules/@openclaw/fs-safe/dist/json-durable-queue.d.ts +0 -1
  91. package/node_modules/@openclaw/fs-safe/dist/json-durable-queue.js +2 -7
  92. package/node_modules/@openclaw/fs-safe/dist/local-file-access.js +2 -5
  93. package/node_modules/@openclaw/fs-safe/dist/local-file-descriptor.d.ts +2 -5
  94. package/node_modules/@openclaw/fs-safe/dist/local-roots.d.ts +2 -7
  95. package/node_modules/@openclaw/fs-safe/dist/move-path-cleanup.js +4 -4
  96. package/node_modules/@openclaw/fs-safe/dist/mutation-authority.js +5 -0
  97. package/node_modules/@openclaw/fs-safe/dist/native-binding.d.ts +51 -14
  98. package/node_modules/@openclaw/fs-safe/dist/native-pinned-write.js +8 -2
  99. package/node_modules/@openclaw/fs-safe/dist/native-staged-symlink.d.ts +13 -0
  100. package/node_modules/@openclaw/fs-safe/dist/native-staged-symlink.js +303 -0
  101. package/node_modules/@openclaw/fs-safe/dist/owner-dacl-batch-worker.d.ts +1 -0
  102. package/node_modules/@openclaw/fs-safe/dist/owner-dacl-batch-worker.js +54 -0
  103. package/node_modules/@openclaw/fs-safe/dist/owner-dacl-batch.d.ts +5 -0
  104. package/node_modules/@openclaw/fs-safe/dist/owner-dacl-batch.js +64 -0
  105. package/node_modules/@openclaw/fs-safe/dist/owner-dacl.d.ts +2 -0
  106. package/node_modules/@openclaw/fs-safe/dist/owner-dacl.js +3 -0
  107. package/node_modules/@openclaw/fs-safe/dist/path.js +17 -1
  108. package/node_modules/@openclaw/fs-safe/dist/permission-exec.d.ts +6 -0
  109. package/node_modules/@openclaw/fs-safe/dist/permission-exec.js +3 -6
  110. package/node_modules/@openclaw/fs-safe/dist/permissions-public.d.ts +3 -1
  111. package/node_modules/@openclaw/fs-safe/dist/permissions-public.js +1 -0
  112. package/node_modules/@openclaw/fs-safe/dist/permissions-windows.d.ts +3 -6
  113. package/node_modules/@openclaw/fs-safe/dist/permissions.d.ts +3 -10
  114. package/node_modules/@openclaw/fs-safe/dist/permissions.js +0 -1
  115. package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-admission.d.ts +0 -1
  116. package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-admission.js +4 -2
  117. package/node_modules/@openclaw/fs-safe/dist/pinned-mutation-shared-route.d.ts +2 -8
  118. package/node_modules/@openclaw/fs-safe/dist/pinned-open.d.ts +1 -1
  119. package/node_modules/@openclaw/fs-safe/dist/pinned-open.js +2 -3
  120. package/node_modules/@openclaw/fs-safe/dist/publish-copy-stage.js +4 -0
  121. package/node_modules/@openclaw/fs-safe/dist/read-opened-file.d.ts +2 -5
  122. package/node_modules/@openclaw/fs-safe/dist/regular-file.js +3 -3
  123. package/node_modules/@openclaw/fs-safe/dist/replace-directory.js +5 -17
  124. package/node_modules/@openclaw/fs-safe/dist/replace-file-buffer.d.ts +4 -0
  125. package/node_modules/@openclaw/fs-safe/dist/replace-file-buffer.js +36 -0
  126. package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-fallback.d.ts +4 -10
  127. package/node_modules/@openclaw/fs-safe/dist/replace-file-copy-fallback.js +66 -38
  128. package/node_modules/@openclaw/fs-safe/dist/replace-file-descriptor.d.ts +7 -11
  129. package/node_modules/@openclaw/fs-safe/dist/replace-file-descriptor.js +10 -2
  130. package/node_modules/@openclaw/fs-safe/dist/replace-file-destination.d.ts +21 -0
  131. package/node_modules/@openclaw/fs-safe/dist/replace-file-destination.js +123 -0
  132. package/node_modules/@openclaw/fs-safe/dist/replace-file-mutation.d.ts +26 -0
  133. package/node_modules/@openclaw/fs-safe/dist/replace-file-mutation.js +47 -0
  134. package/node_modules/@openclaw/fs-safe/dist/replace-file-temp-owner.d.ts +2 -2
  135. package/node_modules/@openclaw/fs-safe/dist/replace-file-temp-owner.js +16 -4
  136. package/node_modules/@openclaw/fs-safe/dist/replace-file-types.d.ts +55 -0
  137. package/node_modules/@openclaw/fs-safe/dist/replace-file-types.js +1 -0
  138. package/node_modules/@openclaw/fs-safe/dist/replace-file.d.ts +3 -55
  139. package/node_modules/@openclaw/fs-safe/dist/replace-file.js +31 -11
  140. package/node_modules/@openclaw/fs-safe/dist/retained-directory-replacement.d.ts +1 -0
  141. package/node_modules/@openclaw/fs-safe/dist/retained-directory-replacement.js +1 -1
  142. package/node_modules/@openclaw/fs-safe/dist/retained-file-types.d.ts +50 -0
  143. package/node_modules/@openclaw/fs-safe/dist/retained-file-types.js +1 -0
  144. package/node_modules/@openclaw/fs-safe/dist/retained-file.d.ts +3 -0
  145. package/node_modules/@openclaw/fs-safe/dist/retained-file.js +121 -0
  146. package/node_modules/@openclaw/fs-safe/dist/root-context.js +3 -2
  147. package/node_modules/@openclaw/fs-safe/dist/root-directory-entry.d.ts +9 -0
  148. package/node_modules/@openclaw/fs-safe/dist/root-directory-entry.js +28 -0
  149. package/node_modules/@openclaw/fs-safe/dist/root-directory-list.d.ts +9 -1
  150. package/node_modules/@openclaw/fs-safe/dist/root-directory-list.js +88 -37
  151. package/node_modules/@openclaw/fs-safe/dist/root-file-final-admission.d.ts +1 -1
  152. package/node_modules/@openclaw/fs-safe/dist/root-file-final-admission.js +1 -6
  153. package/node_modules/@openclaw/fs-safe/dist/root-file.js +2 -5
  154. package/node_modules/@openclaw/fs-safe/dist/root-handle-context.d.ts +4 -0
  155. package/node_modules/@openclaw/fs-safe/dist/root-handle-context.js +12 -0
  156. package/node_modules/@openclaw/fs-safe/dist/root-impl.d.ts +3 -3
  157. package/node_modules/@openclaw/fs-safe/dist/root-impl.js +8 -5
  158. package/node_modules/@openclaw/fs-safe/dist/root-move-noreplace.d.ts +2 -7
  159. package/node_modules/@openclaw/fs-safe/dist/root-move-noreplace.js +3 -3
  160. package/node_modules/@openclaw/fs-safe/dist/root-observed-path.d.ts +0 -1
  161. package/node_modules/@openclaw/fs-safe/dist/root-observed-path.js +0 -3
  162. package/node_modules/@openclaw/fs-safe/dist/root-path-observation.d.ts +4 -11
  163. package/node_modules/@openclaw/fs-safe/dist/root-path.js +7 -10
  164. package/node_modules/@openclaw/fs-safe/dist/root-paths.d.ts +2 -6
  165. package/node_modules/@openclaw/fs-safe/dist/root-remove-identity.d.ts +1 -3
  166. package/node_modules/@openclaw/fs-safe/dist/root-walk.d.ts +19 -12
  167. package/node_modules/@openclaw/fs-safe/dist/root-walk.js +56 -20
  168. package/node_modules/@openclaw/fs-safe/dist/root-write-admission.js +1 -6
  169. package/node_modules/@openclaw/fs-safe/dist/root-write-complete-parent.d.ts +2 -0
  170. package/node_modules/@openclaw/fs-safe/dist/root-write-complete-parent.js +1 -1
  171. package/node_modules/@openclaw/fs-safe/dist/safe-path-segment.d.ts +1 -0
  172. package/node_modules/@openclaw/fs-safe/dist/safe-path-segment.js +8 -2
  173. package/node_modules/@openclaw/fs-safe/dist/secret-file.d.ts +6 -2
  174. package/node_modules/@openclaw/fs-safe/dist/secret-file.js +12 -16
  175. package/node_modules/@openclaw/fs-safe/dist/secret-read-policy.js +1 -1
  176. package/node_modules/@openclaw/fs-safe/dist/secure-file-windows.js +5 -14
  177. package/node_modules/@openclaw/fs-safe/dist/secure-file.js +3 -2
  178. package/node_modules/@openclaw/fs-safe/dist/secure-temp-dir.js +2 -7
  179. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-acquire.js +4 -4
  180. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-admission-parser.d.ts +1 -2
  181. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-handle.d.ts +2 -8
  182. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-policy.d.ts +2 -7
  183. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-reclaim.d.ts +2 -2
  184. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-reclaim.js +11 -12
  185. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock-stale-admission.d.ts +1 -5
  186. package/node_modules/@openclaw/fs-safe/dist/sidecar-lock.js +9 -7
  187. package/node_modules/@openclaw/fs-safe/dist/staged-symlink-types.d.ts +39 -0
  188. package/node_modules/@openclaw/fs-safe/dist/staged-symlink-types.js +1 -0
  189. package/node_modules/@openclaw/fs-safe/dist/stat-observation.js +3 -10
  190. package/node_modules/@openclaw/fs-safe/dist/strict-file-identity.d.ts +2 -0
  191. package/node_modules/@openclaw/fs-safe/dist/strict-file-identity.js +6 -6
  192. package/node_modules/@openclaw/fs-safe/dist/symlink-parents.js +58 -7
  193. package/node_modules/@openclaw/fs-safe/dist/temp-target.js +8 -10
  194. package/node_modules/@openclaw/fs-safe/dist/temp-workspace-admission.js +28 -33
  195. package/node_modules/@openclaw/fs-safe/dist/temp-workspace-child-admission.d.ts +1 -1
  196. package/node_modules/@openclaw/fs-safe/dist/temp-workspace-child-admission.js +16 -17
  197. package/node_modules/@openclaw/fs-safe/dist/temp-workspace-descriptor.js +1 -2
  198. package/node_modules/@openclaw/fs-safe/dist/temp-workspace-owner.js +4 -9
  199. package/node_modules/@openclaw/fs-safe/dist/temp-workspace-ownership.d.ts +8 -0
  200. package/node_modules/@openclaw/fs-safe/dist/temp-workspace-ownership.js +52 -0
  201. package/node_modules/@openclaw/fs-safe/dist/test-hooks.d.ts +5 -1
  202. package/node_modules/@openclaw/fs-safe/dist/text-atomic.d.ts +2 -1
  203. package/node_modules/@openclaw/fs-safe/dist/text-atomic.js +2 -0
  204. package/node_modules/@openclaw/fs-safe/dist/trash.js +27 -1
  205. package/node_modules/@openclaw/fs-safe/dist/walk.d.ts +2 -5
  206. package/node_modules/@openclaw/fs-safe/dist/watch-alias.d.ts +6 -0
  207. package/node_modules/@openclaw/fs-safe/dist/watch-alias.js +88 -0
  208. package/node_modules/@openclaw/fs-safe/dist/watch-hints.d.ts +9 -0
  209. package/node_modules/@openclaw/fs-safe/dist/watch-hints.js +93 -0
  210. package/node_modules/@openclaw/fs-safe/dist/watch-native.d.ts +36 -0
  211. package/node_modules/@openclaw/fs-safe/dist/watch-native.js +73 -0
  212. package/node_modules/@openclaw/fs-safe/dist/watch-scan.d.ts +28 -0
  213. package/node_modules/@openclaw/fs-safe/dist/watch-scan.js +300 -0
  214. package/node_modules/@openclaw/fs-safe/dist/watch-stream.d.ts +8 -0
  215. package/node_modules/@openclaw/fs-safe/dist/watch-stream.js +32 -0
  216. package/node_modules/@openclaw/fs-safe/dist/watch-types.d.ts +60 -0
  217. package/node_modules/@openclaw/fs-safe/dist/watch-types.js +1 -0
  218. package/node_modules/@openclaw/fs-safe/dist/watch.d.ts +5 -0
  219. package/node_modules/@openclaw/fs-safe/dist/watch.js +530 -0
  220. package/node_modules/@openclaw/fs-safe/dist/windows-owner.d.ts +3 -7
  221. package/node_modules/@openclaw/fs-safe/dist/windows-owner.js +0 -1
  222. package/node_modules/@openclaw/fs-safe/dist/windows-security-bridge.cs +6 -6
  223. package/node_modules/@openclaw/fs-safe/dist/windows-security-bridge.ps1 +78 -3
  224. package/node_modules/@openclaw/fs-safe/dist/windows-security-command.d.ts +8 -0
  225. package/node_modules/@openclaw/fs-safe/dist/windows-security-command.js +66 -15
  226. package/node_modules/@openclaw/fs-safe/dist/windows-security-facts.d.ts +4 -0
  227. package/node_modules/@openclaw/fs-safe/dist/windows-security-facts.js +6 -2
  228. package/node_modules/@openclaw/fs-safe/docs/advanced.md +4 -2
  229. package/node_modules/@openclaw/fs-safe/docs/archive.md +16 -0
  230. package/node_modules/@openclaw/fs-safe/docs/atomic.md +93 -3
  231. package/node_modules/@openclaw/fs-safe/docs/contributing.md +102 -4
  232. package/node_modules/@openclaw/fs-safe/docs/copy.md +2 -0
  233. package/node_modules/@openclaw/fs-safe/docs/durability.md +7 -0
  234. package/node_modules/@openclaw/fs-safe/docs/file-store.md +5 -0
  235. package/node_modules/@openclaw/fs-safe/docs/guest.md +7 -1
  236. package/node_modules/@openclaw/fs-safe/docs/index.md +1 -0
  237. package/node_modules/@openclaw/fs-safe/docs/install.md +30 -0
  238. package/node_modules/@openclaw/fs-safe/docs/native-helper.md +20 -4
  239. package/node_modules/@openclaw/fs-safe/docs/native.md +63 -1
  240. package/node_modules/@openclaw/fs-safe/docs/permissions.md +66 -0
  241. package/node_modules/@openclaw/fs-safe/docs/public-api.md +30 -3
  242. package/node_modules/@openclaw/fs-safe/docs/retained-file.md +115 -0
  243. package/node_modules/@openclaw/fs-safe/docs/root.md +35 -9
  244. package/node_modules/@openclaw/fs-safe/docs/secret-file.md +19 -0
  245. package/node_modules/@openclaw/fs-safe/docs/security-model.md +4 -1
  246. package/node_modules/@openclaw/fs-safe/docs/sidecar-lock.md +5 -1
  247. package/node_modules/@openclaw/fs-safe/docs/staged-symlink.md +124 -0
  248. package/node_modules/@openclaw/fs-safe/docs/store.md +3 -1
  249. package/node_modules/@openclaw/fs-safe/docs/temp.md +24 -4
  250. package/node_modules/@openclaw/fs-safe/docs/testing.md +210 -0
  251. package/node_modules/@openclaw/fs-safe/docs/types.md +6 -0
  252. package/node_modules/@openclaw/fs-safe/docs/walk.md +34 -1
  253. package/node_modules/@openclaw/fs-safe/docs/watch.md +251 -0
  254. package/node_modules/@openclaw/fs-safe/docs/writing.md +21 -0
  255. package/node_modules/@openclaw/fs-safe/package.json +13 -9
  256. package/node_modules/@openclaw/fs-safe-darwin-arm64/fs-safe-native.node +0 -0
  257. package/node_modules/@openclaw/fs-safe-darwin-arm64/package.json +1 -1
  258. package/node_modules/@openclaw/fs-safe-darwin-x64/fs-safe-native.node +0 -0
  259. package/node_modules/@openclaw/fs-safe-darwin-x64/package.json +1 -1
  260. package/node_modules/@openclaw/fs-safe-linux-arm64-gnu/fs-safe-native.node +0 -0
  261. package/node_modules/@openclaw/fs-safe-linux-arm64-gnu/package.json +1 -1
  262. package/node_modules/@openclaw/fs-safe-linux-arm64-musl/fs-safe-native.node +0 -0
  263. package/node_modules/@openclaw/fs-safe-linux-arm64-musl/package.json +1 -1
  264. package/node_modules/@openclaw/fs-safe-linux-x64-gnu/fs-safe-native.node +0 -0
  265. package/node_modules/@openclaw/fs-safe-linux-x64-gnu/package.json +1 -1
  266. package/node_modules/@openclaw/fs-safe-linux-x64-musl/fs-safe-native.node +0 -0
  267. package/node_modules/@openclaw/fs-safe-linux-x64-musl/package.json +1 -1
  268. package/node_modules/@openclaw/fs-safe-win32-x64-msvc/fs-safe-native.node +0 -0
  269. package/node_modules/@openclaw/fs-safe-win32-x64-msvc/package.json +1 -1
  270. package/package.json +5 -5
  271. package/dist/.setup/api-B9-B1L7Q.mjs +0 -17
  272. package/dist/.setup/client-adapter-dvFa47YL.mjs +0 -63
  273. package/dist/.setup/rolldown-runtime-8H4AJuhK.mjs +0 -14
  274. package/dist/.setup/send.runtime-CLnCWvrM.mjs +0 -2
  275. package/dist/.setup/transport-detection-CoiRl7Gx.mjs +0 -576
  276. package/dist/.setup/transport-detection.runtime-Tlhuv3T_.mjs +0 -2
  277. package/dist/.setup/transport-probes.runtime-WprAyBbL.mjs +0 -2
  278. package/node_modules/@openclaw/fs-safe/dist/directory-mode-owner.d.ts +0 -20
  279. package/node_modules/@openclaw/fs-safe/dist/directory-mode-owner.js +0 -78
@@ -1,15 +1,16 @@
1
- import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.mjs";
1
+ import { o as __exportAll } from "./doctor-contract-api-Db9V9gsY.mjs";
2
2
  import { i as normalizeSignalTransportHost } from "./transport-url-CAC0JcuI.mjs";
3
- import { i as resolveSignalAccount, o as resolveSignalReplyToMode } from "./accounts-BV6tDOTc.mjs";
3
+ import { i as resolveSignalAccount, o as resolveSignalReplyToMode } from "./accounts-DMtj2E-4.mjs";
4
4
  import { n as normalizeSignalMessagingTarget } from "./normalize-l_b99hap.mjs";
5
- import { a as normalizeSignalAllowRecipient, c as resolveSignalSender, i as isSignalSenderAllowed, l as looksLikeUuid, n as formatSignalSenderDisplay, o as resolveSignalPeerId, r as formatSignalSenderId, s as resolveSignalRecipient, t as formatSignalPairingIdLine } from "./identity-YXPmgFMu.mjs";
6
- import { a as getSignalRuntime, i as getOptionalSignalRuntime, l as resolveSignalReactionLevel, n as registerSignalReplyContext, p as isSignalNativeApprovalHandlerConfigured, s as materializeSignalPresentationFallback, u as formatSignalMediaText } from "./transport-detection-CoiRl7Gx.mjs";
7
- import { a as prepareSignalSocketPath, t as SignalSseRejectionError } from "./client-BseAt7F7.mjs";
8
- import { n as signalRpcRequest, r as streamSignalEvents, t as signalCheck } from "./client-adapter-dvFa47YL.mjs";
9
- import { n as sendReactionSignal } from "./reaction-runtime-api-BnQGHcrB.mjs";
10
- import { i as maybeResolveSignalApprovalReaction, o as registerSignalApprovalReactionTargetForDeliveredPayload, s as resolveSignalApprovalConversationKey, t as addSignalApprovalReactionHintToStructuredPayload } from "./approval-reactions-DDQvPP_z.mjs";
11
- import { r as registerSignalQuestionReactionTargetForDeliveredPayload, t as maybeResolveSignalQuestionReaction } from "./question-reactions-C8cSEjVf.mjs";
12
- import { n as sendReadReceiptSignal, r as sendTypingSignal, t as sendMessageSignal } from "./send-B78M_eFp.mjs";
5
+ import { a as normalizeSignalAllowRecipient, c as resolveSignalSender, i as isSignalSenderAllowed, l as looksLikeUuid, n as formatSignalSenderDisplay, o as resolveSignalPeerId, r as formatSignalSenderId, s as resolveSignalRecipient, t as formatSignalPairingIdLine } from "./identity-B3JyPqGO.mjs";
6
+ import { _ as resolveSignalReactionLevel, m as materializeSignalPresentationFallback, p as registerSignalReplyContext, v as formatSignalMediaText, x as isSignalNativeApprovalHandlerConfigured } from "./channel-DrUxv5cf.mjs";
7
+ import { a as prepareSignalSocketPath, t as SignalSseRejectionError } from "./client-AXcDteBZ.mjs";
8
+ import { n as signalRpcRequest, r as streamSignalEvents, t as signalCheck } from "./client-adapter-c_O1ouxZ.mjs";
9
+ import { n as sendReactionSignal } from "./reaction-runtime-api-DDi5x2wC.mjs";
10
+ import { n as getSignalRuntime, t as getOptionalSignalRuntime } from "./runtime-8sxUF217.mjs";
11
+ import { i as maybeResolveSignalApprovalReaction, s as resolveSignalApprovalConversationKey, t as addSignalApprovalReactionHintToStructuredPayload } from "./approval-reactions-BKkjIAoi.mjs";
12
+ import { n as registerSignalReactionTargetsForDeliveredPayload, r as maybeResolveSignalQuestionReaction } from "./reaction-targets-CEdyjtrC.mjs";
13
+ import { n as sendReadReceiptSignal, r as sendTypingSignal, t as sendMessageSignal } from "./send-DEjrbpIC.mjs";
13
14
  import { bindIngressLifecycleToReplyOptions, createChannelIngressError, createChannelIngressMonitor, createChannelMessageReplyPipeline, resolveChannelStreamingBlockEnabled } from "openclaw/plugin-sdk/channel-outbound";
14
15
  import { createChannelPairingChallengeIssuer } from "openclaw/plugin-sdk/channel-pairing";
15
16
  import { resolveAgentRoute, resolveInboundLastRouteSessionKey } from "openclaw/plugin-sdk/routing";
@@ -150,15 +151,13 @@ function spawnSignalDaemon(opts) {
150
151
  const log = opts.runtime?.log ?? (() => {});
151
152
  const error = opts.runtime?.error ?? (() => {});
152
153
  let exited = false;
153
- let settledExit = false;
154
154
  let stopPromise;
155
155
  let resolveExit;
156
156
  const exitedPromise = new Promise((resolve) => {
157
157
  resolveExit = resolve;
158
158
  });
159
159
  const settleExit = (value) => {
160
- if (settledExit) return;
161
- settledExit = true;
160
+ if (exited) return;
162
161
  exited = true;
163
162
  resolveExit(value);
164
163
  };
@@ -547,10 +546,6 @@ function resolveSignalQuoteContext(params) {
547
546
  });
548
547
  return {
549
548
  contextVisibilityMode,
550
- decision: {
551
- include: Boolean(visibleQuote),
552
- reason: visibleQuote ? contextVisibilityMode === "all" ? "mode_all" : quoteSenderAllowed ? "sender_allowed" : "quote_override" : "blocked"
553
- },
554
549
  quoteSenderAllowed,
555
550
  visibleQuoteText: visibleQuote?.body ?? "",
556
551
  visibleQuoteSender: visibleQuote?.sender
@@ -583,10 +578,10 @@ function normalizeAccountPhone(account) {
583
578
  const trimmed = account?.trim();
584
579
  return trimmed ? normalizeE164(trimmed) : void 0;
585
580
  }
586
- function resolveSignalNativeMentionFacts(params) {
587
- const validMentions = (params.mentions ?? []).filter((mention) => isValidStructuredMention(params.message, mention));
588
- const botUuid = params.accountUuid?.trim();
589
- const botPhone = normalizeAccountPhone(params.account);
581
+ function resolveSignalMentionFacts(identity, message, mentions) {
582
+ const validMentions = (mentions ?? []).filter((mention) => isValidStructuredMention(message, mention));
583
+ const botUuid = identity.accountUuid?.trim();
584
+ const botPhone = normalizeAccountPhone(identity.account);
590
585
  const canDetectBotMention = Boolean(botUuid || botPhone);
591
586
  const mentionsBot = validMentions.some((mention) => {
592
587
  const mentionUuid = mention.uuid?.trim();
@@ -600,14 +595,6 @@ function resolveSignalNativeMentionFacts(params) {
600
595
  mentionsBot
601
596
  };
602
597
  }
603
- function resolveSignalMentionFacts(identity, message, mentions) {
604
- return resolveSignalNativeMentionFacts({
605
- message,
606
- mentions,
607
- account: identity.account,
608
- accountUuid: identity.accountUuid
609
- });
610
- }
611
598
  function renderSignalMentions(message, mentions) {
612
599
  if (!message || !mentions?.length) return message;
613
600
  let normalized = message;
@@ -623,6 +610,64 @@ function renderSignalMentions(message, mentions) {
623
610
  return normalized;
624
611
  }
625
612
  //#endregion
613
+ //#region extensions/signal/src/monitor/reactions.ts
614
+ function resolveSignalStatusReactionTimestamp(params) {
615
+ if (typeof params.timestamp === "number") return Number.isFinite(params.timestamp) && params.timestamp > 0 ? params.timestamp : null;
616
+ const parsed = Number(params.messageId);
617
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
618
+ }
619
+ function resolveSignalReactionTargets(reaction) {
620
+ const targets = [];
621
+ const uuid = reaction.targetAuthorUuid?.trim();
622
+ if (uuid) targets.push({
623
+ kind: "uuid",
624
+ id: uuid,
625
+ display: `uuid:${uuid}`
626
+ });
627
+ const author = reaction.targetAuthor?.trim();
628
+ if (author) {
629
+ const normalized = normalizeE164(author);
630
+ targets.push({
631
+ kind: "phone",
632
+ id: normalized,
633
+ display: normalized
634
+ });
635
+ }
636
+ return targets;
637
+ }
638
+ function isSignalReactionMessage(reaction) {
639
+ if (!reaction) return false;
640
+ const emoji = reaction.emoji?.trim();
641
+ const timestamp = reaction.targetSentTimestamp;
642
+ const hasTarget = Boolean(normalizeOptionalString(reaction.targetAuthor) || normalizeOptionalString(reaction.targetAuthorUuid));
643
+ return Boolean(emoji && typeof timestamp === "number" && timestamp > 0 && hasTarget);
644
+ }
645
+ function shouldEmitSignalReactionNotification(params) {
646
+ const { mode, account, accountUuid, targets, sender, allowlist } = params;
647
+ const effectiveMode = mode ?? "own";
648
+ if (effectiveMode === "off") return false;
649
+ if (effectiveMode === "own") {
650
+ const accountId = normalizeOptionalString(account);
651
+ const normalizedAccountUuid = normalizeOptionalString(accountUuid);
652
+ if (!accountId && !normalizedAccountUuid || !targets || targets.length === 0) return false;
653
+ const normalizedAccount = accountId ? normalizeE164(accountId) : void 0;
654
+ return targets.some((target) => {
655
+ if (target.kind === "uuid") return [accountId, normalizedAccountUuid].some((candidate) => candidate === target.id || candidate === `uuid:${target.id}`);
656
+ return Boolean(normalizedAccount) && normalizedAccount === target.id;
657
+ });
658
+ }
659
+ if (effectiveMode === "allowlist") {
660
+ if (!sender || !allowlist || allowlist.length === 0) return false;
661
+ return isSignalSenderAllowed(sender, allowlist);
662
+ }
663
+ return true;
664
+ }
665
+ function buildSignalReactionSystemEventText(params) {
666
+ const base = `Signal reaction added: ${params.emojiLabel} by ${params.actorLabel} msg ${params.messageId}`;
667
+ const withTarget = params.targetLabel ? `${base} from ${params.targetLabel}` : base;
668
+ return params.groupLabel ? `${withTarget} in ${params.groupLabel}` : withTarget;
669
+ }
670
+ //#endregion
626
671
  //#region extensions/signal/src/monitor/event-handler.ts
627
672
  const REPLY_SESSION_INIT_CONFLICT_MESSAGE_RE = /reply session initialization conflicted for \S+/u;
628
673
  const RETRYABLE_FLUSH_RETRY_DELAYS_MS = [
@@ -644,21 +689,9 @@ function resolveSignalInboundRoute(params) {
644
689
  }
645
690
  });
646
691
  }
647
- function resolveSignalStatusReactionTimestamp(params) {
648
- if (typeof params.timestamp === "number") return Number.isFinite(params.timestamp) && params.timestamp > 0 ? params.timestamp : null;
649
- const parsed = Number(params.messageId);
650
- return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
651
- }
652
692
  function hasSignalStatusReplyDeliveryFailure(result) {
653
693
  return Object.values(result.settledReceipt?.counts ?? {}).some((counts) => counts.failedBeforeSend > 0 || counts.failedAfterSend > 0);
654
694
  }
655
- function resolveSignalStatusReactionEmojis(emojis) {
656
- if (emojis?.stallHard !== void 0) return emojis;
657
- return {
658
- ...emojis,
659
- stallHard: DEFAULT_EMOJIS.stallSoft
660
- };
661
- }
662
695
  async function finalizeSignalStatusReaction(params) {
663
696
  if (params.outcome === "done") await params.controller.setDone();
664
697
  else await params.controller.setError();
@@ -830,7 +863,7 @@ function createSignalEventHandler(deps) {
830
863
  await sendReactionSignal(statusReactionRecipient, statusReactionTimestamp, emoji, signalReactionOpts);
831
864
  } },
832
865
  initialEmoji: ackReaction,
833
- emojis: resolveSignalStatusReactionEmojis(void 0),
866
+ emojis: { stallHard: DEFAULT_EMOJIS.stallSoft },
834
867
  timing: statusReactionTiming,
835
868
  onError: (err) => {
836
869
  logAckFailure({
@@ -1210,8 +1243,8 @@ function createSignalEventHandler(deps) {
1210
1243
  targetAuthorUuid: params.reaction.targetAuthorUuid,
1211
1244
  logDebug: logVerbose
1212
1245
  })) return true;
1213
- const targets = deps.resolveSignalReactionTargets(params.reaction);
1214
- if (!deps.shouldEmitSignalReactionNotification({
1246
+ const targets = resolveSignalReactionTargets(params.reaction);
1247
+ if (!shouldEmitSignalReactionNotification({
1215
1248
  mode: deps.reactionMode,
1216
1249
  account: deps.account,
1217
1250
  accountUuid: deps.accountUuid,
@@ -1228,7 +1261,7 @@ function createSignalEventHandler(deps) {
1228
1261
  senderPeerId
1229
1262
  });
1230
1263
  const groupLabel = isGroup ? `${groupName ?? "Signal Group"} id:${groupId}` : void 0;
1231
- const text = deps.buildSignalReactionSystemEventText({
1264
+ const text = buildSignalReactionSystemEventText({
1232
1265
  emojiLabel,
1233
1266
  actorLabel: senderName,
1234
1267
  messageId,
@@ -1269,7 +1302,7 @@ function createSignalEventHandler(deps) {
1269
1302
  if (sender.kind === "phone" && normalizedAccount != null && sender.e164 === normalizedAccount || sender.kind === "uuid" && deps.accountUuid != null && sender.raw === deps.accountUuid) return;
1270
1303
  if ("syncMessage" in envelope) return;
1271
1304
  const dataMessage = envelope.dataMessage ?? envelope.editMessage?.dataMessage;
1272
- const reaction = deps.isSignalReactionMessage(envelope.reactionMessage) ? envelope.reactionMessage : deps.isSignalReactionMessage(dataMessage?.reaction) ? dataMessage?.reaction : null;
1305
+ const reaction = isSignalReactionMessage(envelope.reactionMessage) ? envelope.reactionMessage : isSignalReactionMessage(dataMessage?.reaction) ? dataMessage?.reaction : null;
1273
1306
  const rawMessage = dataMessage?.message ?? "";
1274
1307
  const messageText = renderSignalMentions(rawMessage, dataMessage?.mentions).trim();
1275
1308
  const groupId = dataMessage?.groupInfo?.groupId ?? reaction?.groupInfo?.groupId ?? void 0;
@@ -1507,17 +1540,19 @@ function createSignalEventHandler(deps) {
1507
1540
  });
1508
1541
  }
1509
1542
  if (!bodyText && mediaFacts.length === 0 && !visibleQuoteText) return;
1510
- if (deps.sendReadReceipts && !deps.readReceiptsViaDaemon && !isGroup && inboundTimestamp) try {
1511
- await sendReadReceiptSignal(`signal:${senderRecipient}`, inboundTimestamp, {
1512
- cfg,
1513
- baseUrl: deps.baseUrl,
1514
- account: deps.account,
1515
- accountId: deps.accountId
1516
- });
1517
- } catch (err) {
1518
- logVerbose(`signal read receipt failed for ${senderDisplay}: ${String(err)}`);
1543
+ if (deps.sendReadReceipts && !deps.readReceiptsViaDaemon && !isGroup) {
1544
+ if (inboundTimestamp) try {
1545
+ await sendReadReceiptSignal(`signal:${senderRecipient}`, inboundTimestamp, {
1546
+ cfg,
1547
+ baseUrl: deps.baseUrl,
1548
+ account: deps.account,
1549
+ accountId: deps.accountId
1550
+ });
1551
+ } catch (err) {
1552
+ logVerbose(`signal read receipt failed for ${senderDisplay}: ${String(err)}`);
1553
+ }
1554
+ else logVerbose(`signal read receipt skipped (missing timestamp) for ${senderDisplay}`);
1519
1555
  }
1520
- else if (deps.sendReadReceipts && !deps.readReceiptsViaDaemon && !isGroup && !inboundTimestamp) logVerbose(`signal read receipt skipped (missing timestamp) for ${senderDisplay}`);
1521
1556
  const senderName = envelope.sourceName ?? senderDisplay;
1522
1557
  await registerSignalReplyContext({
1523
1558
  accountId: deps.accountId,
@@ -1567,18 +1602,9 @@ function createSignalEventHandler(deps) {
1567
1602
  };
1568
1603
  }
1569
1604
  //#endregion
1570
- //#region extensions/signal/src/reaction-targets.ts
1571
- async function registerSignalReactionTargetsForDeliveredPayload(params) {
1572
- registerSignalQuestionReactionTargetForDeliveredPayload(params);
1573
- await registerSignalApprovalReactionTargetForDeliveredPayload(params);
1574
- }
1575
- //#endregion
1576
1605
  //#region extensions/signal/src/signal-ingress.ts
1577
1606
  const SIGNAL_INGRESS_DRAIN_INTERVAL_MS = 1e3;
1578
1607
  const SignalIngressPermanentError = createChannelIngressError("SignalIngressPermanentError", { withReason: true });
1579
- function normalizeTimestamp(value) {
1580
- return asPositiveSafeInteger(value) ?? null;
1581
- }
1582
1608
  function parseReceivePayload(event) {
1583
1609
  if (event.event !== "receive" || !event.data) return null;
1584
1610
  let parsed;
@@ -1605,8 +1631,8 @@ function inspectSignalIngressEvent(prepared) {
1605
1631
  const senderNumber = normalizeNullableString(envelope.sourceNumber);
1606
1632
  const senderKey = senderUuid ? `uuid:${senderUuid}` : senderNumber ? `number:${senderNumber}` : null;
1607
1633
  if (!senderKey) throw new SignalIngressPermanentError("missing-sender", "Signal dispatchable envelope is missing sourceUuid/sourceNumber");
1608
- const timestamp = normalizeTimestamp(envelope.timestamp) ?? normalizeTimestamp(dataMessage?.timestamp);
1609
- if (timestamp === null) throw new SignalIngressPermanentError("missing-timestamp", "Signal dispatchable envelope is missing a stable timestamp");
1634
+ const timestamp = asPositiveSafeInteger(envelope.timestamp) ?? asPositiveSafeInteger(dataMessage?.timestamp);
1635
+ if (timestamp === void 0) throw new SignalIngressPermanentError("missing-timestamp", "Signal dispatchable envelope is missing a stable timestamp");
1610
1636
  const dataGroup = isRecord(dataMessage?.groupInfo) ? dataMessage.groupInfo : null;
1611
1637
  const reactionGroup = isRecord(reactionMessage?.groupInfo) ? reactionMessage.groupInfo : null;
1612
1638
  const groupId = normalizeNullableString(dataGroup?.groupId) ?? normalizeNullableString(reactionGroup?.groupId);
@@ -1633,7 +1659,7 @@ async function startSignalIngressMonitor(params) {
1633
1659
  const ingressQueue = queue;
1634
1660
  const monitor = createChannelIngressMonitor({
1635
1661
  queue: ingressQueue,
1636
- inspect: (prepared) => inspectSignalIngressEvent(prepared),
1662
+ inspect: inspectSignalIngressEvent,
1637
1663
  payload: {
1638
1664
  version: 1,
1639
1665
  serialize: ([event], { receivedAt }) => ({
@@ -1783,57 +1809,6 @@ function createSignalMonitorTaskRunner(runtime) {
1783
1809
  }
1784
1810
  };
1785
1811
  }
1786
- function resolveSignalReactionTargets(reaction) {
1787
- const targets = [];
1788
- const uuid = reaction.targetAuthorUuid?.trim();
1789
- if (uuid) targets.push({
1790
- kind: "uuid",
1791
- id: uuid,
1792
- display: `uuid:${uuid}`
1793
- });
1794
- const author = reaction.targetAuthor?.trim();
1795
- if (author) {
1796
- const normalized = normalizeE164(author);
1797
- targets.push({
1798
- kind: "phone",
1799
- id: normalized,
1800
- display: normalized
1801
- });
1802
- }
1803
- return targets;
1804
- }
1805
- function isSignalReactionMessage(reaction) {
1806
- if (!reaction) return false;
1807
- const emoji = reaction.emoji?.trim();
1808
- const timestamp = reaction.targetSentTimestamp;
1809
- const hasTarget = Boolean(normalizeOptionalString(reaction.targetAuthor) || normalizeOptionalString(reaction.targetAuthorUuid));
1810
- return Boolean(emoji && typeof timestamp === "number" && timestamp > 0 && hasTarget);
1811
- }
1812
- function shouldEmitSignalReactionNotification(params) {
1813
- const { mode, account, accountUuid, targets, sender, allowlist } = params;
1814
- const effectiveMode = mode ?? "own";
1815
- if (effectiveMode === "off") return false;
1816
- if (effectiveMode === "own") {
1817
- const accountId = normalizeOptionalString(account);
1818
- const normalizedAccountUuid = normalizeOptionalString(accountUuid);
1819
- if (!accountId && !normalizedAccountUuid || !targets || targets.length === 0) return false;
1820
- const normalizedAccount = accountId ? normalizeE164(accountId) : void 0;
1821
- return targets.some((target) => {
1822
- if (target.kind === "uuid") return [accountId, normalizedAccountUuid].some((candidate) => candidate === target.id || candidate === `uuid:${target.id}`);
1823
- return Boolean(normalizedAccount) && normalizedAccount === target.id;
1824
- });
1825
- }
1826
- if (effectiveMode === "allowlist") {
1827
- if (!sender || !allowlist || allowlist.length === 0) return false;
1828
- return isSignalSenderAllowed(sender, allowlist);
1829
- }
1830
- return true;
1831
- }
1832
- function buildSignalReactionSystemEventText(params) {
1833
- const base = `Signal reaction added: ${params.emojiLabel} by ${params.actorLabel} msg ${params.messageId}`;
1834
- const withTarget = params.targetLabel ? `${base} from ${params.targetLabel}` : base;
1835
- return params.groupLabel ? `${withTarget} in ${params.groupLabel}` : withTarget;
1836
- }
1837
1812
  const SIGNAL_ATTACHMENT_RPC_RESPONSE_HEADROOM_BYTES = 65536;
1838
1813
  const SIGNAL_BASE64_OVERHEAD_NUMERATOR = 4;
1839
1814
  const SIGNAL_BASE64_OVERHEAD_DENOMINATOR = 3;
@@ -2092,11 +2067,7 @@ async function monitorSignalProvider(opts = {}) {
2092
2067
  ...params,
2093
2068
  cfg,
2094
2069
  chunkMode
2095
- }),
2096
- resolveSignalReactionTargets,
2097
- isSignalReactionMessage,
2098
- shouldEmitSignalReactionNotification,
2099
- buildSignalReactionSystemEventText
2070
+ })
2100
2071
  });
2101
2072
  ingressMonitor = await startSignalIngressMonitor({
2102
2073
  accountId: accountInfo.accountId,
@@ -1,6 +1,7 @@
1
- import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.mjs";
2
- import { t as detectSignalTransport } from "./transport-detection-CoiRl7Gx.mjs";
3
- import { n as signalRpcRequest, t as signalCheck } from "./client-adapter-dvFa47YL.mjs";
1
+ import { o as __exportAll } from "./doctor-contract-api-Db9V9gsY.mjs";
2
+ import { n as signalRpcRequest, t as signalCheck } from "./client-adapter-c_O1ouxZ.mjs";
3
+ import { t as detectSignalTransport } from "./transport-detection-BVUDE42e.mjs";
4
+ import { normalizeOptionalString, normalizeTrimmedStringList } from "openclaw/plugin-sdk/string-coerce-runtime";
4
5
  import { runChannelProbe } from "openclaw/plugin-sdk/text-utility-runtime";
5
6
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
6
7
  //#region extensions/signal/src/probe.ts
@@ -9,14 +10,13 @@ var probe_exports = /* @__PURE__ */ __exportAll({
9
10
  probeSignalAccount: () => probeSignalAccount
10
11
  });
11
12
  function parseSignalVersion(value) {
12
- if (typeof value === "string" && value.trim()) return value.trim();
13
+ const directVersion = normalizeOptionalString(value);
14
+ if (directVersion) return directVersion;
13
15
  if (typeof value === "object" && value !== null) {
14
16
  const { version, versions } = value;
15
- if (typeof version === "string" && version.trim()) return version.trim();
16
- if (Array.isArray(versions)) {
17
- const normalizedVersions = versions.filter((entry) => typeof entry === "string").map((entry) => entry.trim()).filter(Boolean);
18
- if (normalizedVersions.length > 0) return normalizedVersions.join(", ");
19
- }
17
+ const normalizedVersion = normalizeOptionalString(version);
18
+ if (normalizedVersion) return normalizedVersion;
19
+ return normalizeTrimmedStringList(versions).join(", ") || null;
20
20
  }
21
21
  return null;
22
22
  }
@@ -1,7 +1,7 @@
1
- import { i as resolveSignalAccount } from "./accounts-BV6tDOTc.mjs";
1
+ import { i as resolveSignalAccount } from "./accounts-DMtj2E-4.mjs";
2
2
  import { r as normalizeSignalReactionRecipient } from "./normalize-l_b99hap.mjs";
3
- import { n as signalRpcRequest } from "./client-adapter-dvFa47YL.mjs";
4
- import { t as resolveSignalRpcContext } from "./rpc-context-CwwADZ1b.mjs";
3
+ import { n as signalRpcRequest } from "./client-adapter-c_O1ouxZ.mjs";
4
+ import { t as resolveSignalRpcContext } from "./rpc-context-D26RxFIm.mjs";
5
5
  import { requireRuntimeConfig } from "openclaw/plugin-sdk/plugin-config-runtime";
6
6
  //#region extensions/signal/src/send-reactions.ts
7
7
  async function sendReactionSignalCore(params) {
@@ -43,13 +43,6 @@ async function sendReactionSignalCore(params) {
43
43
  }))?.timestamp
44
44
  };
45
45
  }
46
- /**
47
- * Send a Signal reaction to a message
48
- * @param recipient - UUID or E.164 phone number of the message author
49
- * @param targetTimestamp - Message ID (timestamp) to react to
50
- * @param emoji - Emoji to react with
51
- * @param opts - Optional account/connection overrides
52
- */
53
46
  async function sendReactionSignal(recipient, targetTimestamp, emoji, opts) {
54
47
  return await sendReactionSignalCore({
55
48
  recipient,
@@ -59,13 +52,6 @@ async function sendReactionSignal(recipient, targetTimestamp, emoji, opts) {
59
52
  opts
60
53
  });
61
54
  }
62
- /**
63
- * Remove a Signal reaction from a message
64
- * @param recipient - UUID or E.164 phone number of the message author
65
- * @param targetTimestamp - Message ID (timestamp) to remove reaction from
66
- * @param emoji - Emoji to remove
67
- * @param opts - Optional account/connection overrides
68
- */
69
55
  async function removeReactionSignal(recipient, targetTimestamp, emoji, opts) {
70
56
  return await sendReactionSignalCore({
71
57
  recipient,
@@ -1,13 +1,9 @@
1
- import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.mjs";
2
- import { i as resolveSignalDeliveredConversationKey } from "./approval-auth-BBI9BTRm.mjs";
3
- import { c as resolveSignalApprovalTargetAuthorKeys } from "./approval-reactions-DDQvPP_z.mjs";
1
+ import { o as __exportAll } from "./doctor-contract-api-Db9V9gsY.mjs";
2
+ import { i as resolveSignalDeliveredConversationKey } from "./approval-auth-CszS7gwf.mjs";
3
+ import { c as resolveSignalApprovalTargetAuthorKeys, o as registerSignalApprovalReactionTargetForDeliveredPayload } from "./approval-reactions-BKkjIAoi.mjs";
4
4
  import { createQuestionReactionTargetStore, questionGatewayRuntime } from "openclaw/plugin-sdk/question-gateway-runtime";
5
5
  import { normalizeAccountId } from "openclaw/plugin-sdk/routing";
6
6
  //#region extensions/signal/src/question-reactions.ts
7
- var question_reactions_exports = /* @__PURE__ */ __exportAll({
8
- maybeResolveSignalQuestionReaction: () => maybeResolveSignalQuestionReaction,
9
- registerSignalQuestionReactionTargetForDeliveredPayload: () => registerSignalQuestionReactionTargetForDeliveredPayload
10
- });
11
7
  function buildKey(identity) {
12
8
  const values = [
13
9
  identity.accountId,
@@ -66,4 +62,11 @@ async function maybeResolveSignalQuestionReaction(params) {
66
62
  });
67
63
  }
68
64
  //#endregion
69
- export { question_reactions_exports as n, registerSignalQuestionReactionTargetForDeliveredPayload as r, maybeResolveSignalQuestionReaction as t };
65
+ //#region extensions/signal/src/reaction-targets.ts
66
+ var reaction_targets_exports = /* @__PURE__ */ __exportAll({ registerSignalReactionTargetsForDeliveredPayload: () => registerSignalReactionTargetsForDeliveredPayload });
67
+ async function registerSignalReactionTargetsForDeliveredPayload(params) {
68
+ registerSignalQuestionReactionTargetForDeliveredPayload(params);
69
+ await registerSignalApprovalReactionTargetForDeliveredPayload(params);
70
+ }
71
+ //#endregion
72
+ export { registerSignalReactionTargetsForDeliveredPayload as n, maybeResolveSignalQuestionReaction as r, reaction_targets_exports as t };
@@ -1,4 +1,4 @@
1
- import "./accounts-BV6tDOTc.mjs";
1
+ import "./accounts-DMtj2E-4.mjs";
2
2
  //#region extensions/signal/src/rpc-context.ts
3
3
  function resolveSignalRpcContext(opts, accountInfo) {
4
4
  const baseUrlOverride = opts.baseUrl?.trim();
@@ -0,0 +1,8 @@
1
+ import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
2
+ //#region extensions/signal/src/runtime.ts
3
+ const { setRuntime: setSignalRuntime, getRuntime: getSignalRuntime, tryGetRuntime: getOptionalSignalRuntime } = createPluginRuntimeStore({
4
+ pluginId: "signal",
5
+ errorMessage: "Signal runtime not initialized"
6
+ });
7
+ //#endregion
8
+ export { getSignalRuntime as n, setSignalRuntime as r, getOptionalSignalRuntime as t };
@@ -1,14 +1,21 @@
1
- import { i as resolveSignalAccount } from "./accounts-BV6tDOTc.mjs";
1
+ import { o as __exportAll } from "./doctor-contract-api-Db9V9gsY.mjs";
2
+ import { i as resolveSignalAccount } from "./accounts-DMtj2E-4.mjs";
2
3
  import { n as normalizeSignalMessagingTarget } from "./normalize-l_b99hap.mjs";
3
- import { d as markdownToSignalText, n as registerSignalReplyContext } from "./transport-detection-CoiRl7Gx.mjs";
4
- import { n as signalRpcRequest } from "./client-adapter-dvFa47YL.mjs";
5
- import { t as resolveSignalRpcContext } from "./rpc-context-CwwADZ1b.mjs";
4
+ import { p as registerSignalReplyContext, y as markdownToSignalText } from "./channel-DrUxv5cf.mjs";
5
+ import { o as isSignalQuoteMetadataRejection } from "./client-AXcDteBZ.mjs";
6
+ import { n as signalRpcRequest } from "./client-adapter-c_O1ouxZ.mjs";
7
+ import { t as resolveSignalRpcContext } from "./rpc-context-D26RxFIm.mjs";
6
8
  import { createMessageReceiptFromOutboundResults } from "openclaw/plugin-sdk/channel-outbound";
7
9
  import { resolveMarkdownTableMode } from "openclaw/plugin-sdk/markdown-table-runtime";
8
- import { normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
10
+ import { asPositiveSafeInteger, normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
9
11
  import { kindFromMime, resolveOutboundAttachmentFromUrl } from "openclaw/plugin-sdk/media-runtime";
10
12
  import { requireRuntimeConfig } from "openclaw/plugin-sdk/plugin-config-runtime";
11
13
  //#region extensions/signal/src/send.ts
14
+ var send_exports = /* @__PURE__ */ __exportAll({
15
+ sendMessageSignal: () => sendMessageSignal,
16
+ sendReadReceiptSignal: () => sendReadReceiptSignal,
17
+ sendTypingSignal: () => sendTypingSignal
18
+ });
12
19
  function assertSignalRecipientDelivery(result, target) {
13
20
  if (!Array.isArray(result?.results)) return;
14
21
  const failures = [];
@@ -27,7 +34,6 @@ function assertSignalRecipientDelivery(result, target) {
27
34
  throw new Error(`Signal send failed for ${failures.length} recipient${failures.length === 1 ? "" : "s"}: ${[...new Set(failures)].join(", ")}`);
28
35
  }
29
36
  async function resolveSignalRpcAccountInfo(opts) {
30
- if (!opts.cfg) throw new Error("Signal RPC account resolution requires a resolved runtime config. Load and resolve config at the command or gateway boundary, then pass cfg through the runtime path.");
31
37
  const cfg = requireRuntimeConfig(opts.cfg, "Signal RPC account resolution");
32
38
  return resolveSignalAccount({
33
39
  cfg,
@@ -51,20 +57,10 @@ function parseTarget(raw) {
51
57
  recipient: value
52
58
  };
53
59
  }
54
- function buildTargetParams(target, allow) {
55
- if (target.type === "recipient") {
56
- if (!allow.recipient) return null;
57
- return { recipient: [target.recipient] };
58
- }
59
- if (target.type === "group") {
60
- if (!allow.group) return null;
61
- return { groupId: target.groupId };
62
- }
63
- if (target.type === "username") {
64
- if (!allow.username) return null;
65
- return { username: [target.username] };
66
- }
67
- return null;
60
+ function buildTargetParams(target) {
61
+ if (target.type === "recipient") return { recipient: [target.recipient] };
62
+ if (target.type === "group") return { groupId: target.groupId };
63
+ return { username: [target.username] };
68
64
  }
69
65
  function createSignalSendReceipt(params) {
70
66
  const messageId = params.messageId.trim();
@@ -94,9 +90,7 @@ function createSignalSendReceipt(params) {
94
90
  function parseSignalReplyTimestamp(raw) {
95
91
  const value = normalizeOptionalString(raw);
96
92
  if (!value || !/^\d+$/.test(value)) return;
97
- const timestamp = Number(value);
98
- if (!Number.isSafeInteger(timestamp) || timestamp <= 0) return;
99
- return timestamp;
93
+ return asPositiveSafeInteger(Number(value));
100
94
  }
101
95
  function resolveSignalQuoteParams(opts) {
102
96
  const timestamp = parseSignalReplyTimestamp(opts.replyToId);
@@ -111,21 +105,6 @@ function resolveSignalQuoteParams(opts) {
111
105
  }
112
106
  };
113
107
  }
114
- function isSignalQuoteMetadataRejection(error) {
115
- const message = error instanceof Error ? error.message : String(error);
116
- const normalized = normalizeLowercaseStringOrEmpty(message);
117
- const rpcCode = /^signal rpc (-?\d+):/u.exec(normalized)?.[1];
118
- if (rpcCode !== void 0) {
119
- if (rpcCode !== "-32602") return false;
120
- } else {
121
- const restStatusText = /^signal rest (\d{3}):/u.exec(normalized)?.[1];
122
- if (!restStatusText) return false;
123
- const restStatus = Number(restStatusText);
124
- if (restStatus < 400 || restStatus >= 500 || restStatus === 408 || restStatus === 429) return false;
125
- }
126
- if (!normalized.includes("quote")) return false;
127
- return normalized.includes("reject") || normalized.includes("invalid") || normalized.includes("unrecognized") || normalized.includes("unsupported") || normalized.includes("not found") || normalized.includes("no such") || normalized.includes("unknown");
128
- }
129
108
  async function sendMessageSignal(to, text, opts) {
130
109
  const cfg = requireRuntimeConfig(opts.cfg, "Signal send");
131
110
  const accountInfo = resolveSignalAccount({
@@ -177,13 +156,7 @@ async function sendMessageSignal(to, text, opts) {
177
156
  if (textStyles.length > 0) params["text-style"] = textStyles.map((style) => `${style.start}:${style.length}:${style.style}`);
178
157
  if (account) params.account = account;
179
158
  if (attachments && attachments.length > 0) params.attachments = attachments;
180
- const targetParams = buildTargetParams(target, {
181
- recipient: true,
182
- group: true,
183
- username: true
184
- });
185
- if (!targetParams) throw new Error("Signal recipient is required");
186
- Object.assign(params, targetParams);
159
+ Object.assign(params, buildTargetParams(target));
187
160
  const quote = resolveSignalQuoteParams(opts);
188
161
  const sendOpts = {
189
162
  baseUrl,
@@ -237,12 +210,9 @@ async function sendMessageSignal(to, text, opts) {
237
210
  async function sendTypingSignal(to, opts) {
238
211
  const accountInfo = await resolveSignalRpcAccountInfo(opts);
239
212
  const { baseUrl, account } = resolveSignalRpcContext(opts, accountInfo);
240
- const targetParams = buildTargetParams(parseTarget(to), {
241
- recipient: true,
242
- group: true
243
- });
244
- if (!targetParams) return false;
245
- const params = { ...targetParams };
213
+ const target = parseTarget(to);
214
+ if (target.type === "username") return false;
215
+ const params = buildTargetParams(target);
246
216
  if (account) params.account = account;
247
217
  if (opts.stop) params.stop = true;
248
218
  await signalRpcRequest("sendTyping", params, {
@@ -256,10 +226,10 @@ async function sendReadReceiptSignal(to, targetTimestamp, opts) {
256
226
  if (!Number.isFinite(targetTimestamp) || targetTimestamp <= 0) return false;
257
227
  const accountInfo = await resolveSignalRpcAccountInfo(opts);
258
228
  const { baseUrl, account } = resolveSignalRpcContext(opts, accountInfo);
259
- const targetParams = buildTargetParams(parseTarget(to), { recipient: true });
260
- if (!targetParams) return false;
229
+ const target = parseTarget(to);
230
+ if (target.type !== "recipient") return false;
261
231
  const params = {
262
- ...targetParams,
232
+ ...buildTargetParams(target),
263
233
  targetTimestamp,
264
234
  type: opts.type ?? "read"
265
235
  };
@@ -272,4 +242,4 @@ async function sendReadReceiptSignal(to, targetTimestamp, opts) {
272
242
  return true;
273
243
  }
274
244
  //#endregion
275
- export { sendReadReceiptSignal as n, sendTypingSignal as r, sendMessageSignal as t };
245
+ export { send_exports as i, sendReadReceiptSignal as n, sendTypingSignal as r, sendMessageSignal as t };
@@ -1,6 +1,6 @@
1
- import { i as resolveSignalAccount, n as listSignalAccountIds } from "./accounts-BV6tDOTc.mjs";
2
- import { c as signalNumberTextInput, i as createSignalCliPathTextInput, o as signalCompletionNote, s as signalDmPolicy } from "./channel-DhzTcFsK.mjs";
3
- import { r as installSignalCli } from "./install-signal-cli-BDbzFcU2.mjs";
1
+ import { i as resolveSignalAccount, n as listSignalAccountIds } from "./accounts-DMtj2E-4.mjs";
2
+ import { c as signalNumberTextInput, i as createSignalCliPathTextInput, o as signalCompletionNote, s as signalDmPolicy } from "./channel-DrUxv5cf.mjs";
3
+ import { r as installSignalCli } from "./install-signal-cli-ChvjzM6X.mjs";
4
4
  import { createDetectedBinaryStatus, createSetupTranslator, setSetupChannelEnabled } from "openclaw/plugin-sdk/setup";
5
5
  import { detectBinary } from "openclaw/plugin-sdk/setup-tools";
6
6
  //#region extensions/signal/src/setup-surface.ts
@@ -33,8 +33,6 @@ const managedStatus = createDetectedBinaryStatus({
33
33
  },
34
34
  detectBinary
35
35
  });
36
- //#endregion
37
- //#region extensions/signal/src/channel.runtime.ts
38
36
  const signalSetupWizard = {
39
37
  channel,
40
38
  status: {
@@ -59,7 +57,7 @@ const signalSetupWizard = {
59
57
  accountId
60
58
  }).transport;
61
59
  if (transport.kind !== "managed-native") return;
62
- const currentCliPath = (typeof credentialValues.cliPath === "string" ? credentialValues.cliPath : void 0) ?? (transport.kind === "managed-native" ? transport.cliPath : void 0) ?? "signal-cli";
60
+ const currentCliPath = (typeof credentialValues.cliPath === "string" ? credentialValues.cliPath : void 0) ?? transport.cliPath;
63
61
  const cliDetected = await detectBinary(currentCliPath);
64
62
  if (!await prompter.confirm({
65
63
  message: cliDetected ? t("wizard.signal.reinstallPrompt") : t("wizard.signal.installPrompt"),