@hraness/ghostget 0.18.13 → 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.
Files changed (35) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +12 -7
  3. package/dist/apple-photos-client.js +1 -1
  4. package/dist/beeper-client.js +42 -6
  5. package/dist/{imessage-direct-install-2gm3kge7.js → imessage-direct-install-5nftwc6p.js} +1 -1
  6. package/dist/{index-maa9hb5z.js → index-4tsyncva.js} +1 -1
  7. package/dist/{index-en5hycxp.js → index-kaav16fd.js} +4 -2
  8. package/dist/{index-2ymnp8xv.js → index-qcf2f6wm.js} +5 -1
  9. package/dist/{messaging-automation-j4274hvc.js → messaging-automation-58s1366z.js} +1 -1
  10. package/dist/messaging-automation-api.js +2 -2
  11. package/dist/{messaging-native-install-8w1j36ah.js → messaging-native-install-c90nv501.js} +1 -1
  12. package/dist/{whatsapp-automation-runtime-hgh1e9rm.js → whatsapp-automation-runtime-ke1dx91p.js} +1 -1
  13. package/docs/messaging-automation.md +14 -7
  14. package/package.json +8 -4
  15. package/skills/ghostget/references/install.md +5 -5
  16. package/src/assets/adapters/beeper/wrench-web-adapter.json +37 -1
  17. package/src/assets/adapters/beeper/wrench-web-adapter.v2.4.0.json +1500 -0
  18. package/src/beeper-client-types.ts +1 -1
  19. package/src/control/menubar-cli.ts +3 -1
  20. package/src/control/menubar-icon.ts +4 -0
  21. package/src/messaging-automation-descriptors.ts +9 -1
  22. package/src/messaging-automation-factory.ts +7 -5
  23. package/src/messaging-automation-server.ts +2 -2
  24. package/src/messaging-automation-types.ts +3 -2
  25. package/src/messaging-automation-validation.ts +5 -1
  26. package/src/plugins/beeper-linked-device/plugin.ts +3 -1
  27. package/src/provider-plugin-contract-identity.ts +11 -2
  28. package/src/providers/beeper-automation.ts +447 -0
  29. package/src/providers/beeper-local-runtime.ts +61 -21
  30. package/src/providers/beeper-local.ts +4 -4
  31. package/src/providers/beeper-omni.ts +9 -2
  32. package/src/providers/messaging-native-install.ts +2 -1
  33. package/src/providers/x-web-runtime.ts +11 -11
  34. package/src/providers/x-web.ts +36 -35
  35. package/src/version.ts +1 -1
@@ -978,7 +978,7 @@ export function materializeBeeperMessagingRead(
978
978
  "tombstones",
979
979
  "continuation",
980
980
  "completeness",
981
- ], [], "messaging.read output");
981
+ ], ["canonicalSelfUserId"], "messaging.read output");
982
982
  if (source.accountId !== parsed.accountId || source.conversationId !== parsed.conversationId) {
983
983
  drift("messaging.read output", "must bind input account and conversation");
984
984
  }
@@ -987,6 +987,13 @@ export function materializeBeeperMessagingRead(
987
987
  "messaging.read output.selfUserId",
988
988
  2_048,
989
989
  );
990
+ const canonicalSelfUserId = source.canonicalSelfUserId === undefined || source.canonicalSelfUserId === null
991
+ ? null
992
+ : beeperRawIdentifier(
993
+ source.canonicalSelfUserId,
994
+ "messaging.read output.canonicalSelfUserId",
995
+ 2_048,
996
+ );
990
997
  const requestCursor = parsed.beforeCursor ?? parsed.afterCursor;
991
998
  if (source.requestCursor !== requestCursor) {
992
999
  drift("messaging.read output.requestCursor", "must bind the requested cursor");
@@ -1025,7 +1032,7 @@ export function materializeBeeperMessagingRead(
1025
1032
  );
1026
1033
  if (
1027
1034
  isSender !== null
1028
- && isSender !== (senderId === selfUserId)
1035
+ && isSender !== (senderId === selfUserId || (canonicalSelfUserId !== null && senderId === canonicalSelfUserId))
1029
1036
  ) drift(
1030
1037
  "messaging.read output.messages",
1031
1038
  "must bind direction to the exact self user ID",
@@ -62,8 +62,9 @@ export async function ensureImsgNativeResources(installDirectory: string, enviro
62
62
 
63
63
  /** Owner setup only. Installing resources never pairs, opens Messages, changes
64
64
  * OS permissions, connects a provider, or grants messaging authority. */
65
- export async function installBundledMessagingRuntime(provider: "imessage" | "whatsapp", environment: Environment = process.env): Promise<{ version: string; sha256: string; alreadyPresent?: boolean }> {
65
+ export async function installBundledMessagingRuntime(provider: "imessage" | "whatsapp" | "beeper", environment: Environment = process.env): Promise<{ version: string; sha256: string; alreadyPresent?: boolean }> {
66
66
  if (process.platform !== "darwin" || process.arch !== "arm64") throw new Error("Bundled messaging runtimes require Apple silicon macOS");
67
+ if (provider === "beeper") throw new Error("Beeper has no bundled messaging runtime; the pinned local CLI and running Beeper Desktop are installed separately");
67
68
  if (provider !== "imessage" && provider !== "whatsapp") throw new Error("Unknown messaging runtime");
68
69
  const bytes = await readBundledMessagingAsset(provider), directory = await mkdtemp(join(await realpath(tmpdir()), "wrench-messaging-install-")); await chmod(directory, 0o700);
69
70
  const path = join(directory, "runtime"), file = await open(path, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY | constants.O_NOFOLLOW, 0o500);
@@ -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.59435dbf6f40166da.js",
157
- observedOn: "2026-09-13",
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.a9bac6ba.js",
726
- entities: "shared~bundle.TwitterArticles~ondemand.Verified~bundle.SettingsExtendedProfile~bundle.WorkHistory.d1314bba.js",
727
- converter: "shared~bundle.Grok~bundle.GrokDrawer~bundle.ReaderMode~bundle.Birdwatch~bundle.TwitterArticles~bundle.Compose.02f6dc7a.js",
728
- observedOn: "2026-08-14",
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(w.Sg,"MUTABLE",{url:',
746
+ 'createEntity(E.Sg,"MUTABLE",{url:',
747
747
  ], "Article entity");
748
748
  requireCurrentBundleTokens(converter, [
749
- 'mutability:s[r.mutability]',
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(p.LA.MEDIA,p.Ei.IMMUTABLE',
771
- 'mediaCategory:E(e)',
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:r.data?.mediaItems?.map',
775
+ 'media_items:i.data?.mediaItems?.map',
776
776
  'media_category:e.mediaCategory',
777
777
  ], "Article content converter");
778
778
  }
@@ -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-07-22",
241
+ observedOn: "2026-09-17",
242
242
  currentBundleResolutionRequired: true,
243
- mainBundleUrl: "https://abs.twimg.com/responsive-web/client-web/main.7792f4fa.js",
243
+ mainBundleUrl: "https://abs.twimg.com/responsive-web/client-web/main.52fc4dd0aada586aa.js",
244
244
  descriptors: Object.freeze([
245
- { operationName: "HomeTimeline", operationType: "query", queryId: "wp06oo3fRGU4P1sK8rECqQ", sourceChunk: "shared~bundle.LoggedInMain~bundle.HomeTimeline.c12c8a9a.js", observedOn: "2026-08-20" },
246
- { operationName: "HomeLatestTimeline", operationType: "query", queryId: "BLQWpfVqtgBqAqwRRJcJjA", sourceChunk: "shared~bundle.LoggedInMain~bundle.HomeTimeline.c12c8a9a.js", observedOn: "2026-08-20" },
247
- { operationName: "ListLatestTweetsTimeline", operationType: "query", queryId: "LV64djPRhnsVhGCK76s13w", sourceChunk: "shared~loader.Dock~bundle.BookmarkFolders~bundle.Bookmarks~bundle.Explore~bundle.HomeTimeline~bundle.Notifica.3b894e0a.js" },
248
- { operationName: "ListRankedTweetsTimeline", operationType: "query", queryId: "dPN7GrkxeMF4SUYCo9D9YA", sourceChunk: "shared~loader.Dock~bundle.BookmarkFolders~bundle.Bookmarks~bundle.Explore~bundle.HomeTimeline~bundle.Notifica.3b894e0a.js" },
249
- { operationName: "Bookmarks", operationType: "query", queryId: "tF6KOjmZM0WGcB2Q0mfwhw", sourceChunk: "shared~bundle.BookmarkFolders~bundle.Bookmarks.42881d01aa4e5708a.js", observedOn: "2026-09-13" },
250
- { operationName: "BookmarkSearchTimeline", operationType: "query", queryId: "SpDsqmz6FfYESd1e7TPcAw", sourceChunk: "main.9929b02a.js" },
251
- { operationName: "SearchTimeline", operationType: "query", queryId: "hyPfJYJ_XAtDYoslQc-Rgg", sourceChunk: "main.ae82e9d02d3328bba.js", observedOn: "2026-09-06" },
252
- { operationName: "NotificationsTimeline", operationType: "query", queryId: "dDSNxYH-uWwVo2r3Y5VVqg", sourceChunk: "bundle.Notifications.eea6257a.js" },
253
- { operationName: "TweetDetail", operationType: "query", queryId: "rZA6K31W4E90vZKBmxXV3g", sourceChunk: "main.9929b02a.js" },
254
- { operationName: "TweetResultByRestId", operationType: "query", queryId: "4hhGRbehkcUVTKf8n0f0xw", sourceChunk: "main.9929b02a.js" },
255
- { operationName: "TweetResultsByRestIds", operationType: "query", queryId: "aSkhsainBPfEWA4mG8wnFA", sourceChunk: "main.9929b02a.js" },
256
- { operationName: "UserTweets", operationType: "query", queryId: "eviprbEPLvNG88V3smUngQ", sourceChunk: "main.ae82e9d02d3328bba.js", observedOn: "2026-09-06" },
257
- { operationName: "UserTweetsAndReplies", operationType: "query", queryId: "klja8a2iJX_3to5RdfVlgw", sourceChunk: "main.9929b02a.js" },
258
- { operationName: "UserMedia", operationType: "query", queryId: "IS3w9vvPg1SJysLErvnFGg", sourceChunk: "main.9929b02a.js" },
259
- { operationName: "FavoriteTweet", operationType: "mutation", queryId: "lI07N6Otwv1PhnEgXILM7A", sourceChunk: "main.9929b02a.js" },
260
- { operationName: "UnfavoriteTweet", operationType: "mutation", queryId: "ZYKSe-w7KEslx3JhSIk5LA", sourceChunk: "main.9929b02a.js" },
261
- { operationName: "CreateBookmark", operationType: "mutation", queryId: "aoDbu3RHznuiSkQ9aNM67Q", sourceChunk: "main.9929b02a.js" },
262
- { operationName: "DeleteBookmark", operationType: "mutation", queryId: "Wlmlj2-xzyS1GN3a6cj-mQ", sourceChunk: "main.9929b02a.js" },
263
- { operationName: "CreateRetweet", operationType: "mutation", queryId: "mbRO74GrOvSfRcJnlMapnQ", sourceChunk: "main.9929b02a.js" },
264
- { operationName: "DeleteRetweet", operationType: "mutation", queryId: "ZyZigVsNiFO6v1dEks1eWg", sourceChunk: "main.9929b02a.js" },
265
- { operationName: "CreateTweet", operationType: "mutation", queryId: "WXTdKnLddrQOunD6MhWi3g", sourceChunk: "main.7792f4fa.js", observedOn: "2026-08-20" },
266
- { operationName: "CreateNoteTweet", operationType: "mutation", queryId: "uGXMU9aKbNB9qxxAg4jxkA", sourceChunk: "main.9929b02a.js" },
267
- { operationName: "DeleteTweet", operationType: "mutation", queryId: "nxpZCY2K-I6QoFHAHeojFQ", sourceChunk: "main.9929b02a.js" },
268
- { operationName: "DmAllSearchSlice", operationType: "query", queryId: "zd0F6a_svKAXdlMGbCZDFg", sourceChunk: "bundle.DirectMessages.265735ba.js" },
269
- { operationName: "DmGroupSearchSlice", operationType: "query", queryId: "LxrvmqF3Lokl_BYZ1c83LA", sourceChunk: "bundle.DirectMessages.265735ba.js" },
270
- { operationName: "DmPeopleSearchSlice", operationType: "query", queryId: "c1MnRRmI-_Bggpntlq9-hQ", sourceChunk: "bundle.DirectMessages.265735ba.js" },
271
- { operationName: "Viewer", operationType: "query", queryId: "9t128XgFic52jPUEkJMf6w", sourceChunk: "main.59435dbf6f40166da.js", observedOn: "2026-09-13" },
272
- { operationName: "UserByScreenName", operationType: "query", queryId: "Gb-d6r0vxPOADdG62OEBpQ", sourceChunk: "main.dd6a5b6a.js", observedOn: "2026-08-21" },
273
- { operationName: "ArticleEntityDraftCreate", operationType: "mutation", queryId: "btD9FyMDa3_vydVp7fr87Q", sourceChunk: "bundle.TwitterArticles.305538ca.js", observedOn: "2026-08-14" },
274
- { operationName: "ArticleEntityUpdateContent", operationType: "mutation", queryId: "P5Nc3DYs9D4XqVthNrig8w", sourceChunk: "bundle.TwitterArticles.305538ca.js", observedOn: "2026-08-14" },
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.13" as const;
2
+ export const GHOSTGET_VERSION = "0.18.15" as const;