@hellolynk-ai/openclaw-channel 0.2.102 → 0.2.104

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 (46) hide show
  1. package/bin/hellolynk-client-setup.mjs +79 -13
  2. package/clients/core/hellolynk-client-account.mjs +1 -1
  3. package/clients/core/hellolynk-client-profile.mjs +25 -2
  4. package/clients/core/hellolynk-client-update-entry.mjs +7 -3
  5. package/clients/core/hellolynk-client-update-runtime.mjs +62 -33
  6. package/clients/core/hellolynk-client-update.mjs +62 -18
  7. package/clients/core/hellolynk-darwin-host.mjs +269 -0
  8. package/clients/core/hellolynk-darwin-vault.mjs +153 -0
  9. package/clients/core/hellolynk-host-protected-store.mjs +20 -8
  10. package/clients/core/hellolynk-human-confirmation-ledger.mjs +53 -6
  11. package/clients/core/hellolynk-local-data-protection.mjs +22 -7
  12. package/clients/core/hellolynk-native-human-confirmation-broker.mjs +7 -5
  13. package/clients/core/hellolynk-neutral-host-installation-store.mjs +3 -7
  14. package/clients/core/hellolynk-neutral-host-launcher.mjs +9 -3
  15. package/clients/core/hellolynk-neutral-host-process.mjs +1 -1
  16. package/clients/core/hellolynk-platform-credential-store.mjs +68 -14
  17. package/clients/core/hellolynk-release-retention.mjs +101 -2
  18. package/clients/core/hellolynk-workbench-connection.mjs +5 -3
  19. package/clients/platform/windows/credential-store.ps1 +46 -10
  20. package/hellolynk-client-pack-manifest.json +96 -76
  21. package/hellolynk-client-pack-pin.json +1 -1
  22. package/integrations/openclaw-channel/package.json +1 -1
  23. package/package.json +1 -1
  24. package/runtime/connect-activate.mjs +5 -1
  25. package/runtime/core/hellolynk-client-account.mjs +1 -1
  26. package/runtime/core/hellolynk-client-profile.mjs +25 -2
  27. package/runtime/core/hellolynk-client-update-entry.mjs +7 -3
  28. package/runtime/core/hellolynk-client-update-runtime.mjs +62 -33
  29. package/runtime/core/hellolynk-client-update.mjs +62 -18
  30. package/runtime/core/hellolynk-darwin-host.mjs +269 -0
  31. package/runtime/core/hellolynk-darwin-vault.mjs +153 -0
  32. package/runtime/core/hellolynk-host-protected-store.mjs +20 -8
  33. package/runtime/core/hellolynk-human-confirmation-ledger.mjs +53 -6
  34. package/runtime/core/hellolynk-local-data-protection.mjs +22 -7
  35. package/runtime/core/hellolynk-native-human-confirmation-broker.mjs +7 -5
  36. package/runtime/core/hellolynk-neutral-host-installation-store.mjs +3 -7
  37. package/runtime/core/hellolynk-neutral-host-launcher.mjs +9 -3
  38. package/runtime/core/hellolynk-neutral-host-process.mjs +1 -1
  39. package/runtime/core/hellolynk-platform-credential-store.mjs +68 -14
  40. package/runtime/core/hellolynk-release-retention.mjs +101 -2
  41. package/runtime/core/hellolynk-workbench-connection.mjs +5 -3
  42. package/runtime/neutral-host-release-loader.mjs +1 -1
  43. package/runtime/neutral-host-release-manifest.json +26 -18
  44. package/runtime/neutral-host-release-pin.json +1 -1
  45. package/runtime/platform/windows/credential-store.ps1 +46 -10
  46. package/tools/hellolynk-activate-neutral-host-clients.mjs +5 -1
@@ -60,7 +60,7 @@ export function validateWorkbenchConnectionInput(value) {
60
60
  export function createWorkbenchConnection(options) {
61
61
  if (!CLIENTS.has(options?.client) || !path.isAbsolute(options?.releaseRoot || "")) throw code("workbench_connect_configuration_invalid");
62
62
  const env = options.env || process.env;
63
- const storeRoot = options.storeRoot || env.HELLOLYNK_NEUTRAL_STORE_ROOT || defaultNeutralHostStoreRoot("win32", env);
63
+ const storeRoot = options.storeRoot || env.HELLOLYNK_NEUTRAL_STORE_ROOT || defaultNeutralHostStoreRoot(process.platform, env);
64
64
  if (!path.isAbsolute(storeRoot)) throw code("workbench_connect_configuration_invalid");
65
65
  let busy = false;
66
66
  const accounts = createClientAccountActions(options);
@@ -87,7 +87,7 @@ export function createWorkbenchAccountActions(options) {
87
87
  }
88
88
 
89
89
  async function connectAccount(client, sourceRoot, storeRoot, input) {
90
- if (process.platform !== "win32") throw code("workbench_connect_windows_only", 400);
90
+ if (!["win32", "darwin"].includes(process.platform)) throw code("workbench_connect_platform_unsupported", 400);
91
91
  if (!CLIENTS.has(client) || !path.isAbsolute(sourceRoot) || !path.isAbsolute(storeRoot)
92
92
  || path.basename(storeRoot).toLowerCase() !== "host") throw code("workbench_connect_configuration_invalid");
93
93
  const value = validateWorkbenchConnectionInput(input);
@@ -181,7 +181,9 @@ async function retainRelease(binding, currentRoot, client) {
181
181
  const destination = path.resolve(stage, relative);
182
182
  if (!destination.startsWith(`${stage}${path.sep}`)) throw code("workbench_connect_release_invalid");
183
183
  await fs.mkdir(path.dirname(destination), { recursive: true, mode: 0o700 });
184
- await fs.writeFile(destination, await fs.readFile(path.join(sourceRoot, relative)), { flag: "wx", mode: 0o600 });
184
+ await fs.writeFile(destination, await fs.readFile(path.join(sourceRoot, relative)), {
185
+ flag: "wx", mode: relative.endsWith(".bin") ? 0o700 : 0o600,
186
+ });
185
187
  }
186
188
  await verifyPinnedNeutralHostRuntime({ ...binding, releaseRoot: stage });
187
189
  await secureWindowsClientReleaseTree(currentRoot, stageId);
@@ -85,8 +85,27 @@ public static class HelloLynkWindowsFileNative {
85
85
  [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
86
86
  public static extern bool MoveFileExW(string existingName, string newName, uint flags);
87
87
 
88
+ [StructLayout(LayoutKind.Sequential)]
89
+ private struct SECURITY_ATTRIBUTES {
90
+ public int Length;
91
+ public IntPtr SecurityDescriptor;
92
+ public int InheritHandle;
93
+ }
94
+
88
95
  [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
89
- public static extern bool CreateDirectoryW(string path, IntPtr securityAttributes);
96
+ private static extern bool CreateDirectoryW(string path, ref SECURITY_ATTRIBUTES attributes);
97
+
98
+ public static bool CreateProtectedDirectory(string path, byte[] descriptor) {
99
+ var pinned = GCHandle.Alloc(descriptor, GCHandleType.Pinned);
100
+ try {
101
+ var attributes = new SECURITY_ATTRIBUTES {
102
+ Length = Marshal.SizeOf<SECURITY_ATTRIBUTES>(),
103
+ SecurityDescriptor = pinned.AddrOfPinnedObject(),
104
+ InheritHandle = 0
105
+ };
106
+ return CreateDirectoryW(path, ref attributes);
107
+ } finally { pinned.Free(); }
108
+ }
90
109
  }
91
110
  '@
92
111
 
@@ -162,7 +181,7 @@ function Get-HelloLynkExistingAncestorDirectories([string]$RootPath) {
162
181
  return $ordered
163
182
  }
164
183
 
165
- function Assert-HelloLynkTrustedAncestorAcl([string]$RootPath) {
184
+ function Assert-HelloLynkTrustedAncestorAcl([string]$RootPath, [bool]$Create = $false) {
166
185
  $rootParent = [IO.Path]::GetDirectoryName($RootPath.TrimEnd([char[]]@('\', '/')))
167
186
  $directories = @(Get-HelloLynkExistingAncestorDirectories $RootPath)
168
187
  $dangerousRights = (
@@ -175,6 +194,8 @@ function Assert-HelloLynkTrustedAncestorAcl([string]$RootPath) {
175
194
  [Security.AccessControl.FileSystemRights]::ChangePermissions -bor
176
195
  [Security.AccessControl.FileSystemRights]::TakeOwnership
177
196
  )
197
+ $createRights = [Security.AccessControl.FileSystemRights]::CreateFiles -bor
198
+ [Security.AccessControl.FileSystemRights]::CreateDirectories
178
199
  foreach ($directory in $directories) {
179
200
  Assert-HelloLynkNoReparseAncestors $directory
180
201
  $identity = Open-HelloLynkIdentity $directory $true
@@ -204,6 +225,7 @@ function Assert-HelloLynkTrustedAncestorAcl([string]$RootPath) {
204
225
  )
205
226
  $isRootParent = $directory.Equals($rootParent, [StringComparison]::OrdinalIgnoreCase)
206
227
  $directoryIndex = [Array]::IndexOf($directories, $directory)
228
+ $willCreateProtectedChild = $Create -and -not $isRootParent -and $directoryIndex -eq $directories.Count - 1
207
229
  $nextDirectoryProtected = $false
208
230
  if ($directoryIndex -ge 0 -and $directoryIndex + 1 -lt $directories.Count) {
209
231
  try {
@@ -220,15 +242,20 @@ function Assert-HelloLynkTrustedAncestorAcl([string]$RootPath) {
220
242
  ) { continue }
221
243
  $rights = $rule.FileSystemRights
222
244
  $hasDangerousRights = (($rights -band $dangerousRights) -ne 0)
245
+ # A competing child created by a different user fails our owner check.
246
+ # A grant to alter the ancestor itself still prevents first creation.
247
+ $canCreateProtectedChild = $willCreateProtectedChild -and
248
+ (($rights -band $dangerousRights -band (-bnot $createRights)) -eq 0)
223
249
  $hasDeleteChild = (
224
250
  ($rights -band [Security.AccessControl.FileSystemRights]::DeleteSubdirectoriesAndFiles) -ne 0
225
251
  )
226
252
  if (
227
253
  $hasDeleteChild -or
228
- ($hasDangerousRights -and ($isRootParent -or -not $nextDirectoryProtected))
254
+ ($hasDangerousRights -and ($isRootParent -or (-not $nextDirectoryProtected -and -not $canCreateProtectedChild)))
229
255
  ) { Fail "client_root_ancestor_dacl_untrusted" }
230
256
  }
231
257
  }
258
+ return $directories[-1]
232
259
  }
233
260
 
234
261
  function New-HelloLynkAcl([bool]$Directory) {
@@ -361,7 +388,7 @@ function Exit-HelloLynkRootMutex($Mutex) {
361
388
  try { $Mutex.ReleaseMutex() } finally { $Mutex.Dispose() }
362
389
  }
363
390
 
364
- function Ensure-HelloLynkSecureDirectory([string]$PathValue) {
391
+ function Ensure-HelloLynkSecureDirectory([string]$PathValue, [string]$ExistingAncestor = "") {
365
392
  if ([IO.Directory]::Exists($PathValue)) {
366
393
  Assert-HelloLynkNoReparseAncestors $PathValue
367
394
  Assert-HelloLynkSecureAcl $PathValue $true
@@ -370,12 +397,21 @@ function Ensure-HelloLynkSecureDirectory([string]$PathValue) {
370
397
  return
371
398
  }
372
399
  $parent = [IO.Path]::GetDirectoryName($PathValue)
373
- if (-not [IO.Directory]::Exists($parent)) { Ensure-HelloLynkSecureDirectory $parent }
374
- if (-not [HelloLynkWindowsFileNative]::CreateDirectoryW($PathValue, [IntPtr]::Zero)) {
400
+ if ($ExistingAncestor) {
401
+ if (-not $parent.Equals($ExistingAncestor, [StringComparison]::OrdinalIgnoreCase)) {
402
+ Ensure-HelloLynkSecureDirectory $parent $ExistingAncestor
403
+ }
404
+ } elseif (-not [IO.Directory]::Exists($parent)) {
405
+ Ensure-HelloLynkSecureDirectory $parent
406
+ }
407
+ Assert-HelloLynkNoReparseAncestors $PathValue
408
+ $descriptor = (New-HelloLynkAcl $true).GetSecurityDescriptorBinaryForm()
409
+ if (-not [HelloLynkWindowsFileNative]::CreateProtectedDirectory($PathValue, $descriptor)) {
375
410
  Fail "client_root_create_race"
376
411
  }
377
- Set-HelloLynkSecureAcl $PathValue $true
378
412
  Assert-HelloLynkNoReparseAncestors $PathValue
413
+ # Keep the Windows auto-inheritance marker used by child file ACL checks.
414
+ Set-HelloLynkSecureAcl $PathValue $true
379
415
  Assert-HelloLynkSecureAcl $PathValue $true
380
416
  $identity = Open-HelloLynkIdentity $PathValue $true
381
417
  $identity.Handle.Dispose()
@@ -386,14 +422,14 @@ function Resolve-HelloLynkClientRoot([string]$RootValue, [bool]$Create) {
386
422
  Assert-HelloLynkNoReparseAncestors $root
387
423
  $mutex = Enter-HelloLynkRootMutex $root
388
424
  try {
389
- Assert-HelloLynkTrustedAncestorAcl $root
390
- if ($Create) { Ensure-HelloLynkSecureDirectory $root }
425
+ $existingAncestor = Assert-HelloLynkTrustedAncestorAcl $root $Create
426
+ if ($Create) { Ensure-HelloLynkSecureDirectory $root $existingAncestor }
391
427
  if (-not [IO.Directory]::Exists($root)) { Fail "client_root_missing" }
392
428
  Assert-HelloLynkNoReparseAncestors $root
393
429
  Assert-HelloLynkSecureAcl $root $true
394
430
  $identity = Open-HelloLynkIdentity $root $true
395
431
  try {
396
- Assert-HelloLynkTrustedAncestorAcl $root
432
+ $null = Assert-HelloLynkTrustedAncestorAcl $root
397
433
  $canonical = $root
398
434
  } finally { $identity.Handle.Dispose() }
399
435
  return [pscustomobject]@{ Root = $canonical; Mutex = $mutex }
@@ -2,7 +2,7 @@
2
2
  "contract": "hellolynk-client-npm-pack-manifest-v1",
3
3
  "client": "openclaw",
4
4
  "packageName": "@hellolynk-ai/openclaw-channel",
5
- "version": "0.2.102",
5
+ "version": "0.2.104",
6
6
  "workbench": {
7
7
  "path": "runtime/workbench/hellolynk-workbench-build.json",
8
8
  "contract": "hellolynk-shared-workbench-build-v1",
@@ -12,8 +12,8 @@
12
12
  "files": [
13
13
  {
14
14
  "path": "bin/hellolynk-client-setup.mjs",
15
- "bytes": 141769,
16
- "sha256": "0bb0706c06bd193cfa37007dd95e3107b52aacb0a7ebaec2249b153ff7dd772b"
15
+ "bytes": 145615,
16
+ "sha256": "044321ea6c5757a985b92a826ffc1fb3ffa4fb8355b732abecc64210d4ac3399"
17
17
  },
18
18
  {
19
19
  "path": "bin/hellolynk-mcp-config-shape.mjs",
@@ -27,8 +27,8 @@
27
27
  },
28
28
  {
29
29
  "path": "clients/core/hellolynk-client-account.mjs",
30
- "bytes": 8414,
31
- "sha256": "ab7ec5dda92e510e7deb14f900fd2df4c6c3373fbeb4af4fb2b6c1a72aa41a99"
30
+ "bytes": 8423,
31
+ "sha256": "6e03a05127d4dc86be6391567b51a956d1a987acf4e23f5699ce0e00c3187b7e"
32
32
  },
33
33
  {
34
34
  "path": "clients/core/hellolynk-client-core.mjs",
@@ -37,29 +37,39 @@
37
37
  },
38
38
  {
39
39
  "path": "clients/core/hellolynk-client-profile.mjs",
40
- "bytes": 8282,
41
- "sha256": "4b45a78b4d6c4794a1f494bd95777579c32c56a68321a1d3b484048942ae4742"
40
+ "bytes": 9359,
41
+ "sha256": "8be37831c96610e3d0a64848ada86488970cc6079e49764b47d8a8b2ba852269"
42
42
  },
43
43
  {
44
44
  "path": "clients/core/hellolynk-client-update-entry.mjs",
45
- "bytes": 1581,
46
- "sha256": "b2740406d79d0fa129c3bd1b5e6a07c3f52eed5e35a91ffea40b099ddc708936"
45
+ "bytes": 1939,
46
+ "sha256": "d9548eacda8632976e42aafc65f0cef2ec9c5233d2d53b31b02aec0a1702b5eb"
47
47
  },
48
48
  {
49
49
  "path": "clients/core/hellolynk-client-update-runtime.mjs",
50
- "bytes": 39709,
51
- "sha256": "3ed31f0cea704c3ad26481126a78a7d39c21df69a5c52d1074a096a2b7b3e32f"
50
+ "bytes": 41618,
51
+ "sha256": "aa233e2cdbdfadb7da6aa489591bc12c4121101b94696f93f6e6cb5d3e7c7870"
52
52
  },
53
53
  {
54
54
  "path": "clients/core/hellolynk-client-update.mjs",
55
- "bytes": 27932,
56
- "sha256": "8f0d6f54313c91bd2ffb4643859a91dd1e122bb5f1da9143fe2851a3370d7fbf"
55
+ "bytes": 30894,
56
+ "sha256": "e57f7cc5e98519a014cef7cef68a97bb7e2beb33eb381c38d1751a3967904aaa"
57
57
  },
58
58
  {
59
59
  "path": "clients/core/hellolynk-contact-request-e2ee.mjs",
60
60
  "bytes": 34163,
61
61
  "sha256": "657664c6250d2738061e1ec2680eda6b36063c357d9e2d9c743e4218ece50895"
62
62
  },
63
+ {
64
+ "path": "clients/core/hellolynk-darwin-host.mjs",
65
+ "bytes": 15242,
66
+ "sha256": "ded97c3bc3dd65ca75305f5199a1340dffb987a5f283454d60586df8b6b55c09"
67
+ },
68
+ {
69
+ "path": "clients/core/hellolynk-darwin-vault.mjs",
70
+ "bytes": 7506,
71
+ "sha256": "b6094d856af016e674e4a0183a4e474397bbe92e66638743fa62fe085b554d30"
72
+ },
63
73
  {
64
74
  "path": "clients/core/hellolynk-device-enrollment.mjs",
65
75
  "bytes": 26664,
@@ -82,8 +92,8 @@
82
92
  },
83
93
  {
84
94
  "path": "clients/core/hellolynk-host-protected-store.mjs",
85
- "bytes": 126836,
86
- "sha256": "89b6e6c4ce9c6ba2984f8c301de4251da6004bdd402cc44d578a4505c21b75b1"
95
+ "bytes": 127785,
96
+ "sha256": "10f81f4f6a5dd2fe9a742e847b2eb47dbf20f802f4414f46a05ccbc3505148e2"
87
97
  },
88
98
  {
89
99
  "path": "clients/core/hellolynk-host-transport-client.mjs",
@@ -97,8 +107,8 @@
97
107
  },
98
108
  {
99
109
  "path": "clients/core/hellolynk-human-confirmation-ledger.mjs",
100
- "bytes": 11071,
101
- "sha256": "63bcbbb0870ad83fc031636d74ce77fc070d5f4d1d4c10297f8b3ec9ad85bbf6"
110
+ "bytes": 14416,
111
+ "sha256": "43b6b6baea422eb226c850f15966c907d834bc2f5aadbab6ee0c9e05445f182f"
102
112
  },
103
113
  {
104
114
  "path": "clients/core/hellolynk-human-relationship-controller.mjs",
@@ -137,8 +147,8 @@
137
147
  },
138
148
  {
139
149
  "path": "clients/core/hellolynk-local-data-protection.mjs",
140
- "bytes": 25720,
141
- "sha256": "1bda879aa0bdf46700a63374e82cc7bc639385656b1463a75a49e8510971066c"
150
+ "bytes": 26663,
151
+ "sha256": "cea4f73ec5a31918c48bd8234e28d38ff1bb8028d2591f542b15ee12b2238e1f"
142
152
  },
143
153
  {
144
154
  "path": "clients/core/hellolynk-local-identity-trust.mjs",
@@ -182,8 +192,8 @@
182
192
  },
183
193
  {
184
194
  "path": "clients/core/hellolynk-native-human-confirmation-broker.mjs",
185
- "bytes": 39491,
186
- "sha256": "2fb2d3b40869362be3e40a1ec55947021319af5315cbf8fdc5ed59df717cceb3"
195
+ "bytes": 39735,
196
+ "sha256": "f190c28af2703b58a685a57213b2789df7eda35d7699d718f9420cd1dddd1b65"
187
197
  },
188
198
  {
189
199
  "path": "clients/core/hellolynk-native-inbox-runtime.mjs",
@@ -212,18 +222,18 @@
212
222
  },
213
223
  {
214
224
  "path": "clients/core/hellolynk-neutral-host-installation-store.mjs",
215
- "bytes": 33525,
216
- "sha256": "b5f6288732af6f9b9c0c750f6002eae657dde9513fc97674f6e59200f3cc9dc6"
225
+ "bytes": 33232,
226
+ "sha256": "42ae1e7deb876a8308b7bfed6a7b891d1834117b62504fc5befe3f91a0b4c740"
217
227
  },
218
228
  {
219
229
  "path": "clients/core/hellolynk-neutral-host-launcher.mjs",
220
- "bytes": 29457,
221
- "sha256": "789b2531cdbde6e6d8f91f2a40746372e903e9e48e8aa6846b9abf2d28150780"
230
+ "bytes": 29655,
231
+ "sha256": "d94b853a7ed1ebc9c7e9bd7c37e2405e39849fb6d4ddf3d697e17ba169eda6d2"
222
232
  },
223
233
  {
224
234
  "path": "clients/core/hellolynk-neutral-host-process.mjs",
225
235
  "bytes": 225161,
226
- "sha256": "af6cb6585baae477f87ee880bd044dffb4c7f71667bfa78bcbf0d4d20e7483af"
236
+ "sha256": "7b237a1400c604da5decbb29ab3ce556fd1b744d0cfd7d28b5560b217da120b1"
227
237
  },
228
238
  {
229
239
  "path": "clients/core/hellolynk-neutral-host-store-adapters.mjs",
@@ -237,8 +247,8 @@
237
247
  },
238
248
  {
239
249
  "path": "clients/core/hellolynk-platform-credential-store.mjs",
240
- "bytes": 34521,
241
- "sha256": "f27f5f377cc4d6d2b5664212cf8fcc4c98d910064c1677ff9c1f776df1a59dba"
250
+ "bytes": 38559,
251
+ "sha256": "3969708bafefc3b267bb34a9dcc115804c874ad14f4a036426d727c02ff70d42"
242
252
  },
243
253
  {
244
254
  "path": "clients/core/hellolynk-relay-client-cli.mjs",
@@ -247,8 +257,8 @@
247
257
  },
248
258
  {
249
259
  "path": "clients/core/hellolynk-release-retention.mjs",
250
- "bytes": 20624,
251
- "sha256": "9b02a42a510fa5ef4a251b6e675f9ccc60f20b718d17c1617027cd048c5634dd"
260
+ "bytes": 25616,
261
+ "sha256": "0ee150af5a9bcc1f636e3ff980ee90ce7d073ab5ed4a991920cd3472bc65529c"
252
262
  },
253
263
  {
254
264
  "path": "clients/core/hellolynk-runtime-safety.cjs",
@@ -262,8 +272,8 @@
262
272
  },
263
273
  {
264
274
  "path": "clients/core/hellolynk-workbench-connection.mjs",
265
- "bytes": 14252,
266
- "sha256": "d3396350fd75af78e60772e021cf6dfb643d9eee41894c5461c959a56650cb60"
275
+ "bytes": 14339,
276
+ "sha256": "6ce8e75025d31ed81c39150df2766231fc871ef18c234de986dc910bab79d639"
267
277
  },
268
278
  {
269
279
  "path": "clients/platform/windows/configure-agent.ps1",
@@ -272,8 +282,8 @@
272
282
  },
273
283
  {
274
284
  "path": "clients/platform/windows/credential-store.ps1",
275
- "bytes": 38434,
276
- "sha256": "d00dae4af08205fffa52c4956d1c87d5c3423e8f20982ccfc1b76e3424fe442e"
285
+ "bytes": 40188,
286
+ "sha256": "8f288c91a1f6ecaf2651baab9bdfc55014c11ea9e165f203ca7a69f4d47d7917"
277
287
  },
278
288
  {
279
289
  "path": "clients/platform/windows/hellolynk-host-protected-store.ps1",
@@ -323,7 +333,7 @@
323
333
  {
324
334
  "path": "integrations/openclaw-channel/package.json",
325
335
  "bytes": 2158,
326
- "sha256": "0cb37e6e7c9591ca5877496970f981e08947b924e6a8054071298f909422e439"
336
+ "sha256": "c391fd29dfcdd4bf8883ddea76ceecb7e9837d26aa486672213bb25ab13fd857"
327
337
  },
328
338
  {
329
339
  "path": "integrations/openclaw-channel/setup-entry.mjs",
@@ -398,7 +408,7 @@
398
408
  {
399
409
  "path": "package.json",
400
410
  "bytes": 1985,
401
- "sha256": "0215eaac79151bd9a1080885b4b883342585293753a115140ab466958763a152"
411
+ "sha256": "38d85d5bfd34b8a79ee0e60e25648e68bd4b0c148cab62c92eb8aedb83daa77b"
402
412
  },
403
413
  {
404
414
  "path": "README.md",
@@ -407,8 +417,8 @@
407
417
  },
408
418
  {
409
419
  "path": "runtime/connect-activate.mjs",
410
- "bytes": 33499,
411
- "sha256": "50ec8b0a58ac5b099a653722b0946acb23d0a29a054bfb3856dc963db6f84bee"
420
+ "bytes": 33789,
421
+ "sha256": "93c68c23ed2d18e87766ecd8dae6c3d8e757eca6ad7569477c8ec994402a8b0e"
412
422
  },
413
423
  {
414
424
  "path": "runtime/core/hellolynk-agent-configurator.mjs",
@@ -417,8 +427,8 @@
417
427
  },
418
428
  {
419
429
  "path": "runtime/core/hellolynk-client-account.mjs",
420
- "bytes": 8414,
421
- "sha256": "ab7ec5dda92e510e7deb14f900fd2df4c6c3373fbeb4af4fb2b6c1a72aa41a99"
430
+ "bytes": 8423,
431
+ "sha256": "6e03a05127d4dc86be6391567b51a956d1a987acf4e23f5699ce0e00c3187b7e"
422
432
  },
423
433
  {
424
434
  "path": "runtime/core/hellolynk-client-core.mjs",
@@ -427,29 +437,39 @@
427
437
  },
428
438
  {
429
439
  "path": "runtime/core/hellolynk-client-profile.mjs",
430
- "bytes": 8282,
431
- "sha256": "4b45a78b4d6c4794a1f494bd95777579c32c56a68321a1d3b484048942ae4742"
440
+ "bytes": 9359,
441
+ "sha256": "8be37831c96610e3d0a64848ada86488970cc6079e49764b47d8a8b2ba852269"
432
442
  },
433
443
  {
434
444
  "path": "runtime/core/hellolynk-client-update-entry.mjs",
435
- "bytes": 1581,
436
- "sha256": "b2740406d79d0fa129c3bd1b5e6a07c3f52eed5e35a91ffea40b099ddc708936"
445
+ "bytes": 1939,
446
+ "sha256": "d9548eacda8632976e42aafc65f0cef2ec9c5233d2d53b31b02aec0a1702b5eb"
437
447
  },
438
448
  {
439
449
  "path": "runtime/core/hellolynk-client-update-runtime.mjs",
440
- "bytes": 39709,
441
- "sha256": "3ed31f0cea704c3ad26481126a78a7d39c21df69a5c52d1074a096a2b7b3e32f"
450
+ "bytes": 41618,
451
+ "sha256": "aa233e2cdbdfadb7da6aa489591bc12c4121101b94696f93f6e6cb5d3e7c7870"
442
452
  },
443
453
  {
444
454
  "path": "runtime/core/hellolynk-client-update.mjs",
445
- "bytes": 27932,
446
- "sha256": "8f0d6f54313c91bd2ffb4643859a91dd1e122bb5f1da9143fe2851a3370d7fbf"
455
+ "bytes": 30894,
456
+ "sha256": "e57f7cc5e98519a014cef7cef68a97bb7e2beb33eb381c38d1751a3967904aaa"
447
457
  },
448
458
  {
449
459
  "path": "runtime/core/hellolynk-contact-request-e2ee.mjs",
450
460
  "bytes": 34163,
451
461
  "sha256": "657664c6250d2738061e1ec2680eda6b36063c357d9e2d9c743e4218ece50895"
452
462
  },
463
+ {
464
+ "path": "runtime/core/hellolynk-darwin-host.mjs",
465
+ "bytes": 15242,
466
+ "sha256": "ded97c3bc3dd65ca75305f5199a1340dffb987a5f283454d60586df8b6b55c09"
467
+ },
468
+ {
469
+ "path": "runtime/core/hellolynk-darwin-vault.mjs",
470
+ "bytes": 7506,
471
+ "sha256": "b6094d856af016e674e4a0183a4e474397bbe92e66638743fa62fe085b554d30"
472
+ },
453
473
  {
454
474
  "path": "runtime/core/hellolynk-device-enrollment.mjs",
455
475
  "bytes": 26664,
@@ -472,8 +492,8 @@
472
492
  },
473
493
  {
474
494
  "path": "runtime/core/hellolynk-host-protected-store.mjs",
475
- "bytes": 126836,
476
- "sha256": "89b6e6c4ce9c6ba2984f8c301de4251da6004bdd402cc44d578a4505c21b75b1"
495
+ "bytes": 127785,
496
+ "sha256": "10f81f4f6a5dd2fe9a742e847b2eb47dbf20f802f4414f46a05ccbc3505148e2"
477
497
  },
478
498
  {
479
499
  "path": "runtime/core/hellolynk-host-transport-client.mjs",
@@ -487,8 +507,8 @@
487
507
  },
488
508
  {
489
509
  "path": "runtime/core/hellolynk-human-confirmation-ledger.mjs",
490
- "bytes": 11071,
491
- "sha256": "63bcbbb0870ad83fc031636d74ce77fc070d5f4d1d4c10297f8b3ec9ad85bbf6"
510
+ "bytes": 14416,
511
+ "sha256": "43b6b6baea422eb226c850f15966c907d834bc2f5aadbab6ee0c9e05445f182f"
492
512
  },
493
513
  {
494
514
  "path": "runtime/core/hellolynk-human-relationship-controller.mjs",
@@ -527,8 +547,8 @@
527
547
  },
528
548
  {
529
549
  "path": "runtime/core/hellolynk-local-data-protection.mjs",
530
- "bytes": 25720,
531
- "sha256": "1bda879aa0bdf46700a63374e82cc7bc639385656b1463a75a49e8510971066c"
550
+ "bytes": 26663,
551
+ "sha256": "cea4f73ec5a31918c48bd8234e28d38ff1bb8028d2591f542b15ee12b2238e1f"
532
552
  },
533
553
  {
534
554
  "path": "runtime/core/hellolynk-local-identity-trust.mjs",
@@ -572,8 +592,8 @@
572
592
  },
573
593
  {
574
594
  "path": "runtime/core/hellolynk-native-human-confirmation-broker.mjs",
575
- "bytes": 39491,
576
- "sha256": "2fb2d3b40869362be3e40a1ec55947021319af5315cbf8fdc5ed59df717cceb3"
595
+ "bytes": 39735,
596
+ "sha256": "f190c28af2703b58a685a57213b2789df7eda35d7699d718f9420cd1dddd1b65"
577
597
  },
578
598
  {
579
599
  "path": "runtime/core/hellolynk-native-inbox-runtime.mjs",
@@ -602,18 +622,18 @@
602
622
  },
603
623
  {
604
624
  "path": "runtime/core/hellolynk-neutral-host-installation-store.mjs",
605
- "bytes": 33525,
606
- "sha256": "b5f6288732af6f9b9c0c750f6002eae657dde9513fc97674f6e59200f3cc9dc6"
625
+ "bytes": 33232,
626
+ "sha256": "42ae1e7deb876a8308b7bfed6a7b891d1834117b62504fc5befe3f91a0b4c740"
607
627
  },
608
628
  {
609
629
  "path": "runtime/core/hellolynk-neutral-host-launcher.mjs",
610
- "bytes": 29457,
611
- "sha256": "789b2531cdbde6e6d8f91f2a40746372e903e9e48e8aa6846b9abf2d28150780"
630
+ "bytes": 29655,
631
+ "sha256": "d94b853a7ed1ebc9c7e9bd7c37e2405e39849fb6d4ddf3d697e17ba169eda6d2"
612
632
  },
613
633
  {
614
634
  "path": "runtime/core/hellolynk-neutral-host-process.mjs",
615
635
  "bytes": 225161,
616
- "sha256": "af6cb6585baae477f87ee880bd044dffb4c7f71667bfa78bcbf0d4d20e7483af"
636
+ "sha256": "7b237a1400c604da5decbb29ab3ce556fd1b744d0cfd7d28b5560b217da120b1"
617
637
  },
618
638
  {
619
639
  "path": "runtime/core/hellolynk-neutral-host-store-adapters.mjs",
@@ -627,8 +647,8 @@
627
647
  },
628
648
  {
629
649
  "path": "runtime/core/hellolynk-platform-credential-store.mjs",
630
- "bytes": 34521,
631
- "sha256": "f27f5f377cc4d6d2b5664212cf8fcc4c98d910064c1677ff9c1f776df1a59dba"
650
+ "bytes": 38559,
651
+ "sha256": "3969708bafefc3b267bb34a9dcc115804c874ad14f4a036426d727c02ff70d42"
632
652
  },
633
653
  {
634
654
  "path": "runtime/core/hellolynk-relay-client-cli.mjs",
@@ -637,8 +657,8 @@
637
657
  },
638
658
  {
639
659
  "path": "runtime/core/hellolynk-release-retention.mjs",
640
- "bytes": 20624,
641
- "sha256": "9b02a42a510fa5ef4a251b6e675f9ccc60f20b718d17c1617027cd048c5634dd"
660
+ "bytes": 25616,
661
+ "sha256": "0ee150af5a9bcc1f636e3ff980ee90ce7d073ab5ed4a991920cd3472bc65529c"
642
662
  },
643
663
  {
644
664
  "path": "runtime/core/hellolynk-runtime-safety.cjs",
@@ -652,8 +672,8 @@
652
672
  },
653
673
  {
654
674
  "path": "runtime/core/hellolynk-workbench-connection.mjs",
655
- "bytes": 14252,
656
- "sha256": "d3396350fd75af78e60772e021cf6dfb643d9eee41894c5461c959a56650cb60"
675
+ "bytes": 14339,
676
+ "sha256": "6ce8e75025d31ed81c39150df2766231fc871ef18c234de986dc910bab79d639"
657
677
  },
658
678
  {
659
679
  "path": "runtime/neutral-host-bootstrap.mjs",
@@ -667,18 +687,18 @@
667
687
  },
668
688
  {
669
689
  "path": "runtime/neutral-host-release-loader.mjs",
670
- "bytes": 7567,
671
- "sha256": "15593e237fd5cbd765b65e60efe7a1c87e24a5390ad932c8a23d2c03b8da9770"
690
+ "bytes": 7577,
691
+ "sha256": "283a20c6a9b90481bc03c143ab51d5289abf7b7a86fbe51fba7ea2ae1e6d2c60"
672
692
  },
673
693
  {
674
694
  "path": "runtime/neutral-host-release-manifest.json",
675
- "bytes": 11228,
676
- "sha256": "1666255ab9676913302d388b5029b9045c46775de7eaff9edd182929d246ec32"
695
+ "bytes": 11517,
696
+ "sha256": "bd73dfa6e279127f3f18e11c398b47c34f18f0eb47cf4d5e7e309696ea7c17f7"
677
697
  },
678
698
  {
679
699
  "path": "runtime/neutral-host-release-pin.json",
680
700
  "bytes": 146,
681
- "sha256": "cdb4c1e7ca4ee27cd217893b5b9b23f9defd2df9f3969ea981cd2abb0e25f35f"
701
+ "sha256": "bd9c12d34634753de6e6010b7b04f8cb1efac0550ad381490d7968c5d65cf5b8"
682
702
  },
683
703
  {
684
704
  "path": "runtime/platform/windows/configure-agent.ps1",
@@ -687,8 +707,8 @@
687
707
  },
688
708
  {
689
709
  "path": "runtime/platform/windows/credential-store.ps1",
690
- "bytes": 38434,
691
- "sha256": "d00dae4af08205fffa52c4956d1c87d5c3423e8f20982ccfc1b76e3424fe442e"
710
+ "bytes": 40188,
711
+ "sha256": "8f288c91a1f6ecaf2651baab9bdfc55014c11ea9e165f203ca7a69f4d47d7917"
692
712
  },
693
713
  {
694
714
  "path": "runtime/platform/windows/hellolynk-host-protected-store.ps1",
@@ -847,8 +867,8 @@
847
867
  },
848
868
  {
849
869
  "path": "tools/hellolynk-activate-neutral-host-clients.mjs",
850
- "bytes": 33553,
851
- "sha256": "46fabe0745e4c9331765e476daec29f65f243649e67905d93eeb860a2c230539"
870
+ "bytes": 33852,
871
+ "sha256": "6197c2817607fb9adf82a7b1c865365484e794e8634e8bf5c6491bd1e9771b31"
852
872
  }
853
873
  ]
854
874
  }
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "contract": "hellolynk-client-npm-pack-pin-v1",
3
- "manifestSha256": "e4a43126d346aea91d0732858273653eea30ab6c1e7e67fbf6deff2a7eb303a7"
3
+ "manifestSha256": "3335825703d396705b44000bfc0434787ba720658ef435ca0e88735eed510687"
4
4
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hellolynk-ai/openclaw-channel",
3
- "version": "0.2.102",
3
+ "version": "0.2.104",
4
4
  "private": true,
5
5
  "description": "HelloLynk Messaging channel plugin for the public OpenClaw Windows client",
6
6
  "type": "module",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hellolynk-ai/openclaw-channel",
3
- "version": "0.2.102",
3
+ "version": "0.2.104",
4
4
  "description": "HelloLynk Messaging for OpenClaw: open conversations and let your AI message other people's AI assistants.",
5
5
  "homepage": "https://hellolynk.com",
6
6
  "repository": {
@@ -5,6 +5,7 @@ import crypto from "node:crypto";
5
5
  import fs from "node:fs/promises";
6
6
  import path from "node:path";
7
7
 
8
+ import { verifyDarwinUnclaimedAuthorization } from "./core/hellolynk-darwin-host.mjs";
8
9
  import { readClientProfile } from "./core/hellolynk-client-profile.mjs";
9
10
  import { createNeutralHostInstallationStore } from "./core/hellolynk-neutral-host-installation-store.mjs";
10
11
  import { clientAccountBaseRoot } from "./core/hellolynk-client-account.mjs";
@@ -164,7 +165,7 @@ assert.equal(releaseVerification.verifiedFileCount >= 8, true);
164
165
  let transport = null;
165
166
  let bootstrapTransportRequired = false;
166
167
  let protectedStorePresent = true;
167
- try { await fs.lstat(path.join(root, "capabilities-v1.dpapi.clixml")); }
168
+ try { await fs.lstat(path.join(root, process.platform === "darwin" ? "protected-v1.sqlite" : "capabilities-v1.dpapi.clixml")); }
168
169
  catch (error) {
169
170
  if (error?.code !== "ENOENT") throw error;
170
171
  protectedStorePresent = false;
@@ -173,6 +174,9 @@ if (!protectedStorePresent) {
173
174
  if (!(freshPreBind || recoveryPreBind)) await store.status();
174
175
  await verifyHostProtectedStorePath({ root, path: root, directory: true });
175
176
  bootstrapTransportRequired = true;
177
+ } else if (process.platform === "darwin" && freshPreBind) {
178
+ await verifyDarwinUnclaimedAuthorization(root);
179
+ bootstrapTransportRequired = true;
176
180
  } else {
177
181
  assert.equal((await store.status()).protected, true);
178
182
  try { transport = preflightOnly ? await store.verifyTransport() : await store.resolveTransport(); }
@@ -68,7 +68,7 @@ export function withClientAccountLock(client, root, operation) {
68
68
 
69
69
  export function createClientAccountActions(options) {
70
70
  const client = options?.client;
71
- const root = options?.storeRoot || defaultNeutralHostStoreRoot("win32", options?.env || process.env);
71
+ const root = options?.storeRoot || defaultNeutralHostStoreRoot(process.platform, options?.env || process.env);
72
72
  statePath(client, clientAccountBaseRoot(root));
73
73
  const readAccountState = () => {
74
74
  const state = readClientAccount(client, root);