@hraness/ghostget 0.18.14 → 0.18.15
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.
- package/CHANGELOG.md +9 -0
- package/README.md +5 -5
- package/dist/apple-photos-client.js +1 -1
- package/dist/beeper-client.js +1 -1
- package/dist/{index-g6na3p6k.js → index-4tsyncva.js} +1 -1
- package/package.json +1 -1
- package/skills/ghostget/references/install.md +5 -5
- package/src/beeper-client-types.ts +1 -1
- package/src/providers/x-web-runtime.ts +11 -11
- package/src/providers/x-web.ts +36 -35
- package/src/version.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,15 @@ Historical entries retain their original delivery coordinates.
|
|
|
7
7
|
|
|
8
8
|
## Unreleased
|
|
9
9
|
|
|
10
|
+
## 0.18.15
|
|
11
|
+
|
|
12
|
+
- Refresh the X web descriptor evidence for the 2026-09-17 authenticated
|
|
13
|
+
client-web drop. X rotated most GraphQL query IDs and chunk names, so exact
|
|
14
|
+
profile, timeline, and Article operations resume instead of reporting
|
|
15
|
+
contract drift. The three retired DM search descriptors are removed, and a
|
|
16
|
+
deleted or renamed profile target now reports `target-unavailable` rather
|
|
17
|
+
than contract drift when X returns its empty-data result.
|
|
18
|
+
|
|
10
19
|
## 0.18.14
|
|
11
20
|
|
|
12
21
|
- Pin `@hraness/site-footer` v0.13.0 so every public page's shared footer
|
package/README.md
CHANGED
|
@@ -79,7 +79,7 @@ The protocol and [Agent Skill](skills/ghostget/SKILL.md) describe the handoff.
|
|
|
79
79
|
|
|
80
80
|
## Built-in provider catalog
|
|
81
81
|
|
|
82
|
-
This v0.18.
|
|
82
|
+
This v0.18.15 source tree supports executable actions for 20 services: Beeper,
|
|
83
83
|
Bluesky, ClasificadosOnline, Facebook, Facebook Groups, Facebook Marketplace,
|
|
84
84
|
GitHub, Gmail, Hacker News, Instagram, iMessage, LinkedIn, Reddit, Substack,
|
|
85
85
|
Threads, TikTok, Twitch, WhatsApp, X, and YouTube.
|
|
@@ -158,9 +158,9 @@ The optional npm mirror can follow later without delaying canonical delivery.
|
|
|
158
158
|
Install the single Ghostget Agent Skill with either runner:
|
|
159
159
|
|
|
160
160
|
```sh
|
|
161
|
-
npx skills add hraness/ghostget#v0.18.
|
|
161
|
+
npx skills add hraness/ghostget#v0.18.15
|
|
162
162
|
# or
|
|
163
|
-
bunx skills add hraness/ghostget#v0.18.
|
|
163
|
+
bunx skills add hraness/ghostget#v0.18.15
|
|
164
164
|
```
|
|
165
165
|
|
|
166
166
|
The skill teaches Codex, Claude Code, Cursor, and other compatible coding
|
|
@@ -170,7 +170,7 @@ install the CLI if it is missing. Start a new agent session after installation.
|
|
|
170
170
|
After the matching immutable Release exists, install this exact canonical archive:
|
|
171
171
|
|
|
172
172
|
```sh
|
|
173
|
-
bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.
|
|
173
|
+
bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.15/hraness-ghostget-0.18.15.tgz
|
|
174
174
|
ghostget adapter sync-bundled --json
|
|
175
175
|
ghostget doctor
|
|
176
176
|
```
|
|
@@ -198,7 +198,7 @@ For that same released coordinate, install Ghostget in an agent or application
|
|
|
198
198
|
that owns its own model, planning, tool loop, approvals, and interface:
|
|
199
199
|
|
|
200
200
|
```sh
|
|
201
|
-
bun add https://github.com/hraness/ghostget/releases/download/v0.18.
|
|
201
|
+
bun add https://github.com/hraness/ghostget/releases/download/v0.18.15/hraness-ghostget-0.18.15.tgz
|
|
202
202
|
```
|
|
203
203
|
|
|
204
204
|
```ts
|
package/dist/beeper-client.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hraness/ghostget",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.15",
|
|
4
4
|
"description": "Open-source CLI and TypeScript SDK for precise web capabilities for AI agents: page capture, verified media archives, encrypted reads, and typed provider operations.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -17,34 +17,34 @@ If Bun is missing, stop and direct the user to the official
|
|
|
17
17
|
[Bun installation guide](https://bun.sh/docs/installation). Do not switch
|
|
18
18
|
package managers or pipe an unreviewed installer into a shell.
|
|
19
19
|
|
|
20
|
-
This reference is authored for the exact v0.18.
|
|
20
|
+
This reference is authored for the exact v0.18.15 release coordinate. Use it
|
|
21
21
|
only from the matching release-bound Agent Skill after its canonical archive and
|
|
22
22
|
immutable GitHub Release exist. If the coordinate is not public, stop instead
|
|
23
23
|
of substituting `main`, another tag, or a different package version. Install
|
|
24
24
|
that exact release and its reviewed bundled adapter manifests:
|
|
25
25
|
|
|
26
26
|
```sh
|
|
27
|
-
bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.
|
|
27
|
+
bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.15/hraness-ghostget-0.18.15.tgz
|
|
28
28
|
ghostget adapter sync-bundled --json
|
|
29
29
|
ghostget --help
|
|
30
30
|
ghostget doctor --json
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
-
The package is `@hraness/ghostget`; `@hraness/ghostget@0.18.
|
|
33
|
+
The package is `@hraness/ghostget`; `@hraness/ghostget@0.18.15` is an optional npm
|
|
34
34
|
mirror only after verified registry publication. Canonical installation does not
|
|
35
35
|
wait for registry publication.
|
|
36
36
|
|
|
37
37
|
When upgrading from Wrench, use `ghostget` for new commands and
|
|
38
38
|
`GHOSTGET_STATE_HOME` for an explicit state root. Existing state is selected in
|
|
39
39
|
place; do not rename, copy, or delete a state directory as part of the upgrade.
|
|
40
|
-
The [migration guide](https://github.com/hraness/ghostget/blob/v0.18.
|
|
40
|
+
The [migration guide](https://github.com/hraness/ghostget/blob/v0.18.15/docs/ghostget-migration.md)
|
|
41
41
|
explains the retained state aliases and durable protocol names.
|
|
42
42
|
|
|
43
43
|
Do not clone the repository merely to run the CLI. Importing the SDK is a
|
|
44
44
|
separate project dependency and does not install a global command:
|
|
45
45
|
|
|
46
46
|
```sh
|
|
47
|
-
bun add https://github.com/hraness/ghostget/releases/download/v0.18.
|
|
47
|
+
bun add https://github.com/hraness/ghostget/releases/download/v0.18.15/hraness-ghostget-0.18.15.tgz
|
|
48
48
|
```
|
|
49
49
|
|
|
50
50
|
`ghostget adapter sync-bundled` upgrades exact bundled baselines, including an
|
|
@@ -96,7 +96,7 @@ export type BeeperContactInteractionExportReceipt = Readonly<{
|
|
|
96
96
|
implementation: Readonly<{
|
|
97
97
|
producer: Readonly<{
|
|
98
98
|
package: "@hraness/ghostget";
|
|
99
|
-
version: "0.18.
|
|
99
|
+
version: "0.18.15";
|
|
100
100
|
}>;
|
|
101
101
|
officialCli: Readonly<{
|
|
102
102
|
implementation: "github.com/beeper/cli";
|
|
@@ -153,8 +153,8 @@ const viewerEvidence = Object.freeze({
|
|
|
153
153
|
operationName: "Viewer",
|
|
154
154
|
operationType: "query" as const,
|
|
155
155
|
queryId: "9t128XgFic52jPUEkJMf6w",
|
|
156
|
-
sourceChunk: "main.
|
|
157
|
-
observedOn: "2026-09-
|
|
156
|
+
sourceChunk: "main.52fc4dd0aada586aa.js",
|
|
157
|
+
observedOn: "2026-09-17",
|
|
158
158
|
});
|
|
159
159
|
|
|
160
160
|
function isRecord(value: unknown): value is JsonRecord {
|
|
@@ -722,10 +722,10 @@ async function currentChunkText(bootstrap: XBootstrap, sourceChunk: string): Pro
|
|
|
722
722
|
}
|
|
723
723
|
|
|
724
724
|
const articleRichContractEvidence = Object.freeze({
|
|
725
|
-
uploader: "shared~bundle.LoggedInMain~ondemand.HoverCard~loader.AudioDock~loader.Dock~bundle.BookmarkFolders~bundle.Book.
|
|
726
|
-
entities: "shared~bundle.TwitterArticles~ondemand.Verified~bundle.SettingsExtendedProfile~bundle.WorkHistory.
|
|
727
|
-
converter: "shared~bundle.Grok~bundle.GrokDrawer~bundle.ReaderMode~bundle.Birdwatch~bundle.TwitterArticles~bundle.Compose.
|
|
728
|
-
observedOn: "2026-
|
|
725
|
+
uploader: "shared~bundle.LoggedInMain~ondemand.HoverCard~loader.AudioDock~loader.Dock~bundle.BookmarkFolders~bundle.Book.9549529d09fb73baa.js",
|
|
726
|
+
entities: "shared~bundle.TwitterArticles~ondemand.Verified~bundle.SettingsExtendedProfile~bundle.WorkHistory.f5f6edfb2fe9ac4ca.js",
|
|
727
|
+
converter: "shared~bundle.Grok~bundle.GrokDrawer~bundle.ReaderMode~bundle.Birdwatch~bundle.TwitterArticles~bundle.Compose.c851d723cd517177a.js",
|
|
728
|
+
observedOn: "2026-09-17",
|
|
729
729
|
});
|
|
730
730
|
|
|
731
731
|
function requireCurrentBundleTokens(text: string, tokens: readonly string[], label: string): void {
|
|
@@ -743,10 +743,10 @@ async function assertCurrentArticleRichContract(
|
|
|
743
743
|
currentChunkText(bootstrap, articleRichContractEvidence.converter),
|
|
744
744
|
]);
|
|
745
745
|
requireCurrentBundleTokens(entities, [
|
|
746
|
-
'createEntity(
|
|
746
|
+
'createEntity(E.Sg,"MUTABLE",{url:',
|
|
747
747
|
], "Article entity");
|
|
748
748
|
requireCurrentBundleTokens(converter, [
|
|
749
|
-
'mutability:s[
|
|
749
|
+
'mutability:s[i.mutability]',
|
|
750
750
|
'inline_style_ranges:',
|
|
751
751
|
], "Article content converter");
|
|
752
752
|
if (!includeImages) return;
|
|
@@ -767,12 +767,12 @@ async function assertCurrentArticleRichContract(
|
|
|
767
767
|
'TwitterArticle:"twitter_article"',
|
|
768
768
|
], "media uploader");
|
|
769
769
|
requireCurrentBundleTokens(entities, [
|
|
770
|
-
'createEntity(
|
|
771
|
-
'mediaCategory:
|
|
770
|
+
'createEntity(g.LA.MEDIA,g.Ei.IMMUTABLE',
|
|
771
|
+
'mediaCategory:K(e)',
|
|
772
772
|
'mediaId:e.uploadId',
|
|
773
773
|
], "Article entity");
|
|
774
774
|
requireCurrentBundleTokens(converter, [
|
|
775
|
-
'media_items:
|
|
775
|
+
'media_items:i.data?.mediaItems?.map',
|
|
776
776
|
'media_category:e.mediaCategory',
|
|
777
777
|
], "Article content converter");
|
|
778
778
|
}
|
package/src/providers/x-web.ts
CHANGED
|
@@ -238,43 +238,40 @@ export function bindXWebOperationMetadataValues(
|
|
|
238
238
|
export const xWebQueryDescriptorEvidenceSnapshot = Object.freeze({
|
|
239
239
|
schemaVersion: 1,
|
|
240
240
|
role: "revision-evidence-only" as const,
|
|
241
|
-
observedOn: "2026-
|
|
241
|
+
observedOn: "2026-09-17",
|
|
242
242
|
currentBundleResolutionRequired: true,
|
|
243
|
-
mainBundleUrl: "https://abs.twimg.com/responsive-web/client-web/main.
|
|
243
|
+
mainBundleUrl: "https://abs.twimg.com/responsive-web/client-web/main.52fc4dd0aada586aa.js",
|
|
244
244
|
descriptors: Object.freeze([
|
|
245
|
-
{ operationName: "HomeTimeline", operationType: "query", queryId: "
|
|
246
|
-
{ operationName: "HomeLatestTimeline", operationType: "query", queryId: "
|
|
247
|
-
{ operationName: "ListLatestTweetsTimeline", operationType: "query", queryId: "
|
|
248
|
-
{ operationName: "ListRankedTweetsTimeline", operationType: "query", queryId: "
|
|
249
|
-
{ operationName: "Bookmarks", operationType: "query", queryId: "
|
|
250
|
-
{ operationName: "BookmarkSearchTimeline", operationType: "query", queryId: "
|
|
251
|
-
{ operationName: "SearchTimeline", operationType: "query", queryId: "
|
|
252
|
-
{ operationName: "NotificationsTimeline", operationType: "query", queryId: "
|
|
253
|
-
{ operationName: "TweetDetail", operationType: "query", queryId: "
|
|
254
|
-
{ operationName: "TweetResultByRestId", operationType: "query", queryId: "
|
|
255
|
-
{ operationName: "TweetResultsByRestIds", operationType: "query", queryId: "
|
|
256
|
-
{ operationName: "UserTweets", operationType: "query", queryId: "
|
|
257
|
-
{ operationName: "UserTweetsAndReplies", operationType: "query", queryId: "
|
|
258
|
-
{ operationName: "UserMedia", operationType: "query", queryId: "
|
|
259
|
-
{ operationName: "FavoriteTweet", operationType: "mutation", queryId: "lI07N6Otwv1PhnEgXILM7A", sourceChunk: "main.
|
|
260
|
-
{ operationName: "UnfavoriteTweet", operationType: "mutation", queryId: "ZYKSe-w7KEslx3JhSIk5LA", sourceChunk: "main.
|
|
261
|
-
{ operationName: "CreateBookmark", operationType: "mutation", queryId: "aoDbu3RHznuiSkQ9aNM67Q", sourceChunk: "main.
|
|
262
|
-
{ operationName: "DeleteBookmark", operationType: "mutation", queryId: "Wlmlj2-xzyS1GN3a6cj-mQ", sourceChunk: "main.
|
|
263
|
-
{ operationName: "CreateRetweet", operationType: "mutation", queryId: "mbRO74GrOvSfRcJnlMapnQ", sourceChunk: "main.
|
|
264
|
-
{ operationName: "DeleteRetweet", operationType: "mutation", queryId: "ZyZigVsNiFO6v1dEks1eWg", sourceChunk: "main.
|
|
265
|
-
{ operationName: "CreateTweet", operationType: "mutation", queryId: "
|
|
266
|
-
{ operationName: "CreateNoteTweet", operationType: "mutation", queryId: "
|
|
267
|
-
{ operationName: "DeleteTweet", operationType: "mutation", queryId: "nxpZCY2K-I6QoFHAHeojFQ", sourceChunk: "main.
|
|
268
|
-
{ operationName: "
|
|
269
|
-
{ operationName: "
|
|
270
|
-
{ operationName: "
|
|
271
|
-
{ operationName: "
|
|
272
|
-
{ operationName: "
|
|
273
|
-
{ operationName: "
|
|
274
|
-
{ operationName: "
|
|
275
|
-
{ operationName: "ArticleEntityUpdateTitle", operationType: "mutation", queryId: "z_xdvTUbZjSVjt232b4D4A", sourceChunk: "bundle.TwitterArticles.305538ca.js", observedOn: "2026-08-14" },
|
|
276
|
-
{ operationName: "ArticleEntityPublish", operationType: "mutation", queryId: "UyL9qgpV23A8471opeYQbw", sourceChunk: "bundle.TwitterArticles.305538ca.js", observedOn: "2026-08-14" },
|
|
277
|
-
{ operationName: "ArticleEntityResultByRestId", operationType: "query", queryId: "rPdndX2XxQoXIMUafLSSJQ", sourceChunk: "bundle.TwitterArticles.305538ca.js", observedOn: "2026-08-14" },
|
|
245
|
+
{ operationName: "HomeTimeline", operationType: "query", queryId: "og4a4SdSF3WiQkkwaPCdPg", sourceChunk: "shared~bundle.LoggedInMain~bundle.HomeTimeline~bundle.Compose.d2799da549fa4165a.js", observedOn: "2026-09-17" },
|
|
246
|
+
{ operationName: "HomeLatestTimeline", operationType: "query", queryId: "OQPHTgwczzp9RMAPt6BH9A", sourceChunk: "shared~bundle.LoggedInMain~bundle.HomeTimeline~bundle.Compose.d2799da549fa4165a.js", observedOn: "2026-09-17" },
|
|
247
|
+
{ operationName: "ListLatestTweetsTimeline", operationType: "query", queryId: "qIrerw_1oakhehcLoFbaOw", sourceChunk: "shared~loader.Dock~bundle.BookmarkFolders~bundle.Bookmarks~bundle.Explore~bundle.HomeTimeline~bundle.Notifica.bd9965b893a1c830a.js", observedOn: "2026-09-17" },
|
|
248
|
+
{ operationName: "ListRankedTweetsTimeline", operationType: "query", queryId: "K3JUG9l3MeWDoLKeFYex9g", sourceChunk: "shared~loader.Dock~bundle.BookmarkFolders~bundle.Bookmarks~bundle.Explore~bundle.HomeTimeline~bundle.Notifica.bd9965b893a1c830a.js", observedOn: "2026-09-17" },
|
|
249
|
+
{ operationName: "Bookmarks", operationType: "query", queryId: "-dgKZ58Dr9YSJYrcgEb5KA", sourceChunk: "shared~bundle.BookmarkFolders~bundle.Bookmarks.12cb1875a99ef5b3a.js", observedOn: "2026-09-17" },
|
|
250
|
+
{ operationName: "BookmarkSearchTimeline", operationType: "query", queryId: "rbwiGBFqb93lmG7mw_OYZQ", sourceChunk: "main.52fc4dd0aada586aa.js", observedOn: "2026-09-17" },
|
|
251
|
+
{ operationName: "SearchTimeline", operationType: "query", queryId: "auLkqtmHqYEpRvflfvLhyQ", sourceChunk: "main.52fc4dd0aada586aa.js", observedOn: "2026-09-17" },
|
|
252
|
+
{ operationName: "NotificationsTimeline", operationType: "query", queryId: "MSUPE4KwuxyghDO60Bv5uQ", sourceChunk: "bundle.Notifications.62eab6a0a03e5036a.js", observedOn: "2026-09-17" },
|
|
253
|
+
{ operationName: "TweetDetail", operationType: "query", queryId: "zoF7_t363wZyzylk-BLfZQ", sourceChunk: "main.52fc4dd0aada586aa.js", observedOn: "2026-09-17" },
|
|
254
|
+
{ operationName: "TweetResultByRestId", operationType: "query", queryId: "Xl0tsHf4AzflMRjbw9e70A", sourceChunk: "main.52fc4dd0aada586aa.js", observedOn: "2026-09-17" },
|
|
255
|
+
{ operationName: "TweetResultsByRestIds", operationType: "query", queryId: "mQnBPxNdkMLfhXINDDYUSg", sourceChunk: "main.52fc4dd0aada586aa.js", observedOn: "2026-09-17" },
|
|
256
|
+
{ operationName: "UserTweets", operationType: "query", queryId: "jeAA-59Y9FL7FmjgBNIVPw", sourceChunk: "main.52fc4dd0aada586aa.js", observedOn: "2026-09-17" },
|
|
257
|
+
{ operationName: "UserTweetsAndReplies", operationType: "query", queryId: "wI-ubAWfScnG6odLK4XgCg", sourceChunk: "main.52fc4dd0aada586aa.js", observedOn: "2026-09-17" },
|
|
258
|
+
{ operationName: "UserMedia", operationType: "query", queryId: "TwLiEVUhRjjjKVc98IT0TQ", sourceChunk: "main.52fc4dd0aada586aa.js", observedOn: "2026-09-17" },
|
|
259
|
+
{ operationName: "FavoriteTweet", operationType: "mutation", queryId: "lI07N6Otwv1PhnEgXILM7A", sourceChunk: "main.52fc4dd0aada586aa.js", observedOn: "2026-09-17" },
|
|
260
|
+
{ operationName: "UnfavoriteTweet", operationType: "mutation", queryId: "ZYKSe-w7KEslx3JhSIk5LA", sourceChunk: "main.52fc4dd0aada586aa.js", observedOn: "2026-09-17" },
|
|
261
|
+
{ operationName: "CreateBookmark", operationType: "mutation", queryId: "aoDbu3RHznuiSkQ9aNM67Q", sourceChunk: "main.52fc4dd0aada586aa.js", observedOn: "2026-09-17" },
|
|
262
|
+
{ operationName: "DeleteBookmark", operationType: "mutation", queryId: "Wlmlj2-xzyS1GN3a6cj-mQ", sourceChunk: "main.52fc4dd0aada586aa.js", observedOn: "2026-09-17" },
|
|
263
|
+
{ operationName: "CreateRetweet", operationType: "mutation", queryId: "mbRO74GrOvSfRcJnlMapnQ", sourceChunk: "main.52fc4dd0aada586aa.js", observedOn: "2026-09-17" },
|
|
264
|
+
{ operationName: "DeleteRetweet", operationType: "mutation", queryId: "ZyZigVsNiFO6v1dEks1eWg", sourceChunk: "main.52fc4dd0aada586aa.js", observedOn: "2026-09-17" },
|
|
265
|
+
{ operationName: "CreateTweet", operationType: "mutation", queryId: "GYdIGqVWfZNho79bQ2XDoA", sourceChunk: "main.52fc4dd0aada586aa.js", observedOn: "2026-09-17" },
|
|
266
|
+
{ operationName: "CreateNoteTweet", operationType: "mutation", queryId: "u-Vsy3HZId2j10nbdqMI0A", sourceChunk: "main.52fc4dd0aada586aa.js", observedOn: "2026-09-17" },
|
|
267
|
+
{ operationName: "DeleteTweet", operationType: "mutation", queryId: "nxpZCY2K-I6QoFHAHeojFQ", sourceChunk: "main.52fc4dd0aada586aa.js", observedOn: "2026-09-17" },
|
|
268
|
+
{ operationName: "Viewer", operationType: "query", queryId: "9t128XgFic52jPUEkJMf6w", sourceChunk: "main.52fc4dd0aada586aa.js", observedOn: "2026-09-17" },
|
|
269
|
+
{ operationName: "UserByScreenName", operationType: "query", queryId: "KybxDj9RrADIITXlGG8kpw", sourceChunk: "main.52fc4dd0aada586aa.js", observedOn: "2026-09-17" },
|
|
270
|
+
{ operationName: "ArticleEntityDraftCreate", operationType: "mutation", queryId: "_rbmb_NKLqKVBr5X_MSoMQ", sourceChunk: "bundle.TwitterArticles.b3c21fed7d9db030a.js", observedOn: "2026-09-17" },
|
|
271
|
+
{ operationName: "ArticleEntityUpdateContent", operationType: "mutation", queryId: "x4Pz2ifYkOD6uSvzxOIUig", sourceChunk: "bundle.TwitterArticles.b3c21fed7d9db030a.js", observedOn: "2026-09-17" },
|
|
272
|
+
{ operationName: "ArticleEntityUpdateTitle", operationType: "mutation", queryId: "brHFCBTXXg8WOqc7BnXfAw", sourceChunk: "bundle.TwitterArticles.b3c21fed7d9db030a.js", observedOn: "2026-09-17" },
|
|
273
|
+
{ operationName: "ArticleEntityPublish", operationType: "mutation", queryId: "872mse3gUSifcgeJBBl4WA", sourceChunk: "bundle.TwitterArticles.b3c21fed7d9db030a.js", observedOn: "2026-09-17" },
|
|
274
|
+
{ operationName: "ArticleEntityResultByRestId", operationType: "query", queryId: "OF2ES8qTOPLFBU_oZWVkQw", sourceChunk: "bundle.TwitterArticles.b3c21fed7d9db030a.js", observedOn: "2026-09-17" },
|
|
278
275
|
] satisfies readonly XWebQueryDescriptorEvidence[]),
|
|
279
276
|
});
|
|
280
277
|
|
|
@@ -1138,6 +1135,10 @@ export function projectXWebProfileStats(
|
|
|
1138
1135
|
observedAt: string,
|
|
1139
1136
|
): XWebProfileStats {
|
|
1140
1137
|
const expectedHandle = normalizeXWebProfileHandle(expectedHandleValue);
|
|
1138
|
+
const profileData = responseData(response, "X profiles.by-handle response");
|
|
1139
|
+
if (profileData.user === undefined || profileData.user === null) {
|
|
1140
|
+
throw new XProfileTargetUnavailableError();
|
|
1141
|
+
}
|
|
1141
1142
|
const result = record(
|
|
1142
1143
|
extractXWebGraphQlReadResponseRoot("profiles.by-handle", response),
|
|
1143
1144
|
"X profile response result",
|
package/src/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** Canonical immutable Ghostget package release identity. */
|
|
2
|
-
export const GHOSTGET_VERSION = "0.18.
|
|
2
|
+
export const GHOSTGET_VERSION = "0.18.15" as const;
|