Skip to content

Commit 649f679

Browse files
gitcommit90claude
andcommitted
release: 0.0.40
Version, changelog and the local/1helm-channel-machine:0.0.40 pins, plus the offline release fallback pointed at 0.0.40 with fail-closed placeholder digests until this commit's artifacts exist. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 0858695 commit 649f679

8 files changed

Lines changed: 45 additions & 11 deletions

File tree

CHANGELOG.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,38 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.0.40] - 2026-08-03
11+
12+
### Fixed
13+
14+
- Clicking a channel or a thread no longer takes seconds. The server made
15+
subprocess calls synchronously on the only thread that serves HTTP, so every
16+
request queued behind them. Sampling a trivial endpoint that normally answers
17+
in 1 ms recorded stalls of 2.9 s, 3.2 s and 21.2 s while the interface was in
18+
use — the click was never slow, it was waiting in line.
19+
- Durable memory shelled out to its Python bridge with `execFileSync`,
20+
blocking the event loop for the whole call: a 20-second timeout for most
21+
operations, 120 seconds for transcript sync, and a 771 ms floor just to
22+
import the embedding libraries. The 21.2 s stall was that timeout. It is now
23+
asynchronous, along with the runtime probes it depends on, which turned out
24+
to be reachable from the first memory operation on a request path rather
25+
than only at setup.
26+
- Runtime readiness ran a synchronous container-image check on request
27+
handlers including `/api/computers`, costing 53–73 ms of blocked event loop
28+
every time. Readiness is now cached with a short time-to-live and refreshed
29+
out of band, with one shared refresh so concurrent requests cannot cause a
30+
subprocess storm. Endpoints that act on readiness — setup completion and
31+
runtime start or prepare — await a fresh check rather than trusting the
32+
cache, and image preparation updates it directly so a stale result cannot
33+
persist.
34+
- A channel interaction inspected the same container twice in a row; the
35+
redundant call is gone.
36+
37+
This was the same defect that froze the Windows interface before 0.0.39. That
38+
release removed the boundary those calls crossed without removing the
39+
blocking, so Linux and macOS kept paying it.
40+
41+
1042
## [0.0.39] - 2026-08-03
1143

1244
### Changed
@@ -1099,6 +1131,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
10991131
Application Support, and isolated Apple container machines.
11001132

11011133
[Unreleased]: https://github.com/gitcommit90/1Helm/compare/v0.0.36...HEAD
1134+
[0.0.40]: https://github.com/gitcommit90/1Helm/compare/v0.0.39...v0.0.40
11021135
[0.0.39]: https://github.com/gitcommit90/1Helm/compare/v0.0.30...v0.0.39
11031136
[0.0.38]: https://github.com/gitcommit90/1Helm/compare/v0.0.30...v0.0.38
11041137
[0.0.37]: https://github.com/gitcommit90/1Helm/compare/v0.0.30...v0.0.37

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ A fresh data directory opens first-run setup. The source runtime defaults to
415415
| `PORT` | `8123` | HTTP/WebSocket control-plane port. |
416416
| `CTRL_DATA_DIR` | `./data` | Databases, routing state, uploads, and non-OCI development/Apple workspace mirrors. |
417417
| `HELM_CHANNEL_COMPUTER_BACKEND` | `apple` on macOS, `oci` on Linux and Windows | Host isolation backend; `native` and `mock` are explicit development/test overrides. |
418-
| `HELM_CHANNEL_MACHINE_IMAGE` | `local/1helm-channel-machine:0.0.39` | Versioned channel-machine image contract. |
418+
| `HELM_CHANNEL_MACHINE_IMAGE` | `local/1helm-channel-machine:0.0.40` | Versioned channel-machine image contract. |
419419

420420
### Agent-first JSON CLI
421421

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "1helm",
33
"productName": "1Helm",
4-
"version": "0.0.39",
4+
"version": "0.0.40",
55
"private": true,
66
"type": "module",
77
"license": "AGPL-3.0-only",

site/server.mjs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,16 @@ const RELEASE_CACHE_MS = 10 * 60_000;
4040
// 64 hex characters, so latestLinuxRelease() rejects it and
4141
// /api/releases/linux/latest answers 503 - failing closed rather than handing
4242
// an installer a digest that cannot match what it downloads.
43-
const RELEASE_FALLBACK_TAG = "v0.0.39";
43+
const PENDING_DIGEST = "pending-release-digest";
44+
const RELEASE_FALLBACK_TAG = "v0.0.40";
4445
const RELEASE_FALLBACK = {
4546
tag_name: RELEASE_FALLBACK_TAG,
4647
draft: false,
4748
prerelease: false,
4849
assets: [
49-
["1Helm-0.0.39-arm64.dmg", "de381468a61edc6b5c4d84525792be84f7575ba36777d35119f5878a4298fd0b"],
50-
["1Helm-0.0.39-mac-arm64.zip", "a35ba43a5136592977acfde4e7ba97d1399b4916ff0c90fd192e312a88414547"],
51-
["1Helm-0.0.39-linux-node.tgz", "ac54f11c153e89b8534417b4bfaa8aed22ceb5f0a4b10f164902483ae180b077"],
50+
["1Helm-0.0.40-arm64.dmg", PENDING_DIGEST],
51+
["1Helm-0.0.40-mac-arm64.zip", PENDING_DIGEST],
52+
["1Helm-0.0.40-linux-node.tgz", PENDING_DIGEST],
5253
].map(([name, digest]) => ({
5354
name,
5455
digest: `sha256:${digest}`,

src/server/channel-computers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ const APPLE_RUNTIME_VERSION = "1.1.0";
6868
export const APPLE_RUNTIME_PACKAGE = `container-${APPLE_RUNTIME_VERSION}-installer-signed.pkg`;
6969
export const APPLE_RUNTIME_URL = `https://github.com/apple/container/releases/download/${APPLE_RUNTIME_VERSION}/${APPLE_RUNTIME_PACKAGE}`;
7070
export const APPLE_RUNTIME_SHA256 = "0ca1c42a2269c2557efb1d82b1b38ac553e6a3a3da1b1179c439bcee1e7d6714";
71-
export const DEFAULT_CHANNEL_IMAGE = process.env.HELM_CHANNEL_MACHINE_IMAGE || "local/1helm-channel-machine:0.0.39";
71+
export const DEFAULT_CHANNEL_IMAGE = process.env.HELM_CHANNEL_MACHINE_IMAGE || "local/1helm-channel-machine:0.0.40";
7272
const CONTAINER_CANDIDATES = [process.env.HELM_CONTAINER_CLI, "/usr/local/bin/container", "/opt/homebrew/bin/container", "container"].filter(Boolean) as string[];
7373
const OCI_RUNTIME_VERSION = "1helm-oci-runtime-v1";
7474
const OCI_HELPER_CANDIDATES = [

src/server/db.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -939,7 +939,7 @@ export function migrate(): void {
939939
const platformBackend = process.platform === "darwin" ? "apple" : "oci";
940940
const configuredBackend = String(process.env.HELM_CHANNEL_COMPUTER_BACKEND || platformBackend);
941941
const backend = ["apple", "oci", "native", "mock"].includes(configuredBackend) ? configuredBackend : platformBackend;
942-
const image = String(process.env.HELM_CHANNEL_MACHINE_IMAGE || "local/1helm-channel-machine:0.0.39");
942+
const image = String(process.env.HELM_CHANNEL_MACHINE_IMAGE || "local/1helm-channel-machine:0.0.40");
943943
for (const channel of q(`SELECT c.id FROM channels c JOIN agent_channels ac ON ac.channel_id=c.id
944944
WHERE c.kind='channel' AND c.status<>'deleted'`)) {
945945
const channelId = Number(channel.id);

test/channel-computers.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ test("Apple channel-computer contract preserves isolation, files, wakes, archive
181181
test("runtime digest and packaged image recipe stay pinned", async () => {
182182
assert.equal(computers.APPLE_RUNTIME_SHA256, "0ca1c42a2269c2557efb1d82b1b38ac553e6a3a3da1b1179c439bcee1e7d6714");
183183
assert.match(computers.APPLE_RUNTIME_URL, /\/1\.1\.0\/container-1\.1\.0-installer-signed\.pkg$/);
184-
assert.equal(computers.DEFAULT_CHANNEL_IMAGE, "local/1helm-channel-machine:0.0.39");
184+
assert.equal(computers.DEFAULT_CHANNEL_IMAGE, "local/1helm-channel-machine:0.0.40");
185185
const packaging = await readFile(join(root, "scripts", "package-mac-dmg.cjs"), "utf8");
186186
assert.match(packaging, /container\(\?:\$\|\\\/\)/, "release packaging includes container/ image assets");
187187
const image = await readFile(join(root, "container", "Containerfile"), "utf8");

0 commit comments

Comments
 (0)