Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -893,7 +893,7 @@ jobs:
- name: Setup Bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
with:
bun-version: 1.3.14
bun-version: 1.4.4

- name: Install dependencies
run: pnpm install --frozen-lockfile
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/cloud-agent-runtime-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ jobs:
node-version-file: '.nvmrc'
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6
with:
bun-version: 1.3.14
bun-version: 1.4.4
- run: pnpm install --frozen-lockfile
- name: Publish verified runtime and exact-SHA handoff
working-directory: services/cloud-agent-next
Expand Down
2 changes: 1 addition & 1 deletion .kilo/cloud-agent-setup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ if [[ ! -x $real_pnpm ]] || grep -qF "$pnpm_wrapper_marker" "$real_pnpm"; then
fi

tools=()
command -v bun >/dev/null || tools+=(bun@1.3.13)
command -v bun >/dev/null || tools+=(bun@1.4.4)
command -v agent-browser >/dev/null || tools+=(agent-browser@0.38.2)
if (( ${#tools[@]} )); then
"${root[@]}" npm install --global --no-audit --no-fund "${tools[@]}"
Expand Down
9 changes: 8 additions & 1 deletion apps/mobile/src/lib/minimum-release-age-policy.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ const MOBILE_EXACT_EXCLUDE_ENTRIES = [
'@shopify/flash-list@2.3.3',
'react-native-reanimated@4.7.1',
] as const;

// Bun 1.4.4 rejects the compromised eMudhra chains, and the wrapper dev types
// must equal the runtime the image-version contract test pins, so the types
// pair moves with it. Types only: no runtime code and no install scripts.
const BUN_TYPES_EXACT_EXCLUDE_ENTRIES = ['@types/bun@1.4.4', 'bun-types@1.4.4'] as const;
// Exact pnpm syntax for one pinned package version: bare or @scoped name, then
// @ and a version starting with a digit. Rejects name-only entries, ranges,
// wildcards, and future-version placeholders alike.
Expand Down Expand Up @@ -103,13 +108,14 @@ describe('minimum release age policy contract', () => {
expect(Number(match?.[1])).toBe(EXPECTED_MINIMUM_RELEASE_AGE_MINUTES);
});

it('excludes exactly the base list plus the container-runtime and mobile exact versions', () => {
it('excludes exactly the base list plus the container-runtime, mobile and Bun-types exact versions', () => {
const expected = [
BASE_EXCLUDE_ENTRIES[0],
...CLOUDFLARE_SANDBOX_EXACT_EXCLUDE_ENTRIES,
...CLOUDFLARE_CONTAINER_RUNTIME_EXACT_EXCLUDE_ENTRIES,
...BASE_EXCLUDE_ENTRIES.slice(1),
...MOBILE_EXACT_EXCLUDE_ENTRIES,
...BUN_TYPES_EXACT_EXCLUDE_ENTRIES,
];
expect(excludeEntries).toEqual(expected);
});
Expand All @@ -119,6 +125,7 @@ describe('minimum release age policy contract', () => {
...CLOUDFLARE_SANDBOX_EXACT_EXCLUDE_ENTRIES,
...CLOUDFLARE_CONTAINER_RUNTIME_EXACT_EXCLUDE_ENTRIES,
...MOBILE_EXACT_EXCLUDE_ENTRIES,
...BUN_TYPES_EXACT_EXCLUDE_ENTRIES,
]);
for (const entry of newExclusions) {
expect(entry).toMatch(EXACT_VERSION_PATTERN);
Expand Down
95 changes: 48 additions & 47 deletions pnpm-lock.yaml

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions pnpm-workspace.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,12 @@ minimumReleaseAgeExclude:
# Approved early exception; worklets 0.13.0 is its required pair and is old
# enough on its own.
- react-native-reanimated@4.7.1
# @types/bun is DefinitelyTyped only: types, no runtime code, no install scripts.
# The wrapper and gastown dev types must equal the Bun the sandbox runs, which
# sandbox-image-versions.test.ts asserts. Bun 1.4.4 is the first release that
# rejects the compromised eMudhra chains, so the pair moves before the window.
- '@types/bun@1.4.4'
- bun-types@1.4.4
overrides:
# One pg client in the tree: drizzle-orm's optional peers include pg, so two
# pg versions split drizzle-orm into two packages and their SQL types stop
Expand Down
2 changes: 1 addition & 1 deletion services/cloud-agent-next/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ COPY --from=node-runtime /usr/local/lib/node_modules /usr/local/lib/node_modules
ARG BUILD_DATE=""
ARG VCS_REF=""
ARG KILOCODE_CLI_VERSION="7.8.17"
ARG BUN_VERSION="1.3.14"
ARG BUN_VERSION="1.4.4"
ARG PNPM_VERSION="12.14.0"
ARG GLAB_VERSION="1.124.0"
ARG GH_VERSION="2.102.0"
Expand Down
2 changes: 1 addition & 1 deletion services/cloud-agent-next/Dockerfile.containers
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ ARG BUILD_DATE=""
ARG VCS_REF=""
ARG KILOCODE_CLI_VERSION="7.8.17"
ARG NODE_VERSION="24.22.1"
ARG BUN_VERSION="1.3.14"
ARG BUN_VERSION="1.4.4"
ARG PNPM_VERSION="12.14.0"
ARG GLAB_VERSION="1.124.0"
ARG GH_VERSION="2.102.0"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
FROM docker.io/library/debian:trixie-slim

ARG NODE_VERSION="24.22.1"
ARG BUN_VERSION="1.3.14"
ARG BUN_VERSION="1.4.4"
ARG PNPM_VERSION="12.14.0"
ARG GLAB_VERSION="1.124.0"
ARG GH_VERSION="2.102.0"
Expand Down
2 changes: 1 addition & 1 deletion services/cloud-agent-next/Dockerfile.dev
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ COPY --from=node-runtime /usr/local/lib/node_modules /usr/local/lib/node_modules
ARG BUILD_DATE=""
ARG VCS_REF=""
ARG KILOCODE_CLI_VERSION="7.8.17"
ARG BUN_VERSION="1.3.14"
ARG BUN_VERSION="1.4.4"
ARG PNPM_VERSION="12.14.0"
ARG GLAB_VERSION="1.124.0"
ARG GH_VERSION="2.102.0"
Expand Down
2 changes: 1 addition & 1 deletion services/cloud-agent-next/Dockerfile.dind
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ USER root
ARG BUILD_DATE=""
ARG VCS_REF=""
ARG KILOCODE_CLI_VERSION="7.8.17"
ARG BUN_VERSION="1.3.14"
ARG BUN_VERSION="1.4.4"
ARG PNPM_VERSION="12.14.0"
ARG GH_VERSION="2.102.0"
ARG GLAB_VERSION="1.124.0"
Expand Down
4 changes: 2 additions & 2 deletions services/cloud-agent-next/scripts/runtime-manifest.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ describe('runtime distribution contract', () => {
it('pins the shared toolchain versions', () => {
expect(RUNTIME_DISTRIBUTION).toEqual({
nodeMajor: '24',
bun: '1.3.14',
bun: '1.4.4',
pnpm: '12.14.0',
glab: '1.124.0',
gh: '2.102.0',
Expand Down Expand Up @@ -70,7 +70,7 @@ describe('runtime distribution contract', () => {
}))
);
const script = runtimeVerificationScript(artifacts);
expect(script).toContain(`test "$(bun --version)" = '1.3.14'`);
expect(script).toContain(`test "$(bun --version)" = '1.4.4'`);
expect(script).toContain(`test "$(pnpm --version)" = '12.14.0'`);
expect(script).toContain('grep -oE');
expect(script).not.toContain('grep -qF');
Expand Down
2 changes: 1 addition & 1 deletion services/cloud-agent-next/scripts/vercel-snapshot.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ describe('Vercel snapshot operator pure logic', () => {
runtimeBuildId: 'cloud-agent-2026-06-10.1',
wrapperVersion: '2.3.0',
runtime: 'node24',
bunVersion: '1.3.14',
bunVersion: '1.4.4',
controlPlaneWrapperSha256: '042faca14bb0e2ccbb0d1f7c3617f91df4254711df5d8fb54e66e64e39264908',
controlPlaneSupervisorSha256:
'0834c2d60725ac5902257b3b78dd161ad26d1c0290dbf1e47cc14add5b8c8142',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ function descriptor(): RuntimeReleaseDescriptor {
format: 1,
bootstrap: 1,
platform: { os: 'linux', arch: 'x64', libc: 'glibc', cpu: 'baseline' },
abi: 'bun-1.3.14',
abi: 'bun-1.4.4',
cliVersion: '7.8.17',
cliExecutable: 'package/bin/kilo',
wrapperSdkVersion: '7.8.17',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ describe('runtime distribution packaging', () => {
const dockerfiles = ['Dockerfile', 'Dockerfile.dev', 'Dockerfile.containers', 'Dockerfile.dind'];

it('pins the shared toolchain versions', () => {
expect(RUNTIME_DISTRIBUTION.bun).toBe('1.3.14');
expect(RUNTIME_DISTRIBUTION.bun).toBe('1.4.4');
expect(RUNTIME_DISTRIBUTION.pnpm).toBe('12.14.0');
expect(RUNTIME_DISTRIBUTION.glab).toBe('1.124.0');
expect(RUNTIME_DISTRIBUTION.gh).toBe('2.102.0');
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
export const RUNTIME_DISTRIBUTION = {
nodeMajor: '24',
bun: '1.3.14',
bun: '1.4.4',
pnpm: '12.14.0',
glab: '1.124.0',
gh: '2.102.0',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ const sessions = (env as unknown as { SANDBOX_SESSION: SessionNamespace }).SANDB
const USER_ID = 'user_term';
const ORG_ID = 'org_term';
const WRAPPER_ID = 'wr_terminal';
// Half the integration wait budget, so a dropped readiness frame is retried
// while a genuinely stuck route still fails within the normal timeout.
const ROUTE_READY_RETRY_MS = 5_000;

type FakeProvider = { adapter: ProviderAdapter; launchEnvs: Record<string, string>[] };

Expand Down Expand Up @@ -305,11 +308,23 @@ async function markRouteReady(
wrapper: FakeWrapper,
sessionId: string
): Promise<void> {
wrapper.send({ type: 'session.ready', sessionId });
await waitFor(async () => {
const isRouteReady = async (): Promise<boolean> => {
const snapshot = await sessionStub.getSession();
expect(snapshot.type === 'found' && snapshot.route.state === 'ready').toBe(true);
});
return snapshot.type === 'found' && snapshot.route.state === 'ready';
};
// The first announce can reach the sandbox DO before it records this socket
// as the current connection, and a frame from a superseded connection is
// dropped without a reply. Announce once more after a shorter wait, so one
// dropped frame does not fail a correct run while a stuck route still fails.
wrapper.send({ type: 'session.ready', sessionId });
try {
await waitFor(async () => expect(await isRouteReady()).toBe(true), {
timeout: ROUTE_READY_RETRY_MS,
});
} catch {
wrapper.send({ type: 'session.ready', sessionId });
await waitFor(async () => expect(await isRouteReady()).toBe(true));
}
}

async function startTerminalSession(): Promise<{
Expand Down
2 changes: 1 addition & 1 deletion services/cloud-agent-next/wrapper/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"zod": "4.6.7"
},
"devDependencies": {
"@types/bun": "1.3.14",
"@types/bun": "1.4.4",
"@types/node": "20.19.41",
"@typescript/native-preview": "catalog:",
"typescript": "catalog:"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import { createOwnedProcessScope } from './owned-processes.js';
import { closeControlWorkload, initializeControlWorkload } from './workload-cgroup.js';

// Opt in only inside an isolated Linux container with a private, writable cgroup namespace.
// Use a 4 GiB container, no swap, the pinned Kilo CLI and Bun 1.3.14. Never run on a shared host cgroup.
// Use a 4 GiB container, no swap, the pinned Kilo CLI and Bun 1.4.4. Never run on a shared host cgroup.
const suite = process.env.KILO_MEMORY_CGROUP_TEST === '1' ? describe : describe.skip;
const MiB = 1024 * 1024;

Expand Down
2 changes: 1 addition & 1 deletion services/gastown/container/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
FROM node:24-bookworm-slim AS node-runtime

FROM oven/bun:1-slim
FROM oven/bun:1.4.4-slim

COPY --from=node-runtime /usr/local/bin/node /usr/local/bin/node
COPY --from=node-runtime /usr/local/lib/node_modules/npm /usr/local/lib/node_modules/npm
Expand Down
4 changes: 2 additions & 2 deletions services/gastown/container/Dockerfile.dev
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM --platform=linux/arm64 oven/bun:1-slim
FROM --platform=linux/arm64 oven/bun:1.4.4-slim

ARG DEBIAN_FRONTEND=noninteractive

Expand Down Expand Up @@ -73,7 +73,7 @@ RUN apt-get update && \
# npm's global install does not resolve optionalDependencies, so we must
# explicitly install the platform-specific binary package alongside the CLI.
# Install both glibc and musl variants — the CLI's binary resolver may
# pick either depending on the detected libc. bun:1-slim is Debian (glibc)
# pick either depending on the detected libc. bun:1.4.4-slim is Debian (glibc)
# but the resolver sometimes misdetects; installing both is safe.
# Also install pnpm — many projects use it as their package manager.
RUN npm install -g @kilocode/cli@7.2.14 @kilocode/cli-linux-arm64@7.2.14 @kilocode/cli-linux-arm64-musl@7.2.14 @kilocode/plugin@7.2.14 pnpm && \
Expand Down
2 changes: 1 addition & 1 deletion services/gastown/container/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
"zod": "catalog:"
},
"devDependencies": {
"@types/bun": "1.3.14",
"@types/bun": "1.4.4",
"typescript": "catalog:",
"vitest": "catalog:"
}
Expand Down
2 changes: 1 addition & 1 deletion services/kiloclaw/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ RUN echo "apt cache bust: ${APT_CACHE_BUST}" \
&& tar -xJf /tmp/node.tar.xz -C /usr/local --strip-components=1 \
&& rm /tmp/node.tar.xz \
&& npm install --global pnpm@11.1.2 \
&& curl -fsSL https://bun.sh/install | bash -s "bun-v1.3.13" \
&& curl -fsSL https://bun.sh/install | bash -s "bun-v1.4.4" \
&& rm -rf /var/lib/apt/lists/*
ENV PATH="/root/.bun/bin:$PATH"

Expand Down
2 changes: 1 addition & 1 deletion services/kiloclaw/Dockerfile.local
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ RUN curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR=/usr/local/b
&& uv --version

# Install pinned Bun (build-time only) and compile the controller bundle.
ARG BUN_VERSION=1.3.13
ARG BUN_VERSION=1.4.4
RUN curl -fsSL https://bun.sh/install | bash -s "bun-v${BUN_VERSION}"
ENV PATH="/root/.bun/bin:$PATH"

Expand Down
Loading