@hraness/ghostget 0.18.12 → 0.18.14

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 (37) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +17 -8
  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-9ayntqrw.js → index-g6na3p6k.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 +12 -7
  15. package/skills/ghostget/SKILL.md +1 -1
  16. package/skills/ghostget/references/install.md +5 -5
  17. package/src/assets/adapters/beeper/wrench-web-adapter.json +37 -1
  18. package/src/assets/adapters/beeper/wrench-web-adapter.v2.4.0.json +1500 -0
  19. package/src/beeper-client-types.ts +1 -1
  20. package/src/control/menubar-cli.ts +570 -0
  21. package/src/control/menubar-icon.ts +4 -0
  22. package/src/messaging-automation-descriptors.ts +9 -1
  23. package/src/messaging-automation-factory.ts +7 -5
  24. package/src/messaging-automation-server.ts +2 -2
  25. package/src/messaging-automation-types.ts +3 -2
  26. package/src/messaging-automation-validation.ts +5 -1
  27. package/src/plugins/beeper-linked-device/plugin.ts +3 -1
  28. package/src/provider-plugin-contract-identity.ts +11 -2
  29. package/src/providers/beeper-automation.ts +447 -0
  30. package/src/providers/beeper-local-runtime.ts +61 -21
  31. package/src/providers/beeper-local.ts +4 -4
  32. package/src/providers/beeper-omni.ts +9 -2
  33. package/src/providers/imessage-direct-runtime.ts +28 -2
  34. package/src/providers/messaging-native-install.ts +2 -1
  35. package/src/support-profile.ts +7 -0
  36. package/src/support.ts +1 -7
  37. package/src/version.ts +1 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,35 @@ Historical entries retain their original delivery coordinates.
7
7
 
8
8
  ## Unreleased
9
9
 
10
+ ## 0.18.14
11
+
12
+ - Pin `@hraness/site-footer` v0.13.0 so every public page's shared footer
13
+ carries the package-owned "Built by Hraness" organization attribution. The
14
+ static build keeps the framework-neutral renderer, which tests prove is the
15
+ same `HranessSiteFooter` contract, and the homepage maker biography remains
16
+ product-owned page content rather than footer attribution.
17
+ - Admit Beeper as a third messaging automation provider beside iMessage and
18
+ WhatsApp. Adapter `beeper-local` 2.5.0 declares two scoped owner-automation
19
+ permissions — `messaging.automation.read` and `messaging.automation.send.text` —
20
+ served only through the owner-driven `ghostget messaging automation` host.
21
+ Sessions bind one exact account realm, preserve the realm's canonical Matrix
22
+ self identity beside the bridge-scoped account id, and keep every send
23
+ behind an explicit reviewed grant with no retry after an uncertain dispatch.
24
+ Realm-wide conversation listing excludes chats owned by accounts outside
25
+ the bound realm instead of failing the whole projection.
26
+
27
+ ## 0.18.13
28
+
29
+ - Move the menu companion onto the shared desktop-foundation runner, retaining
30
+ its revision-checked account controls and bounded local output listing.
31
+ - Add explicit menu links for free Ghostget updates and optional paid development
32
+ support. Hraness Accounts owns the browser confirmation; the menu sends no
33
+ local account details or email address.
34
+ - Add the shared optional support link to the static website footer, retaining
35
+ the existing production-only Ghostget newsletter form.
36
+ - Retain timeout escalation until the direct iMessage RPC process group exits,
37
+ including descendants that ignore termination and close inherited pipes.
38
+
10
39
  ## 0.18.12
11
40
 
12
41
  - Make optional updates and support discoverable to agents after successful CLI
package/README.md CHANGED
@@ -18,7 +18,7 @@ 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
20
  Bring the model, planner, and tool loop you prefer. Ghostget supplies precise web
21
- capabilities with local custody and explicit evidence. Its standalone macOS menu-bar companion browses local output files and opens CLI guidance. Account, approval, and interface administration are not exposed in this companion. See the [menu-bar companion guide](docs/menubar-release.md).
21
+ capabilities with local custody and explicit evidence. Its menu-bar companion reviews accounts, pending approvals, and operation permissions through the shared desktop-foundation runner, and browses local output files with CLI guidance. See the [menu-bar companion guide](docs/menubar-release.md).
22
22
 
23
23
  The separate public web gateway admits exact HTTPS retrieval URLs under human
24
24
  domain and path rules. Use `ghostget web request <url>` with an authorized local control client running, and
@@ -48,6 +48,10 @@ ghostget plugin list
48
48
 
49
49
  ## Optional updates and support
50
50
 
51
+ The website footer and menu companion offer the same optional support. The menu
52
+ also links to free Ghostget product updates. Select a link to open Hraness
53
+ Accounts, then review and confirm signup or payment in the browser.
54
+
51
55
  Ghostget stays free to use. After useful standalone work, the CLI may write a
52
56
  compact discovery notice to stderr, including when stdout is JSON or piped.
53
57
  It preserves the result on stdout and does not claim an invitation or inspect
@@ -75,7 +79,7 @@ The protocol and [Agent Skill](skills/ghostget/SKILL.md) describe the handoff.
75
79
 
76
80
  ## Built-in provider catalog
77
81
 
78
- This v0.18.12 source tree supports executable actions for 20 services: Beeper,
82
+ This v0.18.14 source tree supports executable actions for 20 services: Beeper,
79
83
  Bluesky, ClasificadosOnline, Facebook, Facebook Groups, Facebook Marketplace,
80
84
  GitHub, Gmail, Hacker News, Instagram, iMessage, LinkedIn, Reddit, Substack,
81
85
  Threads, TikTok, Twitch, WhatsApp, X, and YouTube.
@@ -90,7 +94,10 @@ Beeper is Ghostget's first provider adapter with a pinned local-CLI transport. I
90
94
  manage reactions, drafts, reminders, and conversation state; and preview and
91
95
  confirm sends, edits, group changes, and presence. Of those, 26 operations use
92
96
  the authoritative `@beeper/cli` 0.6.2 executable; six reads use fixed Beeper
93
- Desktop loopback endpoints. Ghostget binds one Desktop target and does not expose
97
+ Desktop loopback endpoints. Adapter 2.5.0 adds two scoped owner-automation
98
+ permissions, `messaging.automation.read` and `messaging.automation.send.text`,
99
+ served only through the owner-driven `ghostget messaging automation` host with
100
+ sends behind an explicit bounded grant. Ghostget binds one Desktop target and does not expose
94
101
  a generic command runner. Submission is not a claim of network delivery.
95
102
 
96
103
  ```sh
@@ -151,9 +158,9 @@ The optional npm mirror can follow later without delaying canonical delivery.
151
158
  Install the single Ghostget Agent Skill with either runner:
152
159
 
153
160
  ```sh
154
- npx skills add hraness/ghostget#v0.18.12
161
+ npx skills add hraness/ghostget#v0.18.14
155
162
  # or
156
- bunx skills add hraness/ghostget#v0.18.12
163
+ bunx skills add hraness/ghostget#v0.18.14
157
164
  ```
158
165
 
159
166
  The skill teaches Codex, Claude Code, Cursor, and other compatible coding
@@ -163,7 +170,7 @@ install the CLI if it is missing. Start a new agent session after installation.
163
170
  After the matching immutable Release exists, install this exact canonical archive:
164
171
 
165
172
  ```sh
166
- bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.12/hraness-ghostget-0.18.12.tgz
173
+ bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.14/hraness-ghostget-0.18.14.tgz
167
174
  ghostget adapter sync-bundled --json
168
175
  ghostget doctor
169
176
  ```
@@ -191,7 +198,7 @@ For that same released coordinate, install Ghostget in an agent or application
191
198
  that owns its own model, planning, tool loop, approvals, and interface:
192
199
 
193
200
  ```sh
194
- bun add https://github.com/hraness/ghostget/releases/download/v0.18.12/hraness-ghostget-0.18.12.tgz
201
+ bun add https://github.com/hraness/ghostget/releases/download/v0.18.14/hraness-ghostget-0.18.14.tgz
195
202
  ```
196
203
 
197
204
  ```ts
@@ -803,7 +810,9 @@ absorbed into explicit account IDs; `targets status`, `version`, and top-level
803
810
  `export` are internal; `accounts add`, `accounts remove`, and `messages delete`
804
811
  are R4 and unavailable to provider dispatch; and plain `status` is among the
805
812
  53 unsupported paths. None of those three R4 paths appears in the selected
806
- 32-operation provider adapter. Ghostget does not turn administrative,
813
+ 32-operation provider adapter. Two additional scoped permission descriptors —
814
+ `messaging.automation.read` and `messaging.automation.send.text` — belong only
815
+ to the owner-driven automation host and admit no generic invocation. Ghostget does not turn administrative,
807
816
  destructive, caller-selected network, or arbitrary-filesystem commands into
808
817
  agent authority.
809
818
 
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  GHOSTGET_VERSION
4
- } from "./index-9ayntqrw.js";
4
+ } from "./index-g6na3p6k.js";
5
5
  import {
6
6
  canonicalJson,
7
7
  sha256
@@ -4,7 +4,7 @@ import {
4
4
  } from "./index-26yq8q16.js";
5
5
  import {
6
6
  GHOSTGET_VERSION
7
- } from "./index-9ayntqrw.js";
7
+ } from "./index-g6na3p6k.js";
8
8
  import {
9
9
  canonicalJson,
10
10
  sha256
@@ -27,7 +27,7 @@ import {
27
27
  var wrench_web_adapter_default = {
28
28
  schemaVersion: 6,
29
29
  id: "beeper-local",
30
- version: "2.4.0",
30
+ version: "2.5.0",
31
31
  displayName: "Beeper (Pinned Local CLI)",
32
32
  surfaceId: "beeper",
33
33
  origins: [
@@ -1521,6 +1521,42 @@ var wrench_web_adapter_default = {
1521
1521
  timeoutMs: 120000,
1522
1522
  maxOutputBytes: 10485760
1523
1523
  }
1524
+ },
1525
+ "messaging.automation.read": {
1526
+ description: "Scoped owner automation permission; use ghostget messaging automation serve --stdio. Generic invocation is unavailable.",
1527
+ risk: "R1",
1528
+ sideEffect: "none",
1529
+ idempotency: "none",
1530
+ dedupeWindowMs: 0,
1531
+ input: {
1532
+ properties: {},
1533
+ required: []
1534
+ },
1535
+ localCli: {
1536
+ surface: "beeper",
1537
+ action: "messaging.automation.read",
1538
+ contractVersion: 1,
1539
+ timeoutMs: 30000,
1540
+ maxOutputBytes: 8388608
1541
+ }
1542
+ },
1543
+ "messaging.automation.send.text": {
1544
+ description: "Scoped owner automation permission; use ghostget messaging automation serve --stdio. Generic invocation is unavailable.",
1545
+ risk: "R3",
1546
+ sideEffect: "Submit one exact action through an enrolled conversation and an unexpired bounded owner grant; delivery remains unknown.",
1547
+ idempotency: "local-at-most-once",
1548
+ dedupeWindowMs: 86400000,
1549
+ input: {
1550
+ properties: {},
1551
+ required: []
1552
+ },
1553
+ localCli: {
1554
+ surface: "beeper",
1555
+ action: "messaging.automation.send.text",
1556
+ contractVersion: 1,
1557
+ timeoutMs: 30000,
1558
+ maxOutputBytes: 8388608
1559
+ }
1524
1560
  }
1525
1561
  }
1526
1562
  };
@@ -2762,7 +2798,7 @@ function beeperLocalSurfaceInputType(value) {
2762
2798
  return value;
2763
2799
  }
2764
2800
  var adapterOperations = wrench_web_adapter_default.operations;
2765
- var BEEPER_LOCAL_OPERATION_INPUT_TYPES = Object.freeze(Object.fromEntries(Object.keys(adapterOperations).sort().map((operation) => [
2801
+ var BEEPER_LOCAL_OPERATION_INPUT_TYPES = Object.freeze(Object.fromEntries([...BEEPER_LOCAL_OPERATION_NAMES].sort().map((operation) => [
2766
2802
  operation,
2767
2803
  Object.freeze(Object.fromEntries(Object.keys(adapterOperations[operation].input.properties).sort().map((field) => [
2768
2804
  field,
@@ -3774,9 +3810,9 @@ var BEEPER_CLI_V062_SURFACE_CONTRACT = defineLocalCliSurfaceContractV1({
3774
3810
  sdk: BEEPER_DESKTOP_API_PIN,
3775
3811
  runtime: {
3776
3812
  providerPluginId: "beeper-linked-device",
3777
- providerPluginVersion: "2.4.0",
3813
+ providerPluginVersion: "2.5.0",
3778
3814
  adapterId: "beeper-local",
3779
- adapterVersion: "2.4.0",
3815
+ adapterVersion: "2.5.0",
3780
3816
  operationContractVersions: BEEPER_LOCAL_OPERATION_CONTRACT_VERSIONS,
3781
3817
  operationInputTypes: BEEPER_LOCAL_OPERATION_INPUT_TYPES,
3782
3818
  target: BEEPER_DESKTOP_TARGET,
@@ -3790,7 +3826,7 @@ var BEEPER_CLI_V062_SURFACE_CONTRACT = defineLocalCliSurfaceContractV1({
3790
3826
  var BEEPER_CLI_V062_UPSTREAM_SURFACE_SHA256 = "74297df1af30fe89cf1596a0670983e79cf85c0768c2f68e9bc3d386be640836";
3791
3827
  var BEEPER_CLI_V062_CLASSIFICATION_SHA256 = "bcd411af1544e5cd618cd3c04f2852a797bd804d92b7fe4cd226374b61c57d08";
3792
3828
  var BEEPER_CLI_V062_SEMANTIC_PROFILES_SHA256 = "fb7ea5f70f004dd8090c3e6e0996bfa00b0bab8ea5639203e2d1027602450ffe";
3793
- var BEEPER_CLI_V062_WHOLE_SURFACE_SHA256 = "72201ac5eb3532f7c159583f19009f547d7d313e86388466b57c135bd2dc4944";
3829
+ var BEEPER_CLI_V062_WHOLE_SURFACE_SHA256 = "bedc3063a7a792686e351c78e7ba3ed2a5fc0cc6efd3d88a23d9b7ae777765e2";
3794
3830
  var BEEPER_CLI_V062_PUBLIC_MANUAL_SEMANTIC_PROFILE_SHA256 = Object.freeze({
3795
3831
  setup: "cd432e2649e5724d70398e739a2d1c0c21557a23820aaa14562575a5fe689406",
3796
3832
  "install desktop": "478f4cc022b1d51d4016a319efea17e4523c55e3168560c99fdf7779347ae78a",
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  ensureImsgNativeResources,
4
4
  verifyImsgNativeResources
5
- } from "./index-en5hycxp.js";
5
+ } from "./index-kaav16fd.js";
6
6
  import {
7
7
  ensurePrivateStateDirectory,
8
8
  ghostgetStateHome
@@ -1,5 +1,5 @@
1
1
  // @bun
2
2
  // src/version.ts
3
- var GHOSTGET_VERSION = "0.18.12";
3
+ var GHOSTGET_VERSION = "0.18.14";
4
4
 
5
5
  export { GHOSTGET_VERSION };
@@ -147,6 +147,8 @@ async function ensureImsgNativeResources(installDirectory, environment) {
147
147
  async function installBundledMessagingRuntime(provider, environment = process.env) {
148
148
  if (process.platform !== "darwin" || process.arch !== "arm64")
149
149
  throw new Error("Bundled messaging runtimes require Apple silicon macOS");
150
+ if (provider === "beeper")
151
+ throw new Error("Beeper has no bundled messaging runtime; the pinned local CLI and running Beeper Desktop are installed separately");
150
152
  if (provider !== "imessage" && provider !== "whatsapp")
151
153
  throw new Error("Unknown messaging runtime");
152
154
  const bytes = await readBundledMessagingAsset(provider), directory = await mkdtemp(join(await realpath(tmpdir()), "wrench-messaging-install-"));
@@ -160,11 +162,11 @@ async function installBundledMessagingRuntime(provider, environment = process.en
160
162
  await file.close();
161
163
  }
162
164
  if (provider === "imessage") {
163
- const { installReviewedImsgBinary } = await import("./imessage-direct-install-2gm3kge7.js");
165
+ const { installReviewedImsgBinary } = await import("./imessage-direct-install-5nftwc6p.js");
164
166
  const result = await installReviewedImsgBinary(path, environment);
165
167
  return { version: result.version, sha256: result.executableSha256, alreadyPresent: result.alreadyPresent };
166
168
  }
167
- const { installReviewedWhatsAppAutomationBinary } = await import("./whatsapp-automation-runtime-hgh1e9rm.js");
169
+ const { installReviewedWhatsAppAutomationBinary } = await import("./whatsapp-automation-runtime-ke1dx91p.js");
168
170
  return await installReviewedWhatsAppAutomationBinary(path, environment);
169
171
  } finally {
170
172
  await unlink(path);
@@ -59,6 +59,10 @@ function parseAutomationCoordinate(value) {
59
59
  throw new Error("Only exact iMessage conversations are supported.");
60
60
  return Object.freeze({ provider, chatGuid, service: "iMessage", observedChatRowId: automationInteger(r2.observedChatRowId, 1, Number.MAX_SAFE_INTEGER) });
61
61
  }
62
+ if (provider === "beeper") {
63
+ const r2 = automationRecord(value, ["provider", "accountId", "conversationId"]);
64
+ return Object.freeze({ provider, accountId: automationText(r2.accountId, 512), conversationId: automationText(r2.conversationId, 2048) });
65
+ }
62
66
  const r = automationRecord(value, ["provider", "conversationJid"]);
63
67
  if (provider !== "whatsapp" || typeof r.conversationJid !== "string" || !/^(?:[1-9][0-9]{4,14}@s\.whatsapp\.net|[1-9][0-9]{4,19}@lid)$/u.test(r.conversationJid))
64
68
  throw new Error("Only exact individual WhatsApp conversations are supported.");
@@ -66,7 +70,7 @@ function parseAutomationCoordinate(value) {
66
70
  }
67
71
  function parseAutomationIdentity(value) {
68
72
  const r = automationRecord(value, ["provider", "authId", "accountIdentity", "accountSubject", "implementationIdentity", "sourceGeneration"]);
69
- if (r.provider !== "imessage" && r.provider !== "whatsapp")
73
+ if (r.provider !== "imessage" && r.provider !== "whatsapp" && r.provider !== "beeper")
70
74
  throw new Error("Messaging provider is invalid.");
71
75
  return Object.freeze({ provider: r.provider, authId: automationId(r.authId), accountIdentity: automationDigest(r.accountIdentity), accountSubject: automationText(r.accountSubject, 512), implementationIdentity: automationDigest(r.implementationIdentity), sourceGeneration: automationText(r.sourceGeneration, 256) });
72
76
  }
@@ -13,7 +13,7 @@ import {
13
13
  parseAutomationCoordinate,
14
14
  parseAutomationIdentity,
15
15
  parseAutomationMessage
16
- } from "./index-2ymnp8xv.js";
16
+ } from "./index-qcf2f6wm.js";
17
17
  import {
18
18
  ensurePrivateStateDirectory,
19
19
  ghostgetStateHome,
@@ -8,11 +8,11 @@ import {
8
8
 
9
9
  // src/messaging-automation-api.ts
10
10
  async function createMessagingAutomationHost(providers, environment) {
11
- const { MessagingAutomationHost } = await import("./messaging-automation-j4274hvc.js");
11
+ const { MessagingAutomationHost } = await import("./messaging-automation-58s1366z.js");
12
12
  return new MessagingAutomationHost(providers, environment);
13
13
  }
14
14
  async function installBundledMessagingRuntime(provider, environment) {
15
- return (await import("./messaging-native-install-8w1j36ah.js")).installBundledMessagingRuntime(provider, environment);
15
+ return (await import("./messaging-native-install-c90nv501.js")).installBundledMessagingRuntime(provider, environment);
16
16
  }
17
17
  export {
18
18
  installBundledMessagingRuntime,
@@ -4,7 +4,7 @@ import {
4
4
  installBundledMessagingRuntime,
5
5
  readBundledMessagingAsset,
6
6
  verifyImsgNativeResources
7
- } from "./index-en5hycxp.js";
7
+ } from "./index-kaav16fd.js";
8
8
  import"./index-yq6maz71.js";
9
9
  import"./index-gwk7rbyj.js";
10
10
  import"./index-z1w83f81.js";
@@ -3,7 +3,7 @@ import {
3
3
  automationDigest,
4
4
  automationRecord,
5
5
  automationText
6
- } from "./index-2ymnp8xv.js";
6
+ } from "./index-qcf2f6wm.js";
7
7
  import {
8
8
  assertSafeStatePath,
9
9
  captureProcessOwnerIdentity,
@@ -1,7 +1,8 @@
1
1
  # Owner messaging host
2
2
 
3
3
  `ghostget messaging automation serve --stdio` is the trusted owner control port
4
- for enrolled iMessage and WhatsApp conversations. It is never an agent tool.
4
+ for enrolled iMessage, WhatsApp, and Beeper conversations. It is never an agent
5
+ tool.
5
6
  All configuration, targets, message bodies and assets arrive on stdin; stdout
6
7
  contains only protocol responses. Do not run it in a terminal or record its
7
8
  streams in general logs. It does not pair accounts or start synchronization on
@@ -15,11 +16,13 @@ must enforce their own exact permissions and cleanup. Use the stdio host above
15
16
  for Ghostget's built-in accounts and managed registry; its session factory is
16
17
  internal and is not part of the SDK.
17
18
 
18
- Install the current bundled `imessage-direct` or `whatsapp-web` adapter, bind an
19
- explicit existing Ghostget account, and enable managed operation permissions in
20
- Ghostget. Grant `allow` separately to `messaging.automation.read`, the required
21
- `messaging.automation.send.<kind>` operations, and (WhatsApp only)
22
- `messaging.automation.sync`. An old `messaging.send` allow does not authorize this
19
+ Install the current bundled `imessage-direct`, `whatsapp-web`, or `beeper-local`
20
+ adapter, bind an explicit existing Ghostget account, and enable managed
21
+ operation permissions in Ghostget. Grant `allow` separately to
22
+ `messaging.automation.read`, the required `messaging.automation.send.<kind>`
23
+ operations, and (WhatsApp only) `messaging.automation.sync`. Beeper admits exact
24
+ text sends only: `messaging.automation.send.text` is its sole send permission.
25
+ An old `messaging.send` allow does not authorize this
23
26
  host. `ask`, `deny`, and an unmanaged policy do not provide unattended authority.
24
27
  Updated manifests and automatic implementation closures invalidate old grants.
25
28
  These catalog entries cannot dispatch through generic `invoke` or `confirm`.
@@ -31,6 +34,10 @@ ghostget imessage transport install --json
31
34
  ghostget whatsapp automation install --json
32
35
  ```
33
36
 
37
+ Beeper has no bundled runtime: its transport is the separately installed pinned
38
+ `beeper` CLI against the running Beeper Desktop local API on its fixed loopback
39
+ target.
40
+
34
41
  The default installs the exact compressed runtime included in the Ghostget package. An optional `--binary /absolute/reviewed-file` selects an explicit source instead. Only exact pinned bytes are accepted. Installation starts no helper. The
35
42
  WhatsApp binary is the reviewed wacli build with durable events and exact action
36
43
  claims; a stock wacli does not qualify. Existing account pairing and macOS
@@ -46,7 +53,7 @@ responses can arrive before a pending ordinary response.
46
53
 
47
54
  | Method | Exact params | Result |
48
55
  | --- | --- | --- |
49
- | initialize | providers: 1–2 `{provider,authId}`, distinct networks | `{initialized:true}` |
56
+ | initialize | providers: 1–3 `{provider,authId}`, distinct networks | `{initialized:true}` |
50
57
  | status | provider | Current identity and permissions-intersected capabilities |
51
58
  | start | provider | Current status; WhatsApp sync starts explicitly |
52
59
  | conversations | provider, limit (1–200) | Current individual conversations |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hraness/ghostget",
3
- "version": "0.18.12",
3
+ "version": "0.18.14",
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",
@@ -108,6 +108,7 @@
108
108
  "src/assets/adapters/beeper/wrench-web-adapter.v2.1.0.json",
109
109
  "src/assets/adapters/beeper/wrench-web-adapter.v2.2.0.json",
110
110
  "src/assets/adapters/beeper/wrench-web-adapter.v2.3.0.json",
111
+ "src/assets/adapters/beeper/wrench-web-adapter.v2.4.0.json",
111
112
  "src/assets/adapters/imessage/wrench-web-adapter.json",
112
113
  "src/assets/adapters/bluesky/wrench-web-adapter.json",
113
114
  "src/assets/adapters/bluesky/wrench-web-adapter.v1.0.0.json",
@@ -275,6 +276,7 @@
275
276
  "src/cli.ts",
276
277
  "src/cli-intro.ts",
277
278
  "src/support.ts",
279
+ "src/support-profile.ts",
278
280
  "src/cursor-token.ts",
279
281
  "src/derive-command-helper.ts",
280
282
  "src/derivation-dnr-readiness.ts",
@@ -330,6 +332,7 @@
330
332
  "src/providers/imessage-automation.ts",
331
333
  "src/providers/whatsapp-automation.ts",
332
334
  "src/providers/whatsapp-automation-runtime.ts",
335
+ "src/providers/beeper-automation.ts",
333
336
  "src/providers/messaging-native-install.ts",
334
337
  "src/providers/messaging-native-artifacts.ts",
335
338
  "src/assets/messaging-runtime",
@@ -584,6 +587,8 @@
584
587
  "src/control/credential-helper.ts",
585
588
  "src/control/account-revision.ts",
586
589
  "src/control/interface-cli.ts",
590
+ "src/control/menubar-cli.ts",
591
+ "src/control/menubar-icon.ts",
587
592
  "src/control/bundled-interfaces.ts"
588
593
  ],
589
594
  "scripts": {
@@ -609,15 +614,14 @@
609
614
  "check:static": "bun run typecheck && bun run check:effect && bun run website:check && bun run test:npm-release",
610
615
  "check:package": "bun run build && bun run test:package",
611
616
  "check:macos": "bun run ./scripts/ci-macos-check.ts",
612
- "check": "bun run check:static && bun run check:package && bun run test && bun run test:standalone",
617
+ "check:cost-surfaces": "bun ./scripts/check-cost-surfaces.mjs",
618
+ "check": "bun run check:cost-surfaces && bun run check:static && bun run check:package && bun run test && bun run test:standalone",
613
619
  "kb:refresh": "bunx --bun github:hraness/kb#v0.15.2 refresh --root kb",
614
620
  "kb:check:lane": "bunx --bun github:hraness/kb#v0.15.2 check --root kb --no-catalog",
615
621
  "kb:check": "bunx --bun github:hraness/kb#v0.15.2 check --root kb && bunx --bun github:hraness/kb#v0.15.2 agents check --root kb --repo .",
616
622
  "kb:catalog": "bunx --bun github:hraness/kb#v0.15.2 catalog --root kb",
617
623
  "prepack": "bun run check",
618
- "check:effect": "bun scripts/check-effect-architecture.ts",
619
- "menubar:build": "bun scripts/build-menubar.ts",
620
- "menubar:check": "bun scripts/check-menubar.ts"
624
+ "check:effect": "bun scripts/check-effect-architecture.ts"
621
625
  },
622
626
  "dependencies": {
623
627
  "@hraness/kb": "https://github.com/hraness/kb/releases/download/v0.19.6/hraness-kb-0.19.6.tgz",
@@ -628,11 +632,12 @@
628
632
  "source-map": "0.6.1",
629
633
  "source-map-support": "0.5.21",
630
634
  "typescript": "6.0.3",
631
- "@1password/sdk": "0.5.0"
635
+ "@1password/sdk": "0.5.0",
636
+ "@hraness/desktop-foundation": "https://github.com/hraness/desktop-foundation/releases/download/v0.7.0/hraness-desktop-foundation-0.7.0.tgz"
632
637
  },
633
638
  "devDependencies": {
634
639
  "@hraness/design-kit": "github:hraness/design-kit#v0.8.0",
635
- "@hraness/site-footer": "github:hraness/site-footer#v0.11.2",
640
+ "@hraness/site-footer": "github:hraness/site-footer#v0.13.0",
636
641
  "@hraness/ui": "github:hraness/ui#v0.5.13",
637
642
  "@steipete/sweet-cookie": "0.4.3",
638
643
  "@types/bun": "^1.3.14",
@@ -19,7 +19,7 @@ description: >-
19
19
 
20
20
  # Ghostget
21
21
 
22
- Ghostget supplies bounded CLI and SDK capabilities with a menu-bar companion for local outputs and CLI guidance. Use it from the caller's own agent loop; Ghostget does not run a model.
22
+ Ghostget supplies bounded CLI and SDK capabilities with a menu-bar companion for account, approval, and permission review plus local outputs and CLI guidance. Use it from the caller's own agent loop; Ghostget does not run a model.
23
23
 
24
24
  ## Install or verify Ghostget
25
25
 
@@ -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.12 release coordinate. Use it
20
+ This reference is authored for the exact v0.18.14 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.12/hraness-ghostget-0.18.12.tgz
27
+ bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.14/hraness-ghostget-0.18.14.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.12` is an optional npm
33
+ The package is `@hraness/ghostget`; `@hraness/ghostget@0.18.14` 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.12/docs/ghostget-migration.md)
40
+ The [migration guide](https://github.com/hraness/ghostget/blob/v0.18.14/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.12/hraness-ghostget-0.18.12.tgz
47
+ bun add https://github.com/hraness/ghostget/releases/download/v0.18.14/hraness-ghostget-0.18.14.tgz
48
48
  ```
49
49
 
50
50
  `ghostget adapter sync-bundled` upgrades exact bundled baselines, including an
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 6,
3
3
  "id": "beeper-local",
4
- "version": "2.4.0",
4
+ "version": "2.5.0",
5
5
  "displayName": "Beeper (Pinned Local CLI)",
6
6
  "surfaceId": "beeper",
7
7
  "origins": [
@@ -1495,6 +1495,42 @@
1495
1495
  "timeoutMs": 120000,
1496
1496
  "maxOutputBytes": 10485760
1497
1497
  }
1498
+ },
1499
+ "messaging.automation.read": {
1500
+ "description": "Scoped owner automation permission; use ghostget messaging automation serve --stdio. Generic invocation is unavailable.",
1501
+ "risk": "R1",
1502
+ "sideEffect": "none",
1503
+ "idempotency": "none",
1504
+ "dedupeWindowMs": 0,
1505
+ "input": {
1506
+ "properties": {},
1507
+ "required": []
1508
+ },
1509
+ "localCli": {
1510
+ "surface": "beeper",
1511
+ "action": "messaging.automation.read",
1512
+ "contractVersion": 1,
1513
+ "timeoutMs": 30000,
1514
+ "maxOutputBytes": 8388608
1515
+ }
1516
+ },
1517
+ "messaging.automation.send.text": {
1518
+ "description": "Scoped owner automation permission; use ghostget messaging automation serve --stdio. Generic invocation is unavailable.",
1519
+ "risk": "R3",
1520
+ "sideEffect": "Submit one exact action through an enrolled conversation and an unexpired bounded owner grant; delivery remains unknown.",
1521
+ "idempotency": "local-at-most-once",
1522
+ "dedupeWindowMs": 86400000,
1523
+ "input": {
1524
+ "properties": {},
1525
+ "required": []
1526
+ },
1527
+ "localCli": {
1528
+ "surface": "beeper",
1529
+ "action": "messaging.automation.send.text",
1530
+ "contractVersion": 1,
1531
+ "timeoutMs": 30000,
1532
+ "maxOutputBytes": 8388608
1533
+ }
1498
1534
  }
1499
1535
  }
1500
1536
  }