@hraness/ghostget 0.18.13 → 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 (33) hide show
  1. package/CHANGELOG.md +17 -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-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 +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/version.ts +1 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,23 @@ 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
+
10
27
  ## 0.18.13
11
28
 
12
29
  - Move the menu companion onto the shared desktop-foundation runner, retaining
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.13 source tree supports executable actions for 20 services: Beeper,
82
+ This v0.18.14 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.
@@ -94,7 +94,10 @@ Beeper is Ghostget's first provider adapter with a pinned local-CLI transport. I
94
94
  manage reactions, drafts, reminders, and conversation state; and preview and
95
95
  confirm sends, edits, group changes, and presence. Of those, 26 operations use
96
96
  the authoritative `@beeper/cli` 0.6.2 executable; six reads use fixed Beeper
97
- 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
98
101
  a generic command runner. Submission is not a claim of network delivery.
99
102
 
100
103
  ```sh
@@ -155,9 +158,9 @@ The optional npm mirror can follow later without delaying canonical delivery.
155
158
  Install the single Ghostget Agent Skill with either runner:
156
159
 
157
160
  ```sh
158
- npx skills add hraness/ghostget#v0.18.13
161
+ npx skills add hraness/ghostget#v0.18.14
159
162
  # or
160
- bunx skills add hraness/ghostget#v0.18.13
163
+ bunx skills add hraness/ghostget#v0.18.14
161
164
  ```
162
165
 
163
166
  The skill teaches Codex, Claude Code, Cursor, and other compatible coding
@@ -167,7 +170,7 @@ install the CLI if it is missing. Start a new agent session after installation.
167
170
  After the matching immutable Release exists, install this exact canonical archive:
168
171
 
169
172
  ```sh
170
- bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.13/hraness-ghostget-0.18.13.tgz
173
+ bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.14/hraness-ghostget-0.18.14.tgz
171
174
  ghostget adapter sync-bundled --json
172
175
  ghostget doctor
173
176
  ```
@@ -195,7 +198,7 @@ For that same released coordinate, install Ghostget in an agent or application
195
198
  that owns its own model, planning, tool loop, approvals, and interface:
196
199
 
197
200
  ```sh
198
- bun add https://github.com/hraness/ghostget/releases/download/v0.18.13/hraness-ghostget-0.18.13.tgz
201
+ bun add https://github.com/hraness/ghostget/releases/download/v0.18.14/hraness-ghostget-0.18.14.tgz
199
202
  ```
200
203
 
201
204
  ```ts
@@ -807,7 +810,9 @@ absorbed into explicit account IDs; `targets status`, `version`, and top-level
807
810
  `export` are internal; `accounts add`, `accounts remove`, and `messages delete`
808
811
  are R4 and unavailable to provider dispatch; and plain `status` is among the
809
812
  53 unsupported paths. None of those three R4 paths appears in the selected
810
- 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,
811
816
  destructive, caller-selected network, or arbitrary-filesystem commands into
812
817
  agent authority.
813
818
 
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  GHOSTGET_VERSION
4
- } from "./index-maa9hb5z.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-maa9hb5z.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.13";
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.13",
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",
@@ -331,6 +332,7 @@
331
332
  "src/providers/imessage-automation.ts",
332
333
  "src/providers/whatsapp-automation.ts",
333
334
  "src/providers/whatsapp-automation-runtime.ts",
335
+ "src/providers/beeper-automation.ts",
334
336
  "src/providers/messaging-native-install.ts",
335
337
  "src/providers/messaging-native-artifacts.ts",
336
338
  "src/assets/messaging-runtime",
@@ -586,6 +588,7 @@
586
588
  "src/control/account-revision.ts",
587
589
  "src/control/interface-cli.ts",
588
590
  "src/control/menubar-cli.ts",
591
+ "src/control/menubar-icon.ts",
589
592
  "src/control/bundled-interfaces.ts"
590
593
  ],
591
594
  "scripts": {
@@ -611,7 +614,8 @@
611
614
  "check:static": "bun run typecheck && bun run check:effect && bun run website:check && bun run test:npm-release",
612
615
  "check:package": "bun run build && bun run test:package",
613
616
  "check:macos": "bun run ./scripts/ci-macos-check.ts",
614
- "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",
615
619
  "kb:refresh": "bunx --bun github:hraness/kb#v0.15.2 refresh --root kb",
616
620
  "kb:check:lane": "bunx --bun github:hraness/kb#v0.15.2 check --root kb --no-catalog",
617
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 .",
@@ -629,11 +633,11 @@
629
633
  "source-map-support": "0.5.21",
630
634
  "typescript": "6.0.3",
631
635
  "@1password/sdk": "0.5.0",
632
- "@hraness/desktop-foundation": "https://github.com/hraness/desktop-foundation/releases/download/v0.6.0/hraness-desktop-foundation-0.6.0.tgz"
636
+ "@hraness/desktop-foundation": "https://github.com/hraness/desktop-foundation/releases/download/v0.7.0/hraness-desktop-foundation-0.7.0.tgz"
633
637
  },
634
638
  "devDependencies": {
635
639
  "@hraness/design-kit": "github:hraness/design-kit#v0.8.0",
636
- "@hraness/site-footer": "github:hraness/site-footer#v0.12.2",
640
+ "@hraness/site-footer": "github:hraness/site-footer#v0.13.0",
637
641
  "@hraness/ui": "github:hraness/ui#v0.5.13",
638
642
  "@steipete/sweet-cookie": "0.4.3",
639
643
  "@types/bun": "^1.3.14",
@@ -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.13 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.13/hraness-ghostget-0.18.13.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.13` 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.13/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.13/hraness-ghostget-0.18.13.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
  }