Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
133 commits
Select commit Hold shift + click to select a range
70a3a89
test: harden the test harness and widen CI coverage
chaqchase Oct 7, 2026
35dc0ee
build: move to Node 24 LTS
chaqchase Oct 7, 2026
d89bd8d
build: move to bun 1.4.2
chaqchase Oct 7, 2026
5a5a13e
build(deps): bump in-range dependencies
chaqchase Oct 7, 2026
e7df4ad
style: reformat with prettier 3.9
chaqchase Oct 7, 2026
433059f
build(deps): bump integration SDK and tooling majors
chaqchase Oct 7, 2026
b88ef14
chore(deps): drop unused packages, cover office documents
chaqchase Oct 7, 2026
350b455
build(deps): move to zod 4.6.5
chaqchase Oct 7, 2026
1e3b025
build(deps): move to TypeScript 6.0.3
chaqchase Oct 7, 2026
e005637
fix(desktop): ship undici in the standalone server
chaqchase Oct 7, 2026
5abf16b
fix(zod): keep zod 3 tool wire shape and optional unknown keys
chaqchase Oct 7, 2026
3f623d6
build(deps): migrate to AI SDK 7
chaqchase Oct 7, 2026
3368e3a
fix(agent): read manage_task results from tool outputs
chaqchase Oct 7, 2026
5dd0fc2
fix(agent): count plan tasks from earlier runs before stopping
chaqchase Oct 7, 2026
2eb0174
fix(providers): turn off xAI response storage and pin OpenAI tool str…
chaqchase Oct 7, 2026
0b9ed15
fix(video): pass the polling timeout through generateVideo's poll option
chaqchase Oct 7, 2026
903705b
build(deps): upgrade to Next 16.4 and React 19.3
chaqchase Oct 7, 2026
dd1bf84
build(deps): upgrade HeroUI to 3.2.6
chaqchase Oct 7, 2026
1129a0c
build: use the react-jsx transform Next 16 requires
chaqchase Oct 7, 2026
dd014d0
build(deps): move to Electron 44, electron-builder 26.17 and better-s…
chaqchase Oct 7, 2026
6d946ca
fix(desktop): ship the sqlite-vec platform extension in packaged builds
chaqchase Oct 7, 2026
a826fde
fix(desktop): keep macOS 12 off Electron 44 updates
chaqchase Oct 7, 2026
5122ff7
build(deps): stop bun compiling better-sqlite3 at install time
chaqchase Oct 7, 2026
57ae1f6
fix(desktop): remember dialog folders per picker across restarts
chaqchase Oct 7, 2026
7174578
test(verify): widen the Electron 44 clipboard and console-message tri…
chaqchase Oct 7, 2026
834284b
fix(desktop): ship undici 7 at the top level for AI SDK 7
chaqchase Oct 7, 2026
098eefd
feat(models): refresh the built-in chat catalog and upgrade retired ids
chaqchase Oct 7, 2026
0599f78
feat(models): refresh image, video, transcription and embedding models
chaqchase Oct 7, 2026
7ac953d
fix(models): address catalog-refresh review findings
chaqchase Oct 7, 2026
0ba9af2
feat(claude): upgrade to Claude Agent SDK 0.3.292
chaqchase Oct 7, 2026
b1f1930
build(desktop): keep Claude Agent SDK native CLIs out of the packaged…
chaqchase Oct 7, 2026
c9a7136
fix(claude): resolve Windows PATHEXT launchers first and map lone Ask…
chaqchase Oct 7, 2026
f2c83d6
fix(claude): stop pre-approving Grep and Glob
chaqchase Oct 7, 2026
bcf3b5c
fix(claude): seed a resumed session's tasks only from its own lists
chaqchase Oct 7, 2026
8d56f2c
fix(git): run Claude commit messages with no tools instead of skippin…
chaqchase Oct 7, 2026
0041f76
feat(copilot): move to @github/copilot-sdk 1.0.16 and its bundled run…
chaqchase Oct 7, 2026
ad064ac
fix(copilot): keep split responses and stop saved CLI paths shadowing…
chaqchase Oct 7, 2026
0f02062
fix(opencode): run on @opencode-ai/sdk 1.18 with robust, authenticate…
chaqchase Oct 7, 2026
58134cd
fix(opencode): keep runs alive through compaction and split out reaso…
chaqchase Oct 7, 2026
1d3a3e9
fix(opencode): correct the version floor, startup timeouts and auth c…
chaqchase Oct 7, 2026
d2de835
fix(cursor): send ACP session/cancel as a notification so Stop cannot…
chaqchase Oct 7, 2026
e4179f2
fix(codex): speak the Codex 0.160 app-server protocol
chaqchase Oct 7, 2026
c669197
fix(chat): show the context indicator for Codex threads
chaqchase Oct 7, 2026
cadc105
fix(codex): pick npm's codex.cmd on Windows and kill the process tree
chaqchase Oct 7, 2026
5c45270
fix(codex): finish the 0.160 review fixes for approvals, secrets and …
chaqchase Oct 7, 2026
45a07c2
test(fixtures): add ACP, Pi RPC and OpenCode protocol fixtures
chaqchase Oct 7, 2026
85db56c
test(fixtures): match the ACP mock profiles to recorded agent wire
chaqchase Oct 7, 2026
24646ac
test(fixtures): follow the recorded OpenCode 2.0.18 event lifecycle
chaqchase Oct 7, 2026
ad58a30
test(fixtures): add Pi compaction failure and leading system message
chaqchase Oct 7, 2026
a73660b
test(thread-chat): wait on deadlines instead of fixed ticks
chaqchase Oct 7, 2026
461d9fa
feat(security): guard /api with a loopback Host and same-origin check
chaqchase Oct 7, 2026
5094917
fix(messages): sync dynamic tool parts on title and provider metadata
chaqchase Oct 7, 2026
210d99a
feat(engines): add driver contract, catalog and thread-state registry
chaqchase Oct 7, 2026
75e62cf
feat(engines): widen permission modes and add the max effort level
chaqchase Oct 7, 2026
02b0670
feat(engines): add engine instances (DB migration and registry)
chaqchase Oct 7, 2026
6449cae
fix(security): keep /api bodies intact behind the loopback proxy
chaqchase Oct 7, 2026
d11092c
fix(engines): keep instance ids and stored state consistent on writes
chaqchase Oct 7, 2026
547394f
fix(security): never reveal or replace an instance's secret env vars
chaqchase Oct 7, 2026
1680047
fix(engines): map the max effort level in every engine
chaqchase Oct 7, 2026
a47600d
feat(engines): add process utilities, an agent pid registry and a shu…
chaqchase Oct 7, 2026
fe1a454
refactor(engines): consolidate binary discovery in a shared resolver
chaqchase Oct 7, 2026
ea762f6
refactor(engines): run Codex and Copilot runtimes per engine instance
chaqchase Oct 7, 2026
20f2761
feat(engines): add the engine snapshot service, driver registry and l…
chaqchase Oct 7, 2026
72bc074
refactor(engines): end instance runtimes on shutdown and reuse platfo…
chaqchase Oct 7, 2026
3ab24da
fix(engines): keep each legacy engine's availability in its probe result
chaqchase Oct 7, 2026
a8796ee
fix(engines): bound the OpenCode status probe and kill its server on …
chaqchase Oct 7, 2026
01e6f94
fix(engines): order snapshot probes, bound enrichment and probe cheaply
chaqchase Oct 7, 2026
d76828a
fix(security): match stale agent pids by the agent's own command line
chaqchase Oct 7, 2026
1da0000
fix(engines): keep instance runtimes until their instance change is h…
chaqchase Oct 7, 2026
a2dde4e
fix(engines): never lease a pooled resource disposed while starting
chaqchase Oct 7, 2026
bccd80a
fix(engines): record only discovered binaries as legacy path overrides
chaqchase Oct 7, 2026
f3bee56
fix(security): keep the internal token out of every child process
chaqchase Oct 7, 2026
9132000
refactor(engines): dispatch thread turns through the driver registry
chaqchase Oct 7, 2026
4cfb0fb
feat(engines): split the engines router and drive the UI from engine …
chaqchase Oct 7, 2026
5da1c1b
refactor(engines): generic composer options, tool renderers and messa…
chaqchase Oct 7, 2026
e59172c
test(engines): cover the instance selection guard and client descriptors
chaqchase Oct 7, 2026
47ffbaf
fix(engines): answer the composer catalog without waiting on known en…
chaqchase Oct 7, 2026
b9a9ada
fix(engines): keep a thread on its engine instance when its model cha…
chaqchase Oct 7, 2026
0764c5b
feat(engines): settle approvals of unattended runs on every engine
chaqchase Oct 7, 2026
e4140a6
test(engines): run every driver's thread handlers against its own run…
chaqchase Oct 7, 2026
359ac46
fix(engines): refetch composer queries only when what they show changes
chaqchase Oct 8, 2026
1e232f5
fix(automations): never send an engine instance id as the automation'…
chaqchase Oct 8, 2026
e1d0aa1
feat(engines): add a shared ACP engine and external-agent runtime
chaqchase Oct 8, 2026
c3c69bf
feat(engines): run Cursor on the shared ACP engine
chaqchase Oct 8, 2026
500a792
feat(chat): render external agent tools by kind
chaqchase Oct 8, 2026
aff1384
fix(engines): ask before Cursor's web searches and edits outside the …
chaqchase Oct 8, 2026
4dcea19
fix(engines): harden ACP sign-in, Stop and process teardown
chaqchase Oct 8, 2026
4e302c3
fix(engines): keep ACP agent sessions in step with the thread
chaqchase Oct 8, 2026
981c4a8
feat(engines): engine manifest, compatibility advisories and custom m…
chaqchase Oct 8, 2026
34fded5
feat(claude): offer max effort where Claude Code reports it
chaqchase Oct 8, 2026
f067382
feat(runtime): managed-install utilities for tools Sentinel downloads
chaqchase Oct 8, 2026
5125f3d
feat(engines): install and update agent CLIs from Sentinel
chaqchase Oct 8, 2026
09edf33
feat(settings): engine install and update actions, advisories, manife…
chaqchase Oct 8, 2026
d89ea3e
fix(engines): settle maintenance runs into the cached snapshot
chaqchase Oct 8, 2026
d7a74d1
fix(runtime): keep archive links and versions inside a tool's directory
chaqchase Oct 8, 2026
9685e4f
fix(engines): match Claude manifest data to Claude Code; warn on old …
chaqchase Oct 8, 2026
a4625df
fix(settings): say when a manifest refresh failed but a cached copy i…
chaqchase Oct 8, 2026
6bb87b8
fix(engines): forget found CLI versions when update checks are off
chaqchase Oct 8, 2026
3b5f88f
fix(engines): run CLI installs and updates without the instance's sec…
chaqchase Oct 8, 2026
e612670
fix(engines): serve live install and update state with every snapshot
chaqchase Oct 8, 2026
b23d90a
feat(engines): sign-in flow store and api.engines.auth
chaqchase Oct 8, 2026
c55ae27
feat(desktop): run server-vended sign-in commands in a terminal
chaqchase Oct 8, 2026
7f7ea1b
feat(engines): sign in and out of Codex, Claude, Copilot, Cursor and …
chaqchase Oct 8, 2026
f63697a
feat(settings): sign engine instances in and out from Settings → Engines
chaqchase Oct 8, 2026
285287b
fix(trpc): keep sign-in operations out of the client logger
chaqchase Oct 8, 2026
e719094
feat(engines): hand agents' sign-in URLs to Sentinel through a BROWSE…
chaqchase Oct 8, 2026
2aefb2e
fix(engines): end a sign-in flow that throws and hide sign-out withou…
chaqchase Oct 8, 2026
4a263c7
fix(engines): ask Claude Code again after a sign-in or sign-out
chaqchase Oct 8, 2026
2d6c6c3
fix(engines): say what a sign-out affects and keep GH_TOKEN on Copilo…
chaqchase Oct 8, 2026
cb1a0e7
fix(settings): recover an embedded sign-in terminal that exited
chaqchase Oct 8, 2026
6fd93e2
fix(engines): broadcast only a sign-in's phase and name cmd.exe by path
chaqchase Oct 8, 2026
1237ce4
test(engines): run a sign-in terminal from flow store to Electron main
chaqchase Oct 8, 2026
51a4704
fix(engines): resolve the Cursor CLI for sign-in through the ACP agent
chaqchase Oct 8, 2026
866f9c4
feat(engines): read usage limits per instance and keep them live
chaqchase Oct 8, 2026
52dc85f
feat(engines): show plan usage in the composer and Settings → Engines
chaqchase Oct 8, 2026
e7d4524
feat(engines): slash commands per instance in snapshots and the composer
chaqchase Oct 8, 2026
a150151
feat(skills): resolve skill folders per engine instance and dispatch …
chaqchase Oct 8, 2026
4db215f
fix(engines): drop an instance's usage limits when its account signs out
chaqchase Oct 8, 2026
850e20e
fix(engines): let live usage windows outlive unsupported reads
chaqchase Oct 8, 2026
585443c
fix(engines): keep Cursor Keychain logins per user and drop them on c…
chaqchase Oct 8, 2026
08fbab7
fix(claude): dispatch only skills the run's Claude Code reads itself
chaqchase Oct 8, 2026
8d1f05f
fix(engines): show when usage was read and mark carried-over windows
chaqchase Oct 8, 2026
07511f9
refactor(composer): build the slash menu with one tested helper
chaqchase Oct 8, 2026
ecdc9c0
test(engines): pass the owning user to manifest and maintenance enric…
chaqchase Oct 8, 2026
5c60687
feat(engines): replay the conversation when Claude or Codex start afresh
chaqchase Oct 8, 2026
4409660
feat(settings): manage engine instances in Settings → Engines
chaqchase Oct 8, 2026
7b4e30c
feat(chat): group the composer's engine menu by driver
chaqchase Oct 8, 2026
8712e61
feat(automations): pick the engine instance and model options
chaqchase Oct 8, 2026
48e4757
fix(automations): keep stored model options until the model is loaded
chaqchase Oct 8, 2026
57f1251
fix(settings): keep stored secrets with their names and flag home ove…
chaqchase Oct 8, 2026
7ee56bf
fix(engines): replay whenever Claude or Codex start a fresh session
chaqchase Oct 8, 2026
e2963be
fix(automations): keep option picks the catalog does not describe
chaqchase Oct 8, 2026
9ec1d40
test(settings): stub the card's tRPC-backed panels in the instance test
chaqchase Oct 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 2 additions & 2 deletions .github/actions/setup-bun/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ runs:
steps:
- uses: actions/setup-node@v4
with:
node-version: 21.7.3
node-version-file: .nvmrc

- uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.6
bun-version: 1.4.2

- uses: actions/cache@v4
with:
Expand Down
8 changes: 7 additions & 1 deletion .github/actions/setup-desktop-build/action.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: Setup Desktop Build Environment
description: Set up Bun, install dependencies, and restore desktop build caches.
description: Set up Bun, install dependencies, restore desktop build caches, and install the Electron binary.

runs:
using: composite
Expand Down Expand Up @@ -44,3 +44,9 @@ runs:
key: ${{ runner.os }}-${{ runner.arch }}-desktop-build-${{ hashFiles('bun.lock', 'package.json', 'next.config.*') }}
restore-keys: |
${{ runner.os }}-${{ runner.arch }}-desktop-build-

# Electron 42+ no longer downloads its binary during install, and
# build.electronDist packages node_modules/electron/dist.
- name: Install Electron binary
shell: bash
run: bun run electron:install
49 changes: 48 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,27 @@ on:
pull_request:
paths:
- "src/**"
- "scripts/**"
- "desktop/**"
- "manifests/**"
- "package.json"
- "bun.lock"
- "tsconfig.json"
- "next.config.js"
- ".github/**"
push:
branches:
- main
paths:
- "src/**"
- "scripts/**"
- "desktop/**"
- "manifests/**"
- "package.json"
- "bun.lock"
- "tsconfig.json"
- "next.config.js"
- ".github/**"

concurrency:
group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
Expand All @@ -35,6 +51,14 @@ jobs:
filters: |
source:
- 'src/**'
- 'scripts/**'
- 'desktop/**'
- 'manifests/**'
- 'package.json'
- 'bun.lock'
- 'tsconfig.json'
- 'next.config.js'
- '.github/**'

pr-metadata:
if: github.event_name == 'pull_request'
Expand Down Expand Up @@ -117,4 +141,27 @@ jobs:
- uses: ./.github/actions/setup-bun

- name: Run tests
run: bun run test
run: node scripts/run-tests.mjs --jobs 3

build:
name: build
needs: changes
if: ${{ needs.changes.outputs.source == 'true' }}
runs-on: ubuntu-24.04
timeout-minutes: 30
permissions:
contents: read
env:
SKIP_ENV_VALIDATION: "1"
NODE_OPTIONS: "--max-old-space-size=4096"
SENTINEL_SKIP_STARTUP_TASKS: "1"
steps:
- uses: actions/checkout@v4

- uses: ./.github/actions/setup-bun

- name: Build
run: bun run build

- name: Tripwires
run: node scripts/verify/tripwires.mjs
2 changes: 1 addition & 1 deletion .node-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
21.7.3
24
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
21.7.3
24
20 changes: 12 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,11 @@ Some parts are solid. Some parts are rough. Things will change.
Release builds are published on GitHub Releases:

- [Download the latest release](https://github.com/Cronacl/Sentinel/releases)
- macOS builds are available as DMGs
- Windows builds are available as NSIS installers
- Linux builds are available as AppImages, DEBs, and RPMs
- macOS builds are available as DMGs and need macOS 13 (Ventura) or later
- Windows builds are available as NSIS installers for 64-bit Windows 10 or later
- Linux builds are available as AppImages, DEBs, and RPMs for x64 and arm64 and need glibc 2.34 and libstdc++ from GCC 11 or newer (for example Ubuntu 22.04, Debian 12, Fedora 35, or RHEL 9)

Electron 44 dropped support for macOS 12, 32-bit Windows, and 32-bit ARM Linux, so Sentinel no longer ships for them. Copies already installed on macOS 12 keep working, but the in-app updater no longer offers them new versions.

If you want the current development version, run it locally from source.

Expand Down Expand Up @@ -136,11 +138,11 @@ This is a desktop app first. A lot of the useful parts depend on running close t

### Prerequisites

- [Bun](https://bun.sh)
- Node.js
- Platform build tools for native dependencies when prebuilt binaries are not available:
- [Bun](https://bun.sh) 1.4 or later
- Node.js 24 LTS (see `.nvmrc`)
- On Linux, build tools for `node-pty`, which has no prebuilt Linux binary: `build-essential`, `python3`, `make`, and `g++`
- On macOS and Windows, build tools only if the native repair step asks for them:
- macOS: Xcode Command Line Tools
- Linux: `build-essential`, `python3`, `make`, and `g++`
- Windows: Visual Studio Build Tools with Desktop development with C++

### Run locally
Expand All @@ -155,7 +157,9 @@ The app runs at `http://localhost:3232`.

`ENCRYPTION_KEY` can be left empty in `.env`. Sentinel will generate one on first desktop launch.

Sentinel repairs native Node dependencies at startup. Most machines use prebuilt binaries. If a runtime, OS, or CPU combination has no matching prebuild, the startup script builds the native dependency locally and prints the platform package to install when build tools are missing.
Electron no longer downloads its binary during `bun install`. `bun run dev:desktop` and the desktop build commands fetch it on first use; run `bun run electron:install` to download it ahead of time.

Sentinel checks its native Node dependencies at startup. `better-sqlite3` loads the N-API prebuild bundled for your OS and CPU and is never compiled locally; on Linux that prebuild needs glibc 2.34 and libstdc++ from GCC 11 or newer. `node-pty` uses its prebuilt binary on macOS and Windows; on Linux, `bun install` compiles it. If the `node-pty` binary does not load, the startup script rebuilds it locally and prints the platform package to install when build tools are missing.

On Linux, Sentinel disables Electron's Chromium process sandbox by default for compatibility with systems where user namespaces or the setuid sandbox are unavailable. Linux packages also launch with `--no-sandbox` from their desktop entries. Set `SENTINEL_LINUX_SANDBOX=true` when launching the executable directly to force the Chromium sandbox back on.

Expand Down
Loading
Loading