Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
64f5cd6
wip: scaffold runner package pinned to @oh-my-pi/pi-coding-agent 18.19.0
andrebrait Nov 12, 2026
786f7cf
wip: ompweb omp runner — collab view plane plus control socket
andrebrait Nov 12, 2026
fafe033
wip: runner speaks its own channel instead of collab
andrebrait Nov 12, 2026
dc635f7
wip: split runner commands into per-group handler tables
andrebrait Nov 12, 2026
3425c71
wip: snapshot of parallel agent work at session interruption
andrebrait Nov 12, 2026
cac2d9d
wip: drop skill diagnostics, exclude runner from root tsc
andrebrait Nov 12, 2026
0a75e60
wip: port host test fixtures to the runner channel; ask form Other + …
andrebrait Nov 12, 2026
b6ab35d
test: port remaining fake omp children to the runner channel
andrebrait Nov 12, 2026
acf5a81
test: fix lint in ported login test and multi-server fixture
andrebrait Nov 12, 2026
ef746de
fix(runner): register set_event_filter and get_client_message_status
andrebrait Nov 12, 2026
52ce984
ci: test runner/ in its own job; drop removed keys from zh-TW
andrebrait Nov 12, 2026
9862a95
ci: build the omp runner before the smoke tests; scope npm test to ap…
andrebrait Nov 12, 2026
c9a9a6f
ci(smoke): retry the temp-dir removal while Windows releases the runn…
andrebrait Nov 12, 2026
c1b8518
ci(smoke): stop the runner's detached brokers on Windows before remov…
andrebrait Nov 12, 2026
5701bea
test(hosts): wait for the fake omp to record the answer before counti…
andrebrait Nov 12, 2026
53d8d3f
fix(hosts): give the runner version probe 30 s
andrebrait Nov 12, 2026
1f2f285
fix(sessions): read the runner's client-message-entry journal
andrebrait Nov 12, 2026
21d460e
feat: drop the last omp RPC dependencies
andrebrait Nov 12, 2026
4e541f3
chore(lint): let the runner drop fields through rest-sibling destruct…
andrebrait Nov 12, 2026
9dcd124
test: port tests from main's cluster work to channel dialog frames
andrebrait Nov 12, 2026
150ae51
fix: address the #460 review round
andrebrait Nov 12, 2026
611f45c
test: move host fixtures to link protocol v10
andrebrait Nov 12, 2026
fc3e8c5
test(hosts): hold acks until a full window is resent in the 20,000-li…
andrebrait Nov 12, 2026
161410c
ci: install the runner's dependencies before the test suite
andrebrait Nov 12, 2026
bea3157
test(hosts): a fake runner the host hangs up on ignores EPIPE
andrebrait Nov 12, 2026
4e49c2d
fix(hosts): port cluster configuration to link protocol v10 and the r…
andrebrait Nov 12, 2026
cfebad7
fix(hosts): the host socket no longer narrows the daemon's umask whil…
andrebrait Nov 12, 2026
87ad33d
feat(hosts): preflight the session omp before an upgrade switches
andrebrait Nov 12, 2026
24f5d7f
fix(hosts): narrow the host socket directory to 0700 and close the se…
andrebrait Nov 12, 2026
45682a4
fix(hosts): preflight requires the channel protocol, shuts omp down g…
andrebrait Nov 12, 2026
ad25229
fix(update): web preflight checks the candidate's own omp and a faile…
andrebrait Nov 12, 2026
399a7ff
docs: preflight and protocol-10 cluster upgrade notes
andrebrait Nov 12, 2026
ba43f0f
test(rpc): speak the runner channel in the awaiting-input test from #461
andrebrait Nov 12, 2026
4cfbb4d
feat(runner): compile ompweb-omp against the fork's omp packages
andrebrait Nov 13, 2026
8f2f79b
ci(release): ship the newest omp integration build with every release
andrebrait Nov 13, 2026
2aa2a14
build(runner): pin omp to the fork build v18.20.0-int.202611130808.gf…
andrebrait Nov 13, 2026
5a8dcb5
feat(hosts): omp updates with ompweb
andrebrait Nov 13, 2026
5e801d6
test(hosts): drop the omp runtime update tests; cover the host update…
andrebrait Nov 13, 2026
f263f18
docs: design and plan for building omp in the fork and shipping it wi…
andrebrait Nov 13, 2026
f670477
fix(hosts): host binary updates fit a release with its omp runner
andrebrait Nov 13, 2026
d6a35e6
ci(release): pin and install the runner before npm test
andrebrait Nov 13, 2026
3c3d9e8
feat(hosts)!: link protocol 11 and refuse every daemon below it
andrebrait Nov 13, 2026
5818489
refactor(hosts): drop link compat for daemons below the minimum protocol
andrebrait Nov 13, 2026
c547e62
test(hosts): cover what the update mutations slipped past; drop a vac…
andrebrait Nov 13, 2026
a04186b
fix(omp): one "Reinstall ompweb" message for a missing omp
andrebrait Nov 13, 2026
535ead9
fix(service): never pin the services to a stock omp found on PATH
andrebrait Nov 13, 2026
d83b424
build(runner): re-pin without breaking vendor/ on a bad release
andrebrait Nov 13, 2026
cd97ac0
fix(update): give the candidate preflight room for its own timeouts
andrebrait Nov 13, 2026
4343e05
docs(code): drop comments that still describe omp RPC mode
andrebrait Nov 13, 2026
d4a385f
test(host): expect the current link protocol from the CLI daemon status
andrebrait Nov 13, 2026
48a4bec
feat(omp): every install fetches its omp runner from its own release
andrebrait Nov 13, 2026
fa029a7
ci(release): attach the omp runners to the release, not to npm or the…
andrebrait Nov 13, 2026
68b09c5
docs: bring README, AGENTS, DESIGN, CHANGELOG and the specs in line w…
andrebrait Nov 13, 2026
346a4ec
docs: every install fetches its omp runner from its release; hosts ne…
andrebrait Nov 13, 2026
76d8b00
chore: the omp fork is ompweb-dev/oh-my-pi
andrebrait Nov 13, 2026
40ca365
fix(ask): hide the composer while a form ask is open, as the TUI does
andrebrait Nov 13, 2026
cb93da0
fix(ask): hold steers while an ask is open
andrebrait Nov 13, 2026
45780a7
fix(ask): send a held steer as soon as the ask closes
andrebrait Nov 13, 2026
d163c4b
fix(agent-tools): send a steer into an open ask as a follow-up
andrebrait Nov 13, 2026
4b1d602
docs(rpc-manager): note that the rpc naming is a leftover
andrebrait Nov 13, 2026
3f25b49
build(runner): pin omp to the fork build v18.20.0-int.202611131515.g1…
andrebrait Nov 13, 2026
bf50397
fix(runner): re-pinning rehashes tarballs whose name did not change b…
andrebrait Nov 13, 2026
0f57b61
fix(runner): send a relocation's notice before the moved session's id…
andrebrait Nov 13, 2026
93de171
fix(hosts): give the other servers a shared prompt's outcome for noti…
andrebrait Nov 13, 2026
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
97 changes: 97 additions & 0 deletions .github/workflows/omp-runner.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
name: omp runner binaries

on:
push:
branches:
- main
pull_request:
paths:
- "runner/**"
- ".github/workflows/omp-runner.yml"
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
test:
name: Typecheck and test
runs-on: ubuntu-latest
defaults:
run:
working-directory: runner
steps:
- name: Checkout repository
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262

- name: Setup Bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
with:
bun-version: 1.4.4

- name: Fetch the pinned omp packages
run: bun scripts/use-omp-build.ts

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Typecheck
run: bunx tsc -p .

- name: Test
run: bun test

build:
name: Build (${{ matrix.target }})
# Bun cross-compiles every target from Linux, as omp's own release does.
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- { target: linux-x64, os: linux, cpu: x64, binary: ompweb-omp-linux-x64 }
- { target: linux-arm64, os: linux, cpu: arm64, binary: ompweb-omp-linux-arm64 }
- { target: darwin-x64, os: darwin, cpu: x64, binary: ompweb-omp-darwin-x64 }
- { target: darwin-arm64, os: darwin, cpu: arm64, binary: ompweb-omp-darwin-arm64 }
- { target: windows-x64, os: win32, cpu: x64, binary: ompweb-omp-windows-x64.exe }
defaults:
run:
working-directory: runner

steps:
- name: Checkout repository
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262

- name: Setup Bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
with:
bun-version: 1.4.4

- name: Fetch the pinned omp packages
run: bun scripts/use-omp-build.ts

# The host's own addon package is not needed; the target's is what gets embedded.
- name: Install dependencies
run: bun install --frozen-lockfile --os=${{ matrix.os }} --cpu=${{ matrix.cpu }}

- name: Build binary
run: bun scripts/build-binary.ts ${{ matrix.target }}

- name: Smoke test
if: matrix.target == 'linux-x64'
run: |
set -euo pipefail
runtime_dir="$(mktemp -d)"
HOME="$runtime_dir/home" XDG_DATA_HOME="$runtime_dir/xdg" release/${{ matrix.binary }} --version
HOME="$runtime_dir/home" XDG_DATA_HOME="$runtime_dir/xdg" release/${{ matrix.binary }} --smoke-test

- name: Upload binary
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: ${{ matrix.binary }}
path: runner/release/${{ matrix.binary }}
if-no-files-found: error
20 changes: 19 additions & 1 deletion .github/workflows/prerelease.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,24 @@ jobs:

- run: npm ci
- run: npm run build
# The omp the runners compile against: the fork's newest integration build, not runner/omp-build.json's pin
# (not committed back). No such release or a runner that fails tsc against it fails the release.
- name: Find the newest omp integration build
env:
GH_TOKEN: ${{ github.token }}
run: |
set -euo pipefail
sha=$(gh api repos/ompweb-dev/oh-my-pi/commits/integration-release --jq .sha)
tag=$(gh api --paginate 'repos/ompweb-dev/oh-my-pi/releases?per_page=100' --jq '.[].tag_name' \
| grep -E "^v[0-9]+\.[0-9]+\.[0-9]+-int\.[0-9]{12}\.g${sha:0:7}\$" | head -n 1 || true)
if [ -z "$tag" ]; then
echo "::error::ompweb-dev/oh-my-pi has no integration release for integration-release ($sha)"
exit 1
fi
echo "OMP_TAG=$tag" >> "$GITHUB_ENV"
# Without GH_TOKEN: bun install runs the omp packages' scripts.
- name: Pin the runner to it
run: npx bun runner/scripts/use-omp-build.ts "$OMP_TAG" && (cd runner && npx bun x tsc -p .)
- name: Build the release binaries
run: sh scripts/build-release-binaries.sh
- run: npm run smoke -- --binary release/ompweb-linux-x64/ompweb
Expand All @@ -55,5 +73,5 @@ jobs:
# A draft first, so a failed upload never leaves a published prerelease missing archives.
gh release create "$tag" release/ompweb-*.tar.gz release/ompweb-*.zip \
--repo "$GITHUB_REPOSITORY" --target "$SHA" --draft --prerelease --title "$title" \
--notes "Binaries built from $GITHUB_REPOSITORY@$SHA ($subject). Not a release: no npm package, no update notice."
--notes "Binaries built from $GITHUB_REPOSITORY@$SHA ($subject), omp: ompweb-dev/oh-my-pi $OMP_TAG. Not a release: no npm package, no update notice."
gh release edit "$tag" --repo "$GITHUB_REPOSITORY" --draft=false
53 changes: 41 additions & 12 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,34 @@ jobs:

- run: npm install --global npm@^11.5.1
- run: npm ci
# The omp the runners compile against: the fork's newest integration build, not runner/omp-build.json's pin
# (not committed back). No such release or a runner that fails tsc against it fails the release. Pinned before
# the tests: they import the runner (lib/hosts/omp-socket.test.mjs), and must run against the omp that ships.
- name: Find the newest omp integration build
env:
GH_TOKEN: ${{ github.token }}
run: |
set -euo pipefail
sha=$(gh api repos/ompweb-dev/oh-my-pi/commits/integration-release --jq .sha)
tag=$(gh api --paginate 'repos/ompweb-dev/oh-my-pi/releases?per_page=100' --jq '.[].tag_name' \
| grep -E "^v[0-9]+\.[0-9]+\.[0-9]+-int\.[0-9]{12}\.g${sha:0:7}\$" | head -n 1 || true)
if [ -z "$tag" ]; then
echo "::error::ompweb-dev/oh-my-pi has no integration release for integration-release ($sha)"
exit 1
fi
echo "OMP_TAG=$tag" >> "$GITHUB_ENV"
# Without GH_TOKEN: bun install runs the omp packages' scripts.
- name: Pin the runner to it
run: npx bun runner/scripts/use-omp-build.ts "$OMP_TAG" && (cd runner && npx bun x tsc -p .)
- run: npm test
- run: npm run build
- run: npm run smoke

# Builds the omp runners too, which the source smoke spawns from runner/release/. The archives leave them out:
# every install fetches its runner from this release (lib/omp/runner-fetch.ts), attached below.
- name: Build the release binaries
run: sh scripts/build-release-binaries.sh
- run: npm run smoke -- --binary release/ompweb-linux-x64/ompweb
run: sh scripts/build-release-binaries.sh --no-runner
- run: npm run smoke
# --omp: the draft release cannot serve the runner to the binary yet.
- run: npm run smoke -- --binary release/ompweb-linux-x64/ompweb --omp runner/release/ompweb-omp-linux-x64

- name: Create draft GitHub Release
env:
Expand All @@ -46,14 +67,28 @@ jobs:
run: |
if ! gh release view "$TAG" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1; then
node bin/generate-release-notes.js --tag "$TAG" --output release-notes.md
printf '\nomp: ompweb-dev/oh-my-pi %s\n' "$OMP_TAG" >> release-notes.md
gh release create "$TAG" --repo "$GITHUB_REPOSITORY" --verify-tag --title "$TAG" --notes-file release-notes.md --draft
fi

- name: Attach the binaries to the draft release
# The runners, by the names and checksum listing lib/omp/runner-fetch.ts fetches (OMP_RUNNER_ASSET,
# OMP_RUNNER_CHECKSUMS), for binary and npm installs alike.
- name: Attach the binaries and the omp runners to the draft release
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ github.ref_name }}
run: |
set -euo pipefail
runners=(ompweb-omp-linux-x64 ompweb-omp-linux-arm64 ompweb-omp-darwin-x64 ompweb-omp-darwin-arm64 ompweb-omp-windows-x64.exe)
(cd runner/release && sha256sum "${runners[@]}" > ompweb-omp.sha256)
gh release upload "$TAG" release/ompweb-*.tar.gz release/ompweb-*.zip "${runners[@]/#/runner/release/}" runner/release/ompweb-omp.sha256 --repo "$GITHUB_REPOSITORY" --clobber

# Before npm: an npm install fetches its runner from this release, which a draft does not serve.
- name: Publish GitHub Release
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ github.ref_name }}
run: gh release upload "$TAG" release/ompweb-*.tar.gz release/ompweb-*.zip --repo "$GITHUB_REPOSITORY" --clobber
run: gh release edit "$TAG" --repo "$GITHUB_REPOSITORY" --draft=false

- name: Publish to npm
run: |
Expand All @@ -65,12 +100,6 @@ jobs:
npm publish --provenance --access public
fi

- name: Publish GitHub Release
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ github.ref_name }}
run: gh release edit "$TAG" --repo "$GITHUB_REPOSITORY" --draft=false

notify-discord:
needs: publish
runs-on: ubuntu-latest
Expand Down
26 changes: 21 additions & 5 deletions .github/workflows/verify-pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,12 @@ jobs:
node-version-file: .nvmrc
cache: npm

# The runner's own deps too: lib/hosts/omp-socket.test.mjs checks the host against runner/src/channel.ts.
- name: Install dependencies
run: npm ci
run: |
npm ci
npx bun runner/scripts/use-omp-build.ts
npx bun install --cwd runner --frozen-lockfile

- name: TypeScript typecheck
run: npm run typecheck
Expand All @@ -58,6 +62,9 @@ jobs:
- name: Verify production build
run: npm run build

- name: Build the omp runner
run: npx bun runner/scripts/build-binary.ts

- name: Smoke test
run: npm run smoke

Expand All @@ -68,25 +75,34 @@ jobs:
run: |
if [ "$RUNNER_OS" = Windows ]; then
npx bun scripts/build-binary.ts --target bun-windows-x64-baseline
npm run smoke -- --binary release/ompweb-windows-x64/ompweb.exe
bin=release/ompweb-windows-x64/ompweb.exe
archive=release/ompweb-windows-x64.zip
else
npx bun scripts/build-binary.ts --target bun-linux-x64-baseline
npm run smoke -- --binary release/ompweb-linux-x64/ompweb
bin=release/ompweb-linux-x64/ompweb
archive=release/ompweb-linux-x64.tar.gz
fi
# The archive a host downloads must pass the updater's own size limits and checks.
npx bun scripts/check-host-release-archive.ts "$archive"
npm run smoke -- --binary "$bin"
# What the host updater checks on a new release before it switches (lib/hosts/update-worker.ts): the marker
# it finds the command by, then the command itself against the bundled ompweb-omp.
grep -qa ompweb-preflight-scratch- "$bin"
timeout 120 "$bin" preflight

- name: Packed install smoke test
shell: bash
run: |
npm pack --ignore-scripts
npm install -g --prefix "$RUNNER_TEMP/ompweb-prefix" ./kahme247-ompweb-*.tgz
npm run smoke -- --package "$(npm root -g --prefix "$RUNNER_TEMP/ompweb-prefix")/@kahme247/ompweb"
npm run smoke -- --omp "$(ls runner/release/ompweb-omp-*)" --package "$(npm root -g --prefix "$RUNNER_TEMP/ompweb-prefix")/@kahme247/ompweb"

# Bun's postinstall does not run here: the launcher must fall back to @oven/bun-<os>-<arch> (spec R1).
- name: Packed install smoke test (install scripts disabled)
shell: bash
run: |
npm install -g --ignore-scripts --prefix "$RUNNER_TEMP/ompweb-prefix-no-scripts" ./kahme247-ompweb-*.tgz
npm run smoke -- --package "$(npm root -g --prefix "$RUNNER_TEMP/ompweb-prefix-no-scripts")/@kahme247/ompweb"
npm run smoke -- --omp "$(ls runner/release/ompweb-omp-*)" --package "$(npm root -g --prefix "$RUNNER_TEMP/ompweb-prefix-no-scripts")/@kahme247/ompweb"

- name: Parse Windows PowerShell scripts (Windows only)
if: runner.os == 'Windows'
Expand Down
Loading
Loading