@hraness/ghostget 0.18.4 → 0.18.5

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 CHANGED
@@ -7,6 +7,15 @@ Historical entries retain their original delivery coordinates.
7
7
 
8
8
  ## Unreleased
9
9
 
10
+ ## 0.18.5
11
+
12
+ - Remove the website footer's Cloudflare Turnstile gate through the shared
13
+ footer: newsletter signups post directly to the accounts endpoint behind a
14
+ honeypot field, and the geo-gated consent note joins the public pages.
15
+ Package commands, provider operations, and archive contracts stay unchanged.
16
+ - Port the desktop control panel onto the shared menu-bar foundation and
17
+ harden menu refreshes while preserving unknown approval status.
18
+
10
19
  ## 0.18.4
11
20
 
12
21
  - Show a compact ASCII ghost before interactive root help. Piped output,
package/README.md CHANGED
@@ -21,7 +21,7 @@ Bring the model, planner, and tool loop you prefer. Ghostget supplies precise we
21
21
  capabilities with local custody and explicit evidence. Its native macOS control
22
22
  panel manages accounts, operation permissions, human approvals, editable OpenAPI
23
23
  interfaces, and a searchable local web request log. See the
24
- [control panel guide](docs/control-panel.md) and [native source build](https://github.com/hraness/ghostget/blob/v0.18.4/desktop/README.md).
24
+ [control panel guide](docs/control-panel.md) and [native source build](https://github.com/hraness/ghostget/blob/v0.18.5/desktop/README.md).
25
25
 
26
26
  The separate public web gateway admits exact HTTPS retrieval URLs under human
27
27
  domain and path rules. Use `ghostget web request <url>` with the app open, and
@@ -51,7 +51,7 @@ ghostget plugin list
51
51
 
52
52
  ## Built-in provider catalog
53
53
 
54
- This v0.18.4 source tree supports executable actions for 20 services: Beeper,
54
+ This v0.18.5 source tree supports executable actions for 20 services: Beeper,
55
55
  Bluesky, ClasificadosOnline, Facebook, Facebook Groups, Facebook Marketplace,
56
56
  GitHub, Gmail, Hacker News, Instagram, iMessage, LinkedIn, Reddit, Substack,
57
57
  Threads, TikTok, Twitch, WhatsApp, X, and YouTube.
@@ -116,7 +116,7 @@ owns the narrow capability boundary that can sit beneath them.
116
116
  Wrench is now Ghostget. The package name is `@hraness/ghostget`, and the CLI
117
117
  command is `ghostget`. Read the [migration guide](docs/ghostget-migration.md)
118
118
  before updating an existing installation. After its optional npm mirror is
119
- verified public, `@hraness/ghostget@0.18.4` is also available from the registry.
119
+ verified public, `@hraness/ghostget@0.18.5` is also available from the registry.
120
120
 
121
121
  This README describes the package version in this source tree. Its versioned
122
122
  GitHub archive and Agent Skill become a supported public release after the
@@ -127,9 +127,9 @@ The optional npm mirror can follow later without delaying canonical delivery.
127
127
  Install the single Ghostget Agent Skill with either runner:
128
128
 
129
129
  ```sh
130
- npx skills add hraness/ghostget#v0.18.4
130
+ npx skills add hraness/ghostget#v0.18.5
131
131
  # or
132
- bunx skills add hraness/ghostget#v0.18.4
132
+ bunx skills add hraness/ghostget#v0.18.5
133
133
  ```
134
134
 
135
135
  The skill teaches Codex, Claude Code, Cursor, and other compatible coding
@@ -139,7 +139,7 @@ install the CLI if it is missing. Start a new agent session after installation.
139
139
  After the matching immutable Release exists, install this exact canonical archive:
140
140
 
141
141
  ```sh
142
- bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.4/hraness-ghostget-0.18.4.tgz
142
+ bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.5/hraness-ghostget-0.18.5.tgz
143
143
  ghostget adapter sync-bundled --json
144
144
  ghostget doctor
145
145
  ```
@@ -167,7 +167,7 @@ For that same released coordinate, install Ghostget in an agent or application
167
167
  that owns its own model, planning, tool loop, approvals, and interface:
168
168
 
169
169
  ```sh
170
- bun add https://github.com/hraness/ghostget/releases/download/v0.18.4/hraness-ghostget-0.18.4.tgz
170
+ bun add https://github.com/hraness/ghostget/releases/download/v0.18.5/hraness-ghostget-0.18.5.tgz
171
171
  ```
172
172
 
173
173
  ```ts
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  GHOSTGET_VERSION
4
- } from "./index-chc1s7rp.js";
4
+ } from "./index-30bdb2y9.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-chc1s7rp.js";
7
+ } from "./index-30bdb2y9.js";
8
8
  import {
9
9
  canonicalJson,
10
10
  sha256
@@ -1,5 +1,5 @@
1
1
  // @bun
2
2
  // src/version.ts
3
- var GHOSTGET_VERSION = "0.18.4";
3
+ var GHOSTGET_VERSION = "0.18.5";
4
4
 
5
5
  export { GHOSTGET_VERSION };
@@ -9,7 +9,7 @@ and capabilities refresh when you return to the app, after changes made in the
9
9
  app, or when you choose Refresh. Permission decisions always validate current
10
10
  account and integration state.
11
11
 
12
- Build instructions and native qualification live in [desktop/README.md](https://github.com/hraness/ghostget/blob/v0.18.4/desktop/README.md).
12
+ Build instructions and native qualification live in [desktop/README.md](https://github.com/hraness/ghostget/blob/v0.18.5/desktop/README.md).
13
13
  The CLI's canonical five-file GitHub Release contract is unchanged. A source
14
14
  build is not a signed or notarized public macOS installer.
15
15
 
@@ -123,7 +123,7 @@ User and imported interfaces are distinguished from bundled interfaces. Remote
123
123
  references, executable import hooks, arbitrary HTTP templates, and unsupported
124
124
  input-schema constructs are rejected or remain visibly inert as appropriate.
125
125
  An interface without an executor does not become executable by importing it.
126
- Use the existing [provider plugin protocol](https://github.com/hraness/ghostget/blob/v0.18.4/docs/plugins.md) when a new executor is
126
+ Use the existing [provider plugin protocol](https://github.com/hraness/ghostget/blob/v0.18.5/docs/plugins.md) when a new executor is
127
127
  needed. OpenAPI import does not grant it account access.
128
128
 
129
129
  Middleware and LLM approval are future extensions. Future hooks may propose
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hraness/ghostget",
3
- "version": "0.18.4",
3
+ "version": "0.18.5",
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",
@@ -639,7 +639,7 @@
639
639
  },
640
640
  "devDependencies": {
641
641
  "@hraness/design-kit": "github:hraness/design-kit#v0.8.0",
642
- "@hraness/site-footer": "github:hraness/site-footer#v0.6.3",
642
+ "@hraness/site-footer": "github:hraness/site-footer#v0.9.2",
643
643
  "@hraness/ui": "github:hraness/ui#v0.5.13",
644
644
  "@steipete/sweet-cookie": "0.4.3",
645
645
  "@types/bun": "^1.3.14",
@@ -40,4 +40,4 @@ Unsupported executors remain inert. Follow the existing provider-plugin
40
40
  authoring protocol to add an executor; do not synthesize arbitrary authenticated
41
41
  HTTP or broaden an existing grant. Interface changes invalidate exact grants.
42
42
 
43
- The product reference is the [Ghostget control panel guide](https://github.com/hraness/ghostget/blob/v0.18.4/docs/control-panel.md).
43
+ The product reference is the [Ghostget control panel guide](https://github.com/hraness/ghostget/blob/v0.18.5/docs/control-panel.md).
@@ -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.4 release coordinate. Use it
20
+ This reference is authored for the exact v0.18.5 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.4/hraness-ghostget-0.18.4.tgz
27
+ bun add --global https://github.com/hraness/ghostget/releases/download/v0.18.5/hraness-ghostget-0.18.5.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.4` is an optional npm
33
+ The package is `@hraness/ghostget`; `@hraness/ghostget@0.18.5` 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.4/docs/ghostget-migration.md)
40
+ The [migration guide](https://github.com/hraness/ghostget/blob/v0.18.5/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.4/hraness-ghostget-0.18.4.tgz
47
+ bun add https://github.com/hraness/ghostget/releases/download/v0.18.5/hraness-ghostget-0.18.5.tgz
48
48
  ```
49
49
 
50
50
  `ghostget adapter sync-bundled` upgrades exact bundled baselines, including an
@@ -96,7 +96,7 @@ export type BeeperContactInteractionExportReceipt = Readonly<{
96
96
  implementation: Readonly<{
97
97
  producer: Readonly<{
98
98
  package: "@hraness/ghostget";
99
- version: "0.18.4";
99
+ version: "0.18.5";
100
100
  }>;
101
101
  officialCli: Readonly<{
102
102
  implementation: "github.com/beeper/cli";
package/src/cli.ts CHANGED
@@ -196,6 +196,11 @@ export async function runGhostgetCliProcess(
196
196
  process.exitCode = runInterfaceCommand(rawArguments, process.env, resolvedOutput);
197
197
  return;
198
198
  }
199
+ if (rawArguments[0] === "menubar") {
200
+ const { runMenubarCommand } = await import("./control/menubar-cli");
201
+ process.exitCode = await runMenubarCommand(rawArguments, process.env, resolvedOutput);
202
+ return;
203
+ }
199
204
  } catch {
200
205
  resolvedOutput.stderr("Ghostget gateway-only policy blocks this command, or its policy state is unavailable. Review the native app.\n");
201
206
  process.exitCode = 1;
@@ -30,7 +30,7 @@ async function handleAgent(value:unknown,service:ControlService,signal:AbortSign
30
30
  throw new Error("invalid action");
31
31
  }
32
32
  function socketLive(path:string):Promise<boolean> {
33
- return new Promise((resolve,reject)=>{const socket=connect({path});const timer=setTimeout(()=>{socket.destroy();reject(new Error("socket state unknown"));},1000);socket.once("connect",()=>{clearTimeout(timer);socket.destroy();resolve(true);});socket.once("error",error=>{clearTimeout(timer);socket.destroy();if((error as NodeJS.ErrnoException).code==="ECONNREFUSED")resolve(false);else reject(new Error("socket state unknown"));});});
33
+ return new Promise((resolve,reject)=>{const socket=connect({path});const timer=setTimeout(()=>{socket.destroy();reject(new Error("socket state unknown"));},1000);socket.once("connect",()=>{clearTimeout(timer);socket.destroy();resolve(true);});socket.once("error",error=>{clearTimeout(timer);socket.destroy();const code=(error as NodeJS.ErrnoException).code;if(code==="ECONNREFUSED"||code==="ENOENT")resolve(false);else reject(new Error("socket state unknown"));});});
34
34
  }
35
35
  function acquireOwner(environment:ControlEnvironment):()=>void {
36
36
  const directory=join(ghostgetStateHome(environment),"control");ensurePrivateStateDirectory(directory,environment);
@@ -59,7 +59,7 @@ export async function runControlHelper(environment:ControlEnvironment=process.en
59
59
  started=true;const work=(async()=>{let response:unknown;try{if(newline!==buffer.length-1)throw new Error();response=await handleAgent(JSON.parse(buffer.subarray(0,newline).toString("utf8")),service!,controller.signal);}catch(error){response=controlFailure(error);}if(!socket.destroyed)socket.end(`${JSON.stringify(response)}\n`);})();active.add(work);void work.then(()=>active.delete(work),()=>{active.delete(work);process.exitCode=1;process.stdin.destroy();});
60
60
  });
61
61
  });
62
- const shutdown=async()=>{if(closing)return;closing=true;for(const socket of clients)socket.destroy();service?.beginShutdown();await Promise.allSettled(active);service?.close();if(server.listening)await new Promise<void>(resolve=>server.close(()=>resolve()));if(ownedSocket!==undefined){snapshotPrivateStateDirectory(directory,environment,directoryIdentity);try{const stat=lstatSync(socketPath);if(stat.isSocket()&&stat.dev===ownedSocket.dev&&stat.ino===ownedSocket.ino)unlinkSync(socketPath);}catch(error){if((error as NodeJS.ErrnoException).code!=="ENOENT")throw error;}}releaseOwner();};
62
+ const shutdown=async()=>{if(closing)return;closing=true;const closes:Promise<void>[]=[];for(const socket of clients){if(socket.closed)continue;closes.push(new Promise<void>(resolve=>socket.once("close",resolve)));socket.destroy();}await Promise.all(closes);service?.beginShutdown();await Promise.allSettled(active);service?.close();if(server.listening)await new Promise<void>(resolve=>server.close(()=>resolve()));if(ownedSocket!==undefined){snapshotPrivateStateDirectory(directory,environment,directoryIdentity);try{const stat=lstatSync(socketPath);if(stat.isSocket()&&stat.dev===ownedSocket.dev&&stat.ino===ownedSocket.ino)unlinkSync(socketPath);}catch(error){if((error as NodeJS.ErrnoException).code!=="ENOENT")throw error;}}releaseOwner();};
63
63
  const termination=()=>{process.stdin.destroy();};process.once("SIGTERM",termination);process.once("SIGINT",termination);
64
64
  try {
65
65
  if(Buffer.byteLength(socketPath)>100)throw new ControlError("CONTROL_PATH_TOO_LONG","Choose a shorter Ghostget state-home path for the native app.");
@@ -50,7 +50,7 @@ export function checkWebRequest(method:"GET"|"HEAD", rawUrl:string, environment:
50
50
  export function assertGatewayCommandAllowed(args: readonly string[], environment:ControlEnvironment=process.env): void {
51
51
  if(!readWebPolicy(environment).gatewayOnly) return;
52
52
  const first=args[0];
53
- if(first==="web" || first==="capabilities" || first==="--version" || first==="help" || first==="--help" || first==="-h" || args.length===0) return;
53
+ if(first==="web" || first==="capabilities" || first==="menubar" || first==="--version" || first==="help" || first==="--help" || first==="-h" || args.length===0) return;
54
54
  if((first==="plugin"||first==="plugins") && ["list","show"].includes(args[1]??"")) return;
55
55
  throw new ControlError("GATEWAY_ONLY","This state home permits web gateway requests only. Use ghostget web request or change the mode in the native app.");
56
56
  }
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  /** Canonical immutable Ghostget package release identity. */
2
- export const GHOSTGET_VERSION = "0.18.4" as const;
2
+ export const GHOSTGET_VERSION = "0.18.5" as const;