@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.
- package/CHANGELOG.md +26 -0
- package/README.md +12 -7
- package/dist/apple-photos-client.js +1 -1
- package/dist/beeper-client.js +42 -6
- package/dist/{imessage-direct-install-2gm3kge7.js → imessage-direct-install-5nftwc6p.js} +1 -1
- package/dist/{index-maa9hb5z.js → index-4tsyncva.js} +1 -1
- package/dist/{index-en5hycxp.js → index-kaav16fd.js} +4 -2
- package/dist/{index-2ymnp8xv.js → index-qcf2f6wm.js} +5 -1
- package/dist/{messaging-automation-j4274hvc.js → messaging-automation-58s1366z.js} +1 -1
- package/dist/messaging-automation-api.js +2 -2
- package/dist/{messaging-native-install-8w1j36ah.js → messaging-native-install-c90nv501.js} +1 -1
- package/dist/{whatsapp-automation-runtime-hgh1e9rm.js → whatsapp-automation-runtime-ke1dx91p.js} +1 -1
- package/docs/messaging-automation.md +14 -7
- package/package.json +8 -4
- package/skills/ghostget/references/install.md +5 -5
- package/src/assets/adapters/beeper/wrench-web-adapter.json +37 -1
- package/src/assets/adapters/beeper/wrench-web-adapter.v2.4.0.json +1500 -0
- package/src/beeper-client-types.ts +1 -1
- package/src/control/menubar-cli.ts +3 -1
- package/src/control/menubar-icon.ts +4 -0
- package/src/messaging-automation-descriptors.ts +9 -1
- package/src/messaging-automation-factory.ts +7 -5
- package/src/messaging-automation-server.ts +2 -2
- package/src/messaging-automation-types.ts +3 -2
- package/src/messaging-automation-validation.ts +5 -1
- package/src/plugins/beeper-linked-device/plugin.ts +3 -1
- package/src/provider-plugin-contract-identity.ts +11 -2
- package/src/providers/beeper-automation.ts +447 -0
- package/src/providers/beeper-local-runtime.ts +61 -21
- package/src/providers/beeper-local.ts +4 -4
- package/src/providers/beeper-omni.ts +9 -2
- package/src/providers/messaging-native-install.ts +2 -1
- package/src/providers/x-web-runtime.ts +11 -11
- package/src/providers/x-web.ts +36 -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.
|
|
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;
|