@hraness/ghostget 0.18.0 → 0.18.3

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 (76) hide show
  1. package/CHANGELOG.md +315 -0
  2. package/README.md +7 -7
  3. package/dist/apple-photos-client.js +2 -1
  4. package/dist/beeper-client.js +2 -1
  5. package/dist/client.js +1 -0
  6. package/dist/imessage-direct-install-2gm3kge7.js +324 -0
  7. package/dist/index-01eeae9e.js +5 -0
  8. package/dist/index-2ymnp8xv.js +145 -0
  9. package/dist/{index-9wca02er.js → index-cnbz0gws.js} +1 -1
  10. package/dist/index-en5hycxp.js +175 -0
  11. package/dist/index-n4szk3nw.js +50 -0
  12. package/dist/index-yq6maz71.js +1105 -0
  13. package/dist/index-z1w83f81.js +4 -0
  14. package/dist/index.js +4 -47
  15. package/dist/messaging-automation-api.js +21 -0
  16. package/dist/messaging-automation-j4274hvc.js +609 -0
  17. package/dist/messaging-native-install-8w1j36ah.js +16 -0
  18. package/dist/messaging.js +1 -0
  19. package/dist/omni-client.js +1 -0
  20. package/dist/whatsapp-automation-runtime-hgh1e9rm.js +845 -0
  21. package/dist/whatsapp-client.js +1 -0
  22. package/docs/control-panel.md +2 -2
  23. package/docs/imessage-direct-provider.md +31 -7
  24. package/docs/messaging-automation.md +103 -0
  25. package/package.json +22 -2
  26. package/skills/ghostget/references/control-panel.md +1 -1
  27. package/skills/ghostget/references/install.md +5 -5
  28. package/skills/ghostget/references/linkedin-adapter.md +215 -13
  29. package/skills/ghostget/references/platform-patterns.md +1 -1
  30. package/src/args.ts +18 -5
  31. package/src/assets/adapters/imessage/wrench-web-adapter.json +126 -0
  32. package/src/assets/adapters/linkedin/wrench-web-adapter.json +1 -1
  33. package/src/assets/adapters/whatsapp/wrench-web-adapter.json +144 -0
  34. package/src/assets/messaging-runtime/NOTICE.txt +2580 -0
  35. package/src/assets/messaging-runtime/imsg-darwin-arm64.gz +0 -0
  36. package/src/assets/messaging-runtime/phone-number-info.plist.gz +0 -0
  37. package/src/assets/messaging-runtime/phone-number-metadata.json.gz +0 -0
  38. package/src/assets/messaging-runtime/phone-number-privacy.plist.gz +0 -0
  39. package/src/assets/messaging-runtime/wacli-darwin-arm64.gz +0 -0
  40. package/src/beeper-client-types.ts +1 -1
  41. package/src/ghostget.ts +16 -4
  42. package/src/messaging-automation-api.ts +12 -0
  43. package/src/messaging-automation-descriptors.ts +29 -0
  44. package/src/messaging-automation-factory.ts +148 -0
  45. package/src/messaging-automation-server.ts +183 -0
  46. package/src/messaging-automation-types.ts +155 -0
  47. package/src/messaging-automation-validation.ts +110 -0
  48. package/src/messaging-automation.ts +356 -0
  49. package/src/plugins/imessage-direct/plugin.ts +12 -1
  50. package/src/plugins/imessage-direct/vendor/0003-feat-rpc-add-no-fetch-rich-cards.patch +276 -0
  51. package/src/plugins/imessage-direct/vendor/provenance.json +84 -10
  52. package/src/plugins/linkedin-web/plugin.ts +1 -1
  53. package/src/plugins/whatsapp-linked-device/plugin.ts +7 -2
  54. package/src/plugins/whatsapp-linked-device/vendor/0001-ghostget-private-messaging.patch +1093 -0
  55. package/src/plugins/whatsapp-linked-device/vendor/README.md +39 -0
  56. package/src/plugins/whatsapp-linked-device/vendor/provenance.json +45 -0
  57. package/src/provider-plugin.ts +14 -0
  58. package/src/providers/imessage-automation.ts +250 -0
  59. package/src/providers/imessage-direct-install.ts +7 -0
  60. package/src/providers/imessage-direct-runtime.ts +32 -2
  61. package/src/providers/imessage-direct.ts +13 -3
  62. package/src/providers/linkedin-contact-failure.ts +21 -0
  63. package/src/providers/linkedin-contact-platform.ts +8 -1
  64. package/src/providers/linkedin-contact-program.ts +31 -6
  65. package/src/providers/linkedin-web-contact.ts +1072 -51
  66. package/src/providers/linkedin-web-profile-browser.ts +659 -45
  67. package/src/providers/linkedin-web-runtime.ts +1 -0
  68. package/src/providers/linkedin-web.ts +46 -2
  69. package/src/providers/messaging-native-artifacts.ts +38 -0
  70. package/src/providers/messaging-native-install.ts +75 -0
  71. package/src/providers/whatsapp-automation-runtime.ts +240 -0
  72. package/src/providers/whatsapp-automation.ts +153 -0
  73. package/src/usage.ts +3 -1
  74. package/src/version.ts +1 -1
  75. package/src/web-session-contract-definitions.ts +1 -1
  76. package/tsconfig.json +3 -0
package/CHANGELOG.md CHANGED
@@ -7,6 +7,321 @@ Historical entries retain their original delivery coordinates.
7
7
 
8
8
  ## Unreleased
9
9
 
10
+ ## 0.18.3
11
+
12
+ - Apply the shared Lantern material to the homepage: luminous grid glass behind
13
+ the hero, a blurred header, warm open questions, and opaque reading surfaces.
14
+ Preserve clean marks, ordinary documentation, and the inert native preview.
15
+
16
+ - Click the unique reviewed Contact info control when the page-bound
17
+ NavigateToScreen extract is `absent` after adapter 1.36.2. Operator
18
+ smoke on 2026-09-12 was green for Email on tessbloch through DIRECT
19
+ transport that clicked after an absent extract, using the reviewed
20
+ ProfileContactDetailsOverlay `sduiid` and headed clientArguments
21
+ (bound vanity, optional givenName/familyName from profile HTML,
22
+ `isVanityNameResolved`, nested requestMetadata
23
+ states/screenId/knownTemplates, `isModal` true). Official
24
+ `contacts.read` still fell through that absent extract to GraphQL
25
+ or the vanity overlay GET (broken 500/HTML-shell path). The
26
+ contained path now uses the same click and modal snapshot as a
27
+ present action. It still does not mint a navigation POST or track
28
+ headers. Zero or two-plus controls and a missing or ambiguous
29
+ modal still fail closed. GraphQL 403 and vanity HTML-shell
30
+ honesty stay unused once that click is selected. Soft-labels
31
+ stay. Self, non-first-degree, and contradictory distances still
32
+ fail closed, and no email is invented. Adapter bundle 1.36.3.
33
+ This is the seventeenth live Contact-info drift after the 1.36.2
34
+ overlay pathname bind. Cloud has no signed-in LinkedIn session;
35
+ do not treat this landing as live green. Operator smoke:
36
+
37
+ ```sh
38
+ printf '%s' '{"profile_url":"https://www.linkedin.com/in/tessbloch/"}' \
39
+ | ghostget invoke linkedin-web contacts.read --input - --auth linkedin-main --json
40
+ ```
41
+
42
+ - Keep the unique reviewed Contact info click bound after adapter
43
+ 1.36.1 when contained Chrome follows the live vanity overlay path.
44
+ Operator smoke on 2026-09-12 clicked that unique control, then
45
+ fail-closed because pathname left `/in/tessbloch/` for
46
+ `/in/tessbloch/overlay/contact-info/`. Headed proof the same day
47
+ still showed Email in the modal. After click, the contained path now
48
+ treats the exact bound profile pathname or that reviewed vanity
49
+ overlay pathname as still bound, then snapshots the unique dialog.
50
+ Authwall, other origins, and any other path still fail closed. Zero
51
+ or two-plus controls and a missing or ambiguous modal still fail
52
+ closed. It still does not mint a navigation POST or track headers.
53
+ GraphQL 403, minted navigation GETs, vanity HTML-shell honesty, and
54
+ embedded-field projection stay. Soft-labels stay. Self,
55
+ non-first-degree, and contradictory distances still fail closed, and
56
+ no email is invented. Adapter bundle 1.36.2.
57
+ This is the sixteenth live Contact-info drift after the 1.36.1
58
+ overlay-href click. Cloud has no signed-in LinkedIn session; do
59
+ not treat this landing as live green. Operator smoke:
60
+
61
+ ```sh
62
+ printf '%s' '{"profile_url":"https://www.linkedin.com/in/tessbloch/"}' \
63
+ | ghostget invoke linkedin-web contacts.read --input - --auth linkedin-dormant-20260911 --json
64
+ ```
65
+
66
+ ## 0.18.2 - 2026-09-12
67
+
68
+ - Apply the shared editorial typography, textured background and blurred header
69
+ to the homepage. Keep logos sharp, phone navigation on one row, and documentation
70
+ and inert native examples in their existing layouts.
71
+ - Correct canonical archive-size limits for bundled messaging helpers.
72
+
73
+ - Allow the unique reviewed Contact info control to open the live
74
+ LinkedIn SPA modal after adapter 1.36.0. Operator smoke on
75
+ 2026-09-12 found that unique control on tessbloch, then fail-closed
76
+ before click because its href matched `/overlay/contact-info/`.
77
+ Headed proof the same day showed Email in that modal after click.
78
+ The contained path now clicks that unique accessible name even when
79
+ the href is the vanity overlay GET. Zero or two-plus controls and a
80
+ missing or ambiguous modal still fail closed. It still does not mint
81
+ a navigation POST or track headers. GraphQL 403, minted navigation
82
+ GETs, vanity HTML-shell honesty, and embedded-field projection stay.
83
+ Soft-labels stay. Self, non-first-degree, and contradictory
84
+ distances still fail closed, and no email is invented. Adapter bundle 1.36.1.
85
+ This is the fifteenth live Contact-info drift after the 1.36.0
86
+ Contact info click. Cloud has no signed-in LinkedIn session; do
87
+ not treat this landing as live green. Operator smoke:
88
+
89
+ ```sh
90
+ printf '%s' '{"profile_url":"https://www.linkedin.com/in/tessbloch/"}' \
91
+ | ghostget invoke linkedin-web contacts.read --input - --auth linkedin-dormant-20260911 --json
92
+ ```
93
+
94
+ - Click the unique reviewed Contact info control on an already-loaded
95
+ 1st-degree LinkedIn profile and project Email from that modal after
96
+ adapter 1.35.0. Operator headed proof on 2026-09-12 showed Email in
97
+ the modal DOM. Contained synthetic navigation POST still returned
98
+ HTTP 500 `text/html` after the exact headed body and observed X-Li
99
+ set. The contained path now opens that profile, binds a unique
100
+ page-instance, clicks only the exact accessible name `Contact info`,
101
+ snapshots the unique dialog, and projects Email from that HTML. Zero
102
+ or two-plus controls, an overlay GET href, or a missing modal fail
103
+ closed. It does not mint a navigation POST or track headers.
104
+ GraphQL 403, navigation GETs, vanity HTML-shell honesty, and
105
+ embedded-field projection stay. Soft-labels stay. Self,
106
+ non-first-degree, and contradictory distances still fail closed, and
107
+ no email is invented. Adapter bundle 1.36.0.
108
+ This is the fourteenth live Contact-info drift after the 1.35.0
109
+ observed-header bind. Cloud has no signed-in LinkedIn session; do
110
+ not treat this landing as live green. Operator smoke:
111
+
112
+ ```sh
113
+ printf '%s' '{"profile_url":"https://www.linkedin.com/in/tessbloch/"}' \
114
+ | ghostget invoke linkedin-web contacts.read --input - --auth linkedin-dormant-20260911 --json
115
+ ```
116
+
117
+ - Copy already-observed LinkedIn `contacts.read@1` rsc-action
118
+ `x-li-page-instance-tracking-id`, `x-li-pageforestid`,
119
+ `x-li-traceparent`, `x-li-tracestate`, and optional
120
+ `x-li-layout-tree` onto the Contact-info overlay POST after adapter
121
+ 1.34.0. Live peel after that bind kept the headed nested body and
122
+ forwarded page-instance, track (`mpName=web`), application
123
+ version/instance, anchor page key, and `rscStream=true`, but contained
124
+ Chrome still returned HTTP 500 `text/html`. The same profile-wait
125
+ `/flagship-web/rsc-action/` observations already carried those
126
+ tracking and trace names; 1.34.0 left them off as headed-only. The
127
+ contained path now copies the original strings from the same selected
128
+ same-origin rsc-action observation under a reviewed allowlist, prefers
129
+ that rsc-action bind, and omits a name when that observation lacks it.
130
+ It does not mint tracking IDs, traces, pageforest, or layout-tree.
131
+ Missing or malformed observed values fail closed before POST. Headed
132
+ successful body Content-Length was 400; compact emit at 398 stays.
133
+ GraphQL 403, navigation GETs, vanity HTML-shell honesty,
134
+ `sduiid=screenId`, the headed nested body, and prior page-derived
135
+ copies stay. Soft-labels stay. Self, non-first-degree, and
136
+ contradictory distances still fail closed, and no email is invented.
137
+ Adapter bundle 1.35.0.
138
+ This is the thirteenth live Contact-info drift after the 1.34.0
139
+ page-derived header bind. Cloud has no signed-in LinkedIn session; do
140
+ not treat this landing as live green. Operator smoke:
141
+
142
+ ```sh
143
+ printf '%s' '{"profile_url":"https://www.linkedin.com/in/tessbloch/"}' \
144
+ | ghostget invoke linkedin-web contacts.read --input - --auth linkedin-dormant-20260911 --json
145
+ ```
146
+
147
+ - Bind LinkedIn `contacts.read@1` Contact-info navigation POST to the
148
+ already-loaded profile document after adapter 1.33.0. Live peel of the
149
+ headed nested `payload.requestMetadata` body matched byte-for-byte,
150
+ but contained Chrome still returned HTTP 500 `text/html` because that
151
+ POST ran from the signed-in origin fetch context with only `Accept`,
152
+ `Content-Type`, and session `csrf-token`. Headed success also sent
153
+ page-instance and the other X-Li names from the profile SPA. The
154
+ contained path now opens the exact reviewed profile URL, waits for
155
+ that document, and copies a unique `d_flagship3_profile*`
156
+ `x-li-page-instance` plus optional `x-li-track` (`mpName` `web` or
157
+ `voyager-web`), `x-li-application-version`,
158
+ `x-li-application-instance`, `x-li-anchor-page-key`, and
159
+ `x-li-rsc-stream=true` from observed same-origin rsc-action or
160
+ voyager requests, or page-instance from the loaded document. It does
161
+ not mint `traceparent`, `tracestate`, `pageforest`,
162
+ page-instance-tracking-id, or layout-tree; those headed-only values
163
+ stay blockers if LinkedIn still 500s after the reviewed copies. Live
164
+ query key stays `sduiid=` (headed 200 plus public SDUI routes);
165
+ `sduid=` notes are transcription typos. Missing or ambiguous
166
+ page-instance fails closed before POST. GraphQL 403, navigation GETs,
167
+ vanity HTML-shell honesty, `sduiid=screenId`, and the headed nested
168
+ body stay. Soft-labels stay. Self,
169
+ non-first-degree, and contradictory distances still fail closed, and
170
+ no email is invented. Adapter bundle 1.34.0.
171
+ This is the twelfth live Contact-info drift after the 1.33.0 nested
172
+ body. Cloud has no signed-in LinkedIn session; do not treat this
173
+ landing as live green.
174
+
175
+ ## 0.18.1 - 2026-09-12
176
+
177
+ - Add the owner messaging automation protocol for iMessage and WhatsApp:
178
+ exact conversation enrollment, revocable action grants, durable event cursors,
179
+ bounded history, admitted attachment bytes, and ordered send receipts. Importing
180
+ the eighth public SDK entrypoint performs no account or network work.
181
+ - Bundle reviewed private iMessage and wacli helpers with pinned bytes, source
182
+ patches, resources, and licenses. Installation starts no provider and changes
183
+ no macOS security settings. WhatsApp synchronization requires an explicit owner
184
+ action and keeps each outgoing action to one dispatch attempt.
185
+ - Expose text, files, reactions, stickers, links, and polls when the selected
186
+ provider and its managed permissions support them. Automated iMessage link
187
+ cards skip helper metadata/image fetching. Native rich iMessage actions require
188
+ an already-working private bridge; its upstream setup requires disabled SIP.
189
+ App Clips and arbitrary mini-app experiences remain unavailable. Offline checks
190
+ do not establish real account pairing or message delivery.
191
+ - Nest LinkedIn `contacts.read@1` Contact-info `requestMetadata` under
192
+ `payload` after adapter 1.32.0. Live peel of sibling `proto.sdui`
193
+ types succeeded, but the POST still returned HTTP 500 `text/html`
194
+ because the body sent empty sibling `RequestMetadata{$type}` and
195
+ omitted headed children `states`, `screenId`, and `knownTemplates`.
196
+ Headed 200 Email capture
197
+ `POST-navigation-body-shape-20260912.md` keeps
198
+ `clientArguments.$type`, `requestedStateKeys: []`, and nested
199
+ `payload.requestMetadata` with `$type`, `states: []`, overlay
200
+ `screenId`, and `knownTemplates: []`. The builder now emits that
201
+ exact headed shape, including when dormant HTML omits metadata, and
202
+ copies reviewed string lists when the page already has them. Empty
203
+ arrays and the two reviewed `proto.sdui` `$type` values come from
204
+ that capture, not invented opaque state. Extra keys, object-valued
205
+ states, and unrelated proto prefixes still fail closed. GraphQL 403,
206
+ navigation GETs, vanity HTML-shell honesty, and `sduiid=screenId`
207
+ stay. Contained Chrome already sends `Accept: */*`,
208
+ `Content-Type: application/json`, and session `csrf-token` for this
209
+ POST; it does not mint `X-Li-*` track values. Soft-labels stay.
210
+ Self, non-first-degree, and contradictory distances still fail
211
+ closed, and no email is invented. Adapter bundle 1.33.0.
212
+ This is the eleventh live Contact-info drift after the 1.32.0 sibling
213
+ peel. Cloud has no signed-in LinkedIn session; do not treat this
214
+ landing as live green.
215
+ - Fix LinkedIn `contacts.read@1` Contact-info navigation POST body after
216
+ adapter 1.31.0. Live 1st-degree bind still succeeded, but building
217
+ `clientArguments` from NavigateToScreen failed closed on
218
+ `unreviewed-client-arguments` keys=`["requestMetadata"]` because live
219
+ HTML keeps `requestMetadata` a sibling of `payload` under
220
+ `requestedArguments`, and `$type` uses `proto.sdui.*`
221
+ (`RequestedArguments`, `RequestMetadata`). A payload-only POST then
222
+ returned HTTP 500. The operation now copies that reviewed sibling
223
+ shape, lifts headed nested `payload.requestMetadata` to the sibling
224
+ placement, and admits `proto.sdui.*` types only on this overlay POST
225
+ body. Extra keys and unrelated proto prefixes still fail closed.
226
+ GraphQL 403, navigation GETs, vanity HTML-shell honesty, and
227
+ sduiid=screenId stay. Soft-labels stay. Self, non-first-degree, and
228
+ contradictory distances still fail closed, and no email is invented.
229
+ Adapter bundle 1.32.0. This is the tenth live Contact-info drift after
230
+ the 1.31.0 navigation POST. Cloud has no signed-in LinkedIn session;
231
+ do not treat this landing as live green.
232
+ - Read LinkedIn `contacts.read@1` Contact-info Email from the headed
233
+ ProfileContactDetailsOverlay navigation POST after 1st-degree bind.
234
+ Operator Chrome showed Email in the Contact-info modal; the first
235
+ response that contained the Email label was POST
236
+ `/flagship-web/rsc-action/actions/navigation?screenId=…ProfileContactDetailsOverlay&sduiid=…ProfileContactDetailsOverlay`
237
+ with JSON `{ clientArguments, isModal }` and an RSC
238
+ `application/octet-stream` flight. Headed capture bound `sduiid` to
239
+ the same overlay `screenId` constant, not a per-session mint.
240
+ Dormant profile HTML NavigateToScreen exposes `pageKey`
241
+ `profile_view_base_contact_details` and
242
+ `requestedArguments.payload` (`vanityName`, `givenName`,
243
+ `familyName`, `isVanityNameResolved`) but omits `sduiid`; the
244
+ operation still POSTs that exact allowlisted URL after 1st-degree
245
+ bind and peels reviewed payload keys without inventing `$type`,
246
+ `requestMetadata`, or a stolen id. A different `sduiid` fails
247
+ closed. GraphQL Contact-info stays 403 `text/html`, navigation
248
+ overlay GETs stay 500-rejected, and the vanity overlay GET remains
249
+ HTML-shell honesty when no Contact-info NavigateToScreen is present.
250
+ Soft-labels stay. Self, non-first-degree, and contradictory
251
+ distances still fail closed, and no email is invented.
252
+ Adapter bundle 1.31.0. This is the ninth live Contact-info drift after
253
+ the 1.30.0 overlay-shell honesty path. Cloud has no signed-in LinkedIn
254
+ session; do not treat this landing as live green.
255
+ - Keep LinkedIn `contacts.read@1` honest when GraphQL Contact-info stays HTTP
256
+ 403 `text/html` and the vanity `/in/:publicIdentifier/overlay/contact-info/`
257
+ GET returns an HTML-200 profile shell with no Email. Dormant contained
258
+ Chrome cannot mint the client-filled Contact-info modal from GET-only
259
+ RSC or HTML. An HTML shell now fails as omitted Contact-info fields
260
+ after 1st-degree binding, not as a JSON-object parse. Overlay HTML that
261
+ still carries Como Email, a unique mailto, or an RSC/SDUI flight still
262
+ projects. `/flagship-web/rsc-action/actions/navigation` overlay GETs stay
263
+ rejected. Self, non-first-degree, and contradictory distances still fail
264
+ closed, and no email is invented. Adapter bundle 1.30.0. This is the eighth live
265
+ Contact-info drift after the 1.29.0 vanity overlay.
266
+ - Read LinkedIn `contacts.read@1` Contact-info email from the exact vanity
267
+ `/in/:publicIdentifier/overlay/contact-info/` RSC GET when GraphQL
268
+ `voyagerIdentityDashProfileContactInfo` is unavailable. Live dormant
269
+ sessions still bind 1st-degree distance, but the 1.28.0
270
+ `/flagship-web/rsc-action/actions/navigation` overlay GET returns HTTP
271
+ 500 `application/octet-stream`, GraphQL still returns HTTP 403
272
+ `text/html`, and long SDUI strings in profile HTML aborted the
273
+ best-effort embedded walk at profile stage. The operation now skips
274
+ non-bounded field labels during that walk and GETs the live HTML-200
275
+ vanity overlay path with RSC browser binding. ScreenId-only and
276
+ `profileUrn`-bound navigation overlay URLs, other RSC screens, and
277
+ writes stay rejected. Self, non-first-degree, and contradictory
278
+ distances still fail closed, and no email is invented. Adapter bundle 1.29.0. This is the seventh live
279
+ Contact-info drift after the 1.28.0 navigation overlay.
280
+ - Read LinkedIn `contacts.read@1` Contact-info email from the target-bound
281
+ ProfileContactDetailsOverlay RSC navigation when GraphQL
282
+ `voyagerIdentityDashProfileContactInfo` is unavailable. Live dormant
283
+ Chrome and Arc sessions still bind 1st-degree distance from profile HTML,
284
+ but Contact-info GraphQL returns HTTP 403 `text/html` and the page embeds
285
+ no queryId. The operation now GETs the overlay with exact `screenId` plus
286
+ `profileUrn` when queryId is absent, or after that reviewed GraphQL
287
+ rejection, and projects Email plus Connected since from the RSC or SDUI
288
+ payload. ScreenId-only overlay URLs, other RSC screens, and writes stay
289
+ rejected. Self, non-first-degree, and contradictory distances still fail
290
+ closed, and no email is invented. Adapter bundle 1.28.0. This is the sixth
291
+ live Contact-info drift after the 1.23.0 flight-array parse, the 1.24.0
292
+ deep-walk / `vieweeProfileId` join, the 1.25.0 `vieweeMemberUrn` distance
293
+ join, the 1.26.0 multi-escaped peel, and the 1.27.0 non-flight string-slot
294
+ bootstrap.
295
+ - Read LinkedIn `contacts.read@1` first-degree distance from non-flight Como
296
+ rehydration string slots. Live pages after adapter 1.26.0 still bound
297
+ identity through `vieweeProfileId` plus vanity, but `networkDistance` and
298
+ paired `vieweeMemberUrn` sat in a Como array string that was not an RSC
299
+ flight. `decodeComoRehydrationValue` dropped that slot before the 1.26.0
300
+ peel could run. Non-flight string slots now go through
301
+ `decodeStringBootstrap`. True RSC flights still use
302
+ `decodeRscFlightRecords`. Self, non-first-degree, and contradictory
303
+ distances still fail closed, and no email is invented. Adapter bundle 1.27.0.
304
+ This is the fifth live Contact-info drift after the 1.23.0
305
+ flight-array parse, the 1.24.0 deep-walk / `vieweeProfileId` join, the
306
+ 1.25.0 `vieweeMemberUrn` distance join, and the 1.26.0 multi-escaped peel.
307
+ - Read LinkedIn `contacts.read@1` first-degree distance from multi-escaped Como
308
+ PROFILE_VIEW breadcrumb rows. Live pages after adapter 1.25.0 still bound
309
+ identity through `vieweeProfileId` plus vanity, but `networkDistance` and
310
+ paired `vieweeMemberUrn` sat in string rows such as `networkDistance\":1`.
311
+ The binder now peels JSON string escapes and accepts those escaped key/value
312
+ forms. Object, flight-array, and lightly escaped breadcrumbs still bind.
313
+ Self, non-first-degree, and contradictory distances still fail closed, and
314
+ no email is invented. Adapter bundle 1.26.0. This is the fourth live
315
+ Contact-info drift after the 1.23.0 flight-array parse, the 1.24.0 deep-walk
316
+ / `vieweeProfileId` join, and the 1.25.0 `vieweeMemberUrn` distance join.
317
+ - Join LinkedIn `contacts.read@1` first-degree distance when identity comes from
318
+ `vieweeProfileId` plus vanity and `networkDistance` sits on a PROFILE_VIEW
319
+ breadcrumb or `vieweeMemberUrn` record, including a member id or a different
320
+ `fsd_profile` encoding than the bound URN. Self, non-first-degree, and
321
+ contradictory distances still fail closed, and no email is invented.
322
+ Adapter bundle 1.25.0. This is the third live Contact-info drift after the
323
+ 1.23.0 flight-array parse and the 1.24.0 deep-walk / `vieweeProfileId` join.
324
+
10
325
  ## 0.18.0 - 2026-09-11
11
326
 
12
327
  - Add a macOS-first Tauri control panel for accounts, semantic capabilities,
package/README.md CHANGED
@@ -21,7 +21,7 @@ Bring the model, planner, and tool loop you prefer. Ghostget supplies precise we
21
21
  capabilities with local custody and explicit evidence. Its native macOS control
22
22
  panel manages accounts, operation permissions, human approvals, editable OpenAPI
23
23
  interfaces, and a searchable local web request log. See the
24
- [control panel guide](docs/control-panel.md) and [native source build](https://github.com/hraness/ghostget/blob/v0.18.0/desktop/README.md).
24
+ [control panel guide](docs/control-panel.md) and [native source build](https://github.com/hraness/ghostget/blob/v0.18.3/desktop/README.md).
25
25
 
26
26
  The separate public web gateway admits exact HTTPS retrieval URLs under human
27
27
  domain and path rules. Use `ghostget web request <url>` with the app open, and
@@ -51,7 +51,7 @@ ghostget plugin list
51
51
 
52
52
  ## Built-in provider catalog
53
53
 
54
- This v0.18.0 source tree supports executable actions for 20 services: Beeper,
54
+ This v0.18.3 source tree supports executable actions for 20 services: Beeper,
55
55
  Bluesky, ClasificadosOnline, Facebook, Facebook Groups, Facebook Marketplace,
56
56
  GitHub, Gmail, Hacker News, Instagram, iMessage, LinkedIn, Reddit, Substack,
57
57
  Threads, TikTok, Twitch, WhatsApp, X, and YouTube.
@@ -116,7 +116,7 @@ owns the narrow capability boundary that can sit beneath them.
116
116
  Wrench is now Ghostget. The package name is `@hraness/ghostget`, and the CLI
117
117
  command is `ghostget`. Read the [migration guide](docs/ghostget-migration.md)
118
118
  before updating an existing installation. After its optional npm mirror is
119
- verified public, `@hraness/ghostget@0.18.0` is also available from the registry.
119
+ verified public, `@hraness/ghostget@0.18.3` is also available from the registry.
120
120
 
121
121
  This README describes the package version in this source tree. Its versioned
122
122
  GitHub archive and Agent Skill become a supported public release after the
@@ -127,9 +127,9 @@ The optional npm mirror can follow later without delaying canonical delivery.
127
127
  Install the single Ghostget Agent Skill with either runner:
128
128
 
129
129
  ```sh
130
- npx skills add hraness/ghostget#v0.18.0
130
+ npx skills add hraness/ghostget#v0.18.3
131
131
  # or
132
- bunx skills add hraness/ghostget#v0.18.0
132
+ bunx skills add hraness/ghostget#v0.18.3
133
133
  ```
134
134
 
135
135
  The skill teaches Codex, Claude Code, Cursor, and other compatible coding
@@ -139,7 +139,7 @@ install the CLI if it is missing. Start a new agent session after installation.
139
139
  After the matching immutable Release exists, install this exact canonical archive:
140
140
 
141
141
  ```sh
142
- bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.0/hraness-ghostget-0.18.0.tgz
142
+ bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.3/hraness-ghostget-0.18.3.tgz
143
143
  ghostget adapter sync-bundled --json
144
144
  ghostget doctor
145
145
  ```
@@ -167,7 +167,7 @@ For that same released coordinate, install Ghostget in an agent or application
167
167
  that owns its own model, planning, tool loop, approvals, and interface:
168
168
 
169
169
  ```sh
170
- bun add https://github.com/hraness/ghostget/releases/download/v0.18.0/hraness-ghostget-0.18.0.tgz
170
+ bun add https://github.com/hraness/ghostget/releases/download/v0.18.3/hraness-ghostget-0.18.3.tgz
171
171
  ```
172
172
 
173
173
  ```ts
@@ -1,11 +1,12 @@
1
1
  // @bun
2
2
  import {
3
3
  GHOSTGET_VERSION
4
- } from "./index-9wca02er.js";
4
+ } from "./index-cnbz0gws.js";
5
5
  import {
6
6
  canonicalJson,
7
7
  sha256
8
8
  } from "./index-gwk7rbyj.js";
9
+ import"./index-z1w83f81.js";
9
10
 
10
11
  // src/apple-photos-client.ts
11
12
  import { spawnSync } from "child_process";
@@ -4,11 +4,12 @@ import {
4
4
  } from "./index-26yq8q16.js";
5
5
  import {
6
6
  GHOSTGET_VERSION
7
- } from "./index-9wca02er.js";
7
+ } from "./index-cnbz0gws.js";
8
8
  import {
9
9
  canonicalJson,
10
10
  sha256
11
11
  } from "./index-gwk7rbyj.js";
12
+ import"./index-z1w83f81.js";
12
13
 
13
14
  // src/beeper-client.ts
14
15
  import { spawnSync } from "child_process";
package/dist/client.js CHANGED
@@ -9,6 +9,7 @@ import {
9
9
  canonicalJson,
10
10
  sha256
11
11
  } from "./index-gwk7rbyj.js";
12
+ import"./index-z1w83f81.js";
12
13
 
13
14
  // src/client.ts
14
15
  import { spawn, spawnSync } from "child_process";