@hraness/ghostget 0.17.6 → 0.18.2

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