@huynle/hub 0.8.5 → 0.8.7

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
@@ -1,5 +1,28 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.8.7
4
+
5
+ The one-liner now installs OpenCode on Windows when a machine does not have it yet (the reviewed OpenCode 2.2.0 pin for
6
+ windows-x64 is in the signed release manifest). No migration is needed.
7
+
8
+ ### Machine setup
9
+ - **hubctl installs OpenCode on Windows** too: the reviewed pin for OpenCode 2.2.0 `windows-x64`
10
+ (`opencode-windows-x64-baseline.zip`) is in the signed release manifest, so a Windows machine without OpenCode gets
11
+ it from the one-liner, like macOS and Linux.
12
+
13
+ ## 0.8.6
14
+
15
+ A Windows fix release: OpenCode with the hub plugin no longer flashes a console window every few seconds on Windows,
16
+ and the installer ends with what is left to do. Machines pick up the fixed plugin when OpenCode restarts. No migration
17
+ is needed.
18
+
19
+ ### Fixes
20
+ - **Windows: no more flashing console window while OpenCode runs.** The hub plugin polls Herdr (`herdr agent list`)
21
+ every few seconds; on Windows each poll opened a console window for a moment. It and the plugin's local hub now
22
+ start hidden (`windowsHide`).
23
+ - **The installer's last line says what is left** when the machine is set up but not ready yet: usually start
24
+ OpenCode and keep it open so the machine shows online (it read like a failure before).
25
+
3
26
  ## 0.8.5
4
27
 
5
28
  Set up Hub on a machine in one line. The console's new **Set up Hub on a machine** (avatar menu, Settings → Machines
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huynle/hub",
3
- "version": "0.8.5",
3
+ "version": "0.8.7",
4
4
  "description": "Hub: a harness-agnostic central hub your AI agent harnesses connect to (OpenCode first). Follow, steer and stop sessions from your phone or browser, with notifications, optional hands-free Voice and a self-hostable server.",
5
5
  "license": "MIT",
6
6
  "author": "Huy Le",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huynle/hub-claude-code",
3
- "version": "0.8.5",
3
+ "version": "0.8.7",
4
4
  "private": true,
5
5
  "description": "The Claude Code hooks spoke: per-user daemon, hook bridge, plugin dir, `hub claude` wrapper and daemon-backed MCP server (internal; shipped inside @huynle/hub, not published on its own).",
6
6
  "license": "MIT",
@@ -7,7 +7,7 @@ import { createInterface } from "readline";
7
7
  // packages/cli/package.json
8
8
  var package_default = {
9
9
  name: "@huynle/hub-cli",
10
- version: "0.8.5",
10
+ version: "0.8.7",
11
11
  private: true,
12
12
  description: "The hub CLI (`hub` / `hubctl`) for agents and scripts (internal; bundled into @huynle/hub, not published on its own).",
13
13
  license: "MIT",
@@ -8945,7 +8945,7 @@ import { arch as osArch, platform as osPlatform } from "node:os";
8945
8945
  // packages/node/package.json
8946
8946
  var package_default2 = {
8947
8947
  name: "@huynle/hub-node",
8948
- version: "0.8.5",
8948
+ version: "0.8.7",
8949
8949
  private: true,
8950
8950
  description: "`hub node`: the per-machine daemon that prepares, collects and cleans up launch workspaces (internal; shipped inside @huynle/hub, not published on its own).",
8951
8951
  license: "MIT",
@@ -10037,7 +10037,7 @@ import path14 from "node:path";
10037
10037
  // packages/runtime-openshell/package.json
10038
10038
  var package_default3 = {
10039
10039
  name: "@huynle/hub-runtime-openshell",
10040
- version: "0.8.5",
10040
+ version: "0.8.7",
10041
10041
  private: true,
10042
10042
  description: "The `openshell` runtime of `hub node`: launches in NVIDIA OpenShell sandboxes, driven through the openshell CLI (internal; shipped inside @huynle/hub, not published on its own).",
10043
10043
  license: "MIT",
@@ -13721,7 +13721,7 @@ import path23 from "node:path";
13721
13721
  // packages/claude-code/package.json
13722
13722
  var package_default4 = {
13723
13723
  name: "@huynle/hub-claude-code",
13724
- version: "0.8.5",
13724
+ version: "0.8.7",
13725
13725
  private: true,
13726
13726
  description: "The Claude Code hooks spoke: per-user daemon, hook bridge, plugin dir, `hub claude` wrapper and daemon-backed MCP server (internal; shipped inside @huynle/hub, not published on its own).",
13727
13727
  license: "MIT",
@@ -14010,7 +14010,7 @@ import path26 from "node:path";
14010
14010
  // packages/preset/package.json
14011
14011
  var package_default5 = {
14012
14012
  name: "@huynle/hub-preset",
14013
- version: "0.8.5",
14013
+ version: "0.8.7",
14014
14014
  private: true,
14015
14015
  description: "The preset spoke: drives a harness without a spoke of its own through a terminal pane (tmux), described by a data-only preset; official presets in presets/ (internal; shipped inside @huynle/hub, not published on its own).",
14016
14016
  license: "MIT",
@@ -14535,7 +14535,7 @@ import { openSync as openSync6, closeSync as closeSync6, readFileSync as readFil
14535
14535
  // packages/codex/package.json
14536
14536
  var package_default6 = {
14537
14537
  name: "@huynle/hub-codex",
14538
- version: "0.8.5",
14538
+ version: "0.8.7",
14539
14539
  private: true,
14540
14540
  description: "The Codex app-server spoke: attaches to Codex's app-server (its own over stdio, and the shared daemon's socket when present), and the `hub codex` wrapper (internal; shipped inside @huynle/hub, not published on its own).",
14541
14541
  license: "MIT",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huynle/hub-cli",
3
- "version": "0.8.5",
3
+ "version": "0.8.7",
4
4
  "private": true,
5
5
  "description": "The hub CLI (`hub` / `hubctl`) for agents and scripts (internal; bundled into @huynle/hub, not published on its own).",
6
6
  "license": "MIT",
@@ -88,8 +88,10 @@ See `../../PHASE2-CONTRACT.md` for the shared rules. For this adapter:
88
88
  - **Release assets (v2.2.0).** `opencode-windows-x64.zip` (118 610 002 bytes, needs AVX2),
89
89
  `opencode-windows-x64-baseline.zip` (118 610 005 bytes) and `opencode-windows-arm64.zip`. All three are listed in
90
90
  the release's `SHA256SUMS` and in the API's `assets[].digest`.
91
- - **Pin.** The windows-x64 pin is prepared, not reviewed, in `../../release/harness-pins.pending.json`. Only the dev
92
- release includes it (`../../release/README.md`).
91
+ - **Pin.** The windows-x64 pin (`opencode-windows-x64-baseline.zip`) is reviewed in `../../release/harness-pins.json`
92
+ since 2026-11-06 (checks re-run on a Windows host: release by github-actions[bot], fresh download size and sha256
93
+ equal to `SHA256SUMS` and `assets[].digest`, one member `opencode.exe`; `evidence: []`, the release's only
94
+ attestation is an in-toto release record, not a signature hub checks).
93
95
  - **MCP authority.** `user-bin:hubctl.exe`, the real executable (`authorityFor`). The `hub` alias is a cmd shim
94
96
  (`user-bin:hub.cmd`) on Windows, and a `.cmd` cannot be the MCP command because OpenCode starts it without a
95
97
  shell. So `authority: user-bin:hub` is refused on Windows. `.exe` names are refused on POSIX targets.
@@ -89,6 +89,28 @@
89
89
  "evidence-listed"
90
90
  ]
91
91
  }
92
+ },
93
+ {
94
+ "pin": {
95
+ "harness": "opencode",
96
+ "version": "2.2.0",
97
+ "target": "windows-x64",
98
+ "url": "https://github.com/anomalyco/opencode/releases/download/v2.2.0/opencode-windows-x64-baseline.zip",
99
+ "file": "opencode-windows-x64-baseline.zip",
100
+ "size": 118610005,
101
+ "sha256": "sha256:810fe13f6d85c6121e8ab0dd09933ababa2d52dccce9f3bc9ec70de5a9ae126e",
102
+ "evidence": [],
103
+ "minimumVersion": "2.0.0"
104
+ },
105
+ "review": {
106
+ "by": "huynle",
107
+ "on": "2026-11-06",
108
+ "checked": [
109
+ "upstream-release",
110
+ "digest-redownloaded",
111
+ "evidence-listed"
112
+ ]
113
+ }
92
114
  }
93
115
  ]
94
116
  }
@@ -1,24 +1,5 @@
1
1
  {
2
2
  "schema": "hub.harness-pin-pending",
3
3
  "version": 1,
4
- "pins": [
5
- {
6
- "pin": {
7
- "harness": "opencode",
8
- "version": "2.2.0",
9
- "target": "windows-x64",
10
- "url": "https://github.com/anomalyco/opencode/releases/download/v2.2.0/opencode-windows-x64-baseline.zip",
11
- "file": "opencode-windows-x64-baseline.zip",
12
- "size": 118610005,
13
- "sha256": "sha256:810fe13f6d85c6121e8ab0dd09933ababa2d52dccce9f3bc9ec70de5a9ae126e",
14
- "evidence": [],
15
- "minimumVersion": "2.0.0"
16
- },
17
- "prepared": {
18
- "by": "agent (Phase 2 release workstream; NOT a review)",
19
- "on": "2026-11-05",
20
- "note": "UNREVIEWED. The author downloaded the asset (curl -fsSL), measured 118610005 bytes and sha256 810fe13f…126e, which equal the release's SHA256SUMS line and the GitHub API assets[].digest for tag v2.2.0 (published 2026-10-27 by github-actions[bot] from dev). unzip -Zl lists exactly one member, opencode.exe (253303688 bytes, deflate, FAT host). The owner must redo every check of release/README.md themselves and move this entry into harness-pins.json with their own review record; until then only the dev release includes it."
21
- }
22
- }
23
- ]
4
+ "pins": []
24
5
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huynle/hub-codex",
3
- "version": "0.8.5",
3
+ "version": "0.8.7",
4
4
  "private": true,
5
5
  "description": "The Codex app-server spoke: attaches to Codex's app-server (its own over stdio, and the shared daemon's socket when present), and the `hub codex` wrapper (internal; shipped inside @huynle/hub, not published on its own).",
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huynle/hub-node",
3
- "version": "0.8.5",
3
+ "version": "0.8.7",
4
4
  "private": true,
5
5
  "description": "`hub node`: the per-machine daemon that prepares, collects and cleans up launch workspaces (internal; shipped inside @huynle/hub, not published on its own).",
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huynle/hub-preset",
3
- "version": "0.8.5",
3
+ "version": "0.8.7",
4
4
  "private": true,
5
5
  "description": "The preset spoke: drives a harness without a spoke of its own through a terminal pane (tmux), described by a data-only preset; official presets in presets/ (internal; shipped inside @huynle/hub, not published on its own).",
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huynle/hub-protocol",
3
- "version": "0.8.5",
3
+ "version": "0.8.7",
4
4
  "private": true,
5
5
  "description": "Hub ↔ spoke wire protocol (internal; shipped inside @huynle/hub, not published on its own).",
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huynle/hub-runtime-openshell",
3
- "version": "0.8.5",
3
+ "version": "0.8.7",
4
4
  "private": true,
5
5
  "description": "The `openshell` runtime of `hub node`: launches in NVIDIA OpenShell sandboxes, driven through the openshell CLI (internal; shipped inside @huynle/hub, not published on its own).",
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huynle/hub-runtime-sdk",
3
- "version": "0.8.5",
3
+ "version": "0.8.7",
4
4
  "private": true,
5
5
  "description": "The Runtime interface `hub node` runtimes implement (internal; shipped inside @huynle/hub, not published on its own).",
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huynle/hub-sdk",
3
- "version": "0.8.5",
3
+ "version": "0.8.7",
4
4
  "private": true,
5
5
  "description": "Typed client for the hub's /api/agent (internal; shipped inside @huynle/hub, not published on its own).",
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huynle/hub-spoke-sdk",
3
- "version": "0.8.5",
3
+ "version": "0.8.7",
4
4
  "private": true,
5
5
  "description": "Harness-neutral spoke building blocks: hub connection, enrollment, tokens, idempotent deliver, prompt references, HarnessSpoke (internal; shipped inside @huynle/hub, not published on its own).",
6
6
  "license": "MIT",
@@ -335,7 +335,7 @@ function Invoke-HubSetup {
335
335
  $rc = Invoke-HubTool @('setup', 'verify', '--profile', $SetupProfile)
336
336
  switch ($rc) {
337
337
  0 { Write-HubSay "done: this machine is set up for $HubUrl" 'Green' }
338
- 15 { Write-HubSay 'installed, not ready yet: finish the next steps above, then check with: hubctl setup verify' 'Yellow' }
338
+ 15 { Write-HubSay "set up for $HubUrl; to finish, do the next steps above (usually: start OpenCode with 'opencode' and keep it open, so this machine shows online), then check with: hubctl setup verify" 'Cyan' }
339
339
  default { throw "setup verify failed (hubctl exit $rc)" }
340
340
  }
341
341
  } catch {
@@ -257,7 +257,7 @@ main() {
257
257
  fi
258
258
  case "$hub_rc" in
259
259
  0) hub_say "done: this machine is set up for $HUB_URL" ;;
260
- 15) hub_say "installed, not ready yet: finish the next steps above, then check with: hubctl setup verify" ;;
260
+ 15) hub_say "set up for $HUB_URL; to finish, do the next steps above (usually: start OpenCode with \`opencode\` and keep it open, so this machine shows online), then check with: hubctl setup verify" ;;
261
261
  *) hub_die "$hub_rc" "setup verify failed (hubctl exit $hub_rc)" ;;
262
262
  esac
263
263
  return 0
@@ -17,9 +17,10 @@ export const AGENT_START_TIMEOUT_MS = 20_000
17
17
 
18
18
  const STDERR_MAX = 300
19
19
 
20
- export function herdrRunner(bin = "herdr"): HerdrRunner {
20
+ export function herdrRunner(bin = "herdr", spawn: typeof Bun.spawn = Bun.spawn): HerdrRunner {
21
21
  return async (args, timeoutMs) => {
22
- const proc = Bun.spawn([bin, ...args], { stdin: "ignore", stdout: "pipe", stderr: "pipe" })
22
+ // windowsHide: on Windows each poll would otherwise flash a console window (no-op elsewhere).
23
+ const proc = spawn([bin, ...args], { stdin: "ignore", stdout: "pipe", stderr: "pipe", windowsHide: true })
23
24
  const what = `herdr ${args.slice(0, 2).join(" ")}`
24
25
  const stdout = collect(proc.stdout)
25
26
  const stderr = collect(proc.stderr)
@@ -213,6 +213,7 @@ export async function ensureLocalHub(server: string, options: LocalHubOptions =
213
213
  child = (options.spawn ?? (nodeSpawn as unknown as SpawnLike))(runtime.command, [hubScript(root)], {
214
214
  cwd: root,
215
215
  detached: true,
216
+ windowsHide: true,
216
217
  stdio: ["ignore", log, log],
217
218
  env: childEnv,
218
219
  })