Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
107 commits
Select commit Hold shift + click to select a range
19c97ea
fix(web): unlock the composer when preview capture fails (#9127)
t3dotgg Sep 3, 2026
1e05187
fix(antigravity): refresh the model manifest so older Gemini models f…
t3dotgg Sep 3, 2026
fff33f9
perf(ci): reuse dependency checks in release builds (#9399)
t3dotgg Sep 3, 2026
77e35c5
fix(web): send cited messages with Cmd+Enter (#9307)
extoci Sep 3, 2026
098bf53
fix(web): preserve explicit preview navigation URLs (#8902)
nateEc Sep 3, 2026
57626eb
fix(web): prevent loading ssh environments from overriding navigation…
flamboh Sep 3, 2026
cfddb42
fix(mobile): skip unsupported shared settings targets (#9381)
Lucenx9 Sep 3, 2026
2120fbc
fix(web): avoid duplicate Antigravity install status (#9419)
RakshithBhat03 Sep 3, 2026
d4ba2a1
fix(composer): mute fast icon when collapsed (#9451)
maria-rcks Sep 3, 2026
21b9dda
fix(web): unify skeleton loading animations on one pulse (#9448)
maria-rcks Sep 3, 2026
645d585
fix(web): prioritize authored pull requests (#9453)
maria-rcks Sep 3, 2026
4e89d74
fix(web): make project icons the default (#9457)
maria-rcks Sep 3, 2026
c78f05a
fix(server): reuse pr state when settling threads (#9459)
maria-rcks Sep 3, 2026
8bd544c
fix(web): keep agent images collapsed (#9460)
maria-rcks Sep 3, 2026
126afb5
fix(web): banner buttons no longer expand the resting composer (#9452)
juliusmarminge Sep 3, 2026
d5825e1
fix(web): stop clipping the traits chevron on long Codex effort label…
zortos293 Sep 3, 2026
46e8b1a
fix(web): make right panel tabs easier to scroll (#9461)
maria-rcks Sep 3, 2026
db8d60f
fix(web): render transparent previews on white (#9463)
UtkarshUsername Sep 3, 2026
de025aa
fix(mobile): show loading and syncing in the working pill (#9466)
juliusmarminge Sep 3, 2026
36c4e9c
fix(server): keep a/ and b/ prefixes in rendered git patches (#9438)
Mnigos Sep 3, 2026
d2b6f3b
fix(server): full-access OpenCode threads no longer ask for approvals…
shivamhwp Sep 3, 2026
493fbb5
fix(web): reuse pull request list data while loading (#9467)
maria-rcks Sep 3, 2026
0372836
feat(web): let users turn off composer collapse on blur and scroll (#…
juliusmarminge Sep 3, 2026
373be93
fix(web): move workflow approval beside checks (#9465)
maria-rcks Sep 3, 2026
4b8b5d9
fix(desktop): refresh generated annotation styles (#9488)
juliusmarminge Sep 3, 2026
0869ad6
fix(web): let the PR reviewer and label search boxes take keystrokes …
juliusmarminge Sep 3, 2026
77138cf
fix(web): dont collapse composer when interacting with bottom row (#9…
extoci Sep 3, 2026
678f23a
fix(desktop): restore second-press quit fallback (#9485)
maria-rcks Sep 3, 2026
c726c30
fix(web): keep opencode icon hollow in collapsed composer (#9492)
maria-rcks Sep 3, 2026
12e8997
fix(web): keep agent browser preview visible (#9484)
maria-rcks Sep 3, 2026
409bc4f
fix(mobile): keep the machine glyph next to the environment label (#9…
juliusmarminge Sep 3, 2026
80b5373
fix(mobile): let back swipe pop from horizontal scroll edges (#9493)
juliusmarminge Sep 3, 2026
0aae1e2
fix(antigravity): discover legacy workspace skills (#9410)
Lucenx9 Sep 3, 2026
ef4cc60
fix(mobile): resolve Antigravity provider icon and normalize driver m…
Invictine Sep 3, 2026
e01c153
fix(antigravity): forward Google sign-in URLs from browser helper (#9…
WellyngtonF Sep 3, 2026
39449e5
feat(desktop): import browser cookies into a profile (#7255)
juliusmarminge Sep 3, 2026
ff58434
feat(desktop): import from Chrome, Edge, Brave, Vivaldi, Opera, Arc a…
juliusmarminge Sep 3, 2026
498ab9c
feat(desktop): resolve Chromium cookie keys on Linux (#7261)
juliusmarminge Sep 3, 2026
f25e442
fix(antigravity): allow slow runtime startup during setup (#9510)
t3dotgg Sep 3, 2026
baf67b6
fix(antigravity): keep model choices up to date (#9511)
t3dotgg Sep 3, 2026
eb334ca
fix(antigravity): handle native sign-in URLs on stderr (#9514)
t3dotgg Sep 3, 2026
8ea52c8
fix(antigravity): update managed runtime to 1.1.1 (#9509)
t3dotgg Sep 3, 2026
3653cb2
fix(desktop): address the browser import review left over from the st…
juliusmarminge Sep 3, 2026
f8a14b2
feat(antigravity): show subagent calls and results (#9515)
t3dotgg Sep 4, 2026
6382268
fix(web): let paste expand a resting composer (#9498)
juliusmarminge Sep 4, 2026
522ebe6
fix(web): keep the composer open while selecting timeline text (#9499)
juliusmarminge Sep 4, 2026
c0ebc88
fix(web): return focus to the composer after closing a media preview …
juliusmarminge Sep 4, 2026
9c9ae3d
fix(server): keep events during thread subscription startup (#9521)
t3dotgg Sep 4, 2026
44701ef
chore: forward issue/PR/discussion events to Cursor hygiene (#9518)
juliusmarminge Sep 4, 2026
9d28c21
fix(auth): keep pairing credentials out of access read models (#9523)
t3dotgg Sep 4, 2026
e3723e0
chore: drop comment events from Cursor hygiene forwarder (#9527)
juliusmarminge Sep 4, 2026
d76b24d
feat(codex): support async questions (#9512)
t3dotgg Sep 4, 2026
0a0b6be
fix(web): keep right panel controls clickable (#9517)
maria-rcks Sep 4, 2026
19d8ab2
feat(usage): show Codex and Claude subscription limits on a Limits ta…
juliusmarminge Sep 4, 2026
343db2c
feat(web): reorganize settings pages (#9354)
maria-rcks Sep 4, 2026
2b96220
fix(server): settle branch threads immediately on pull request merge …
maria-rcks Sep 4, 2026
b908980
fix(server): back off relay client restarts after rapid exits (#8788)
derektrimm Sep 4, 2026
75ab5ab
fix(codex): accept rate limit errors on thread resume (#8897)
nateEc Sep 4, 2026
6319a97
fix(desktop): preview CDP sessions no longer hard-crash the app (#9068)
sethwebster Sep 4, 2026
f54ab90
Fix worktree removal timing out on large install trees (#3902)
jakeleventhal Sep 4, 2026
0ba06a1
fix(web): settle the resting composer layout with a pixel of slack (#…
matheustimbo Sep 4, 2026
07c4ab5
fix(web): keep automatic project icons consistent (#9535)
t3dotgg Sep 4, 2026
dddc0bd
fix(server): include SQLite conditions in persistence errors
t3dotgg Sep 4, 2026
6f40537
fix(dev): keep shared dev reloads and hot updates working (#9543)
t3dotgg Sep 4, 2026
c5ba51d
feat(providers): add context compaction command (#9293)
maria-rcks Sep 4, 2026
5989de4
fix(mobile): keep store screenshots free of system banners and show d…
juliusmarminge Sep 4, 2026
54aef6f
fix(web): restore composer controls as space becomes available (#9539)
juliusmarminge Sep 4, 2026
3c3e05c
fix(web): measure collapsed model labels at their visible width (#9540)
juliusmarminge Sep 4, 2026
f239b77
fix(web): close composer menus when their controls hide (#9541)
juliusmarminge Sep 4, 2026
3e2c1a6
fix(web): thread error banner no longer shifts the chat (#9473)
flamboh Sep 4, 2026
617edab
fix(server): reveal normalized paths in File Explorer (#9551)
juliusmarminge Sep 4, 2026
232de5e
feat(marketing): fresh screenshot and floating marks on the homepage …
t3dotgg Sep 4, 2026
1641b4a
feat(usage): redeem Codex reset credits from the Limits tab (#9534)
juliusmarminge Sep 4, 2026
4e54731
fix(server): find newly opened pull requests after agent turns (#9125)
t3dotgg Sep 4, 2026
f96a220
ci: add on-demand Windows test workflow (#9538)
juliusmarminge Sep 4, 2026
710f6dc
fix(web): simplify expanded tool details (#9549)
maria-rcks Sep 4, 2026
9e1bc36
fix(web): keep the last message visible when the resting composer exp…
t3dotgg Sep 4, 2026
fee2e0f
test(web): fix flaky startup and Tailwind tests (#9558)
t3dotgg Sep 4, 2026
65f1839
fix(web): keep codex restart responses continuous (#9560)
maria-rcks Sep 4, 2026
d7884ce
fix(web): make settings sidebar sub-section buttons full width (#9562)
juliusmarminge Sep 4, 2026
2b10398
fix(web): render settings sidebar immediately (#9563)
maria-rcks Sep 4, 2026
95390ed
chore: vouch august contributors (#9557)
maria-rcks Sep 4, 2026
42bdea1
fix(web): stabilize right panel transitions (#9554)
maria-rcks Sep 4, 2026
0cb02ab
fix: better shell syntax handling for labels (#9371)
Yash-Singh1 Sep 4, 2026
bf40fa7
fix(web): align the sidebar wordmark by baseline (#9578)
maria-rcks Sep 4, 2026
2675e3c
fix(antigravity): keep subagent batches active after launch (#9579)
t3dotgg Sep 4, 2026
09b81a3
fix(mobile): render workspace images in markdown file previews (#8769)
SunkenInTime Sep 4, 2026
b34ff8f
fix(usage): deduplicate CLI proxy subscription accounts (#9584)
juliusmarminge Sep 4, 2026
07891e9
fix(web): bound disconnected send toasts (#9592)
maria-rcks Sep 4, 2026
5783280
fix(desktop): restore panel titlebar interactions (#9591)
maria-rcks Sep 4, 2026
39abb9d
fix(connect): refresh authorization without disconnecting (#9582)
maria-rcks Sep 4, 2026
f559fe0
fix(web): show context meter in compact composer (#9430)
GuilhermeVieiraDev Sep 4, 2026
5cc369b
fix(pull-requests): refresh data after thread turns (#9496)
maria-rcks Sep 4, 2026
caab2fd
fix(web): render draft PRs in gray (#9537)
extoci Sep 4, 2026
f1e90e3
refactor(web): move usage provider controls to settings (#9599)
juliusmarminge Sep 4, 2026
00f8b7c
fix: show idle subagent batches without completion marks (#9616)
t3dotgg Sep 4, 2026
61a91b6
fix(web): group image views like other tool calls (#9597)
juliusmarminge Sep 4, 2026
c3b8825
fix: preserve tool icons on failed calls (#9606)
juliusmarminge Sep 4, 2026
99e3b72
fix(connect): diagnose incomplete headless server setup (#9602)
juliusmarminge Sep 4, 2026
4cc800c
fix(web): keep command palette above composer menus (#9613)
Gigioxx Sep 4, 2026
93c3ab4
fix(web): snooze menu no longer overlaps thread details (#9601)
RakshithBhat03 Sep 4, 2026
7062315
fix(web): match composer pull request state icons (#9375)
flamboh Sep 4, 2026
2152d44
fix(server): load OpenCode workspace skills via SDK to avoid 64KB CLI…
BarryHenryJr Sep 4, 2026
ec3ec6f
fix(web): mute sidebar branch name to match worktree icon (#9622)
maria-rcks Sep 4, 2026
5f878d2
fix(web,mobile): fold context compaction under settled turn folds (#9…
maria-rcks Sep 4, 2026
09d13de
feat(mobile): make chat text selectable on Android (#8779)
SunkenInTime Sep 4, 2026
c38ca47
chore(upstream): sync through 09d13de43
berghtho Sep 4, 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
  •  
  •  
  •  
12 changes: 12 additions & 0 deletions .github/VOUCHED.td
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,28 @@
github:0x4bs3nt
github:Adamulek123
github:adityavardhansharma
github:aoright
github:arhxam
github:bil0000
github:binbandit
github:Brechard
github:btsouth
github:chrisdeeming
github:chuks-qua
github:cursoragent
github:D3OXY
github:dbalders
github:eggfriedrice24
github:extoci
github:flamboh
github:FllipEis
github:gbarros-dev
github:gfsaaser24
github:github-actions[bot]
github:gsimone
github:GuilhermeVieiraDev
github:hwanseoc
github:inayayousfi
github:ipanasenko
github:jakeleventhal
github:jamesx0416
Expand All @@ -36,13 +42,18 @@ github:jasonLaster
github:JoeEverest
github:justsomelegs
github:kridaydave
github:lgwacker
github:lnieuwenhuis
github:Lucenx9
github:mackinleysmith
github:maria-rcks
github:MatthewFeroz
github:maxwellyoung
github:mwolson
github:myacoub91
github:naMqe-h
github:nateEc
github:naveed949
github:nmggithub
github:Noojuno
github:notkainoa
Expand All @@ -64,6 +75,7 @@ github:tarik02
github:tris203
github:tsouth89
github:UtkarshUsername
github:vitalyiegorov
github:Yash-Singh1
github:yashranaway
github:Ymit24
6 changes: 6 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ jobs:
- name: Typecheck
run: vpr typecheck

- name: Install browser secret helper build libraries
run: sudo apt-get update && sudo apt-get install -y libsecret-1-dev pkg-config

- name: Build desktop pipeline
run: vp run build:desktop

Expand Down Expand Up @@ -85,6 +88,9 @@ jobs:
- name: Ensure Electron runtime is installed
run: vp run --filter @t3tools/desktop ensure:electron

- name: Install browser secret helper build libraries
run: sudo apt-get update && sudo apt-get install -y libsecret-1-dev pkg-config

- name: Test
run: vp run --parallel --concurrency-limit 4 --filter '!t3' --filter '!@t3tools/monorepo' test

Expand Down
36 changes: 36 additions & 0 deletions .github/workflows/cursor-hygiene-webhook.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: Forward to Cursor hygiene

on:
push:
branches: [main]
pull_request:
types: [opened, reopened, ready_for_review]
issues:
types: [opened, closed, reopened]
discussion:
types: [created, closed, reopened]

permissions:
contents: read

jobs:
forward:
name: POST to Cursor
runs-on: ubuntu-24.04
steps:
- name: POST to Cursor
env:
URL: ${{ secrets.CURSOR_T3CODE_WEBHOOK_URL }}
AUTH: ${{ secrets.CURSOR_T3CODE_WEBHOOK_AUTH }}
run: |
set -euo pipefail
if [ -z "${URL:-}" ] || [ -z "${AUTH:-}" ]; then
echo "Missing CURSOR_T3CODE_WEBHOOK_URL or CURSOR_T3CODE_WEBHOOK_AUTH — skipping."
exit 0
fi
curl -fsS --max-time 60 -X POST "$URL" \
-H "Authorization: $AUTH" \
-H "Content-Type: application/json" \
-H "X-GitHub-Event: ${{ github.event_name }}" \
-H "X-GitHub-Delivery: ${{ github.run_id }}-${{ github.run_attempt }}" \
--data-binary @"${{ github.event_path }}"
30 changes: 28 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@ jobs:
node-version-file: package.json
cache: true
run-install: true
env:
pnpm_config_cache_dir: ${{ runner.temp }}/pnpm-metadata

- id: release_meta
name: Resolve release version
Expand Down Expand Up @@ -174,6 +176,14 @@ jobs:
--current-tag "${{ steps.release_meta.outputs.tag }}" \
--github-output

# Share only the verification results, not the large registry metadata cache.
- name: Upload dependency verification
continue-on-error: true
uses: actions/upload-artifact@v7
with:
name: release-dependency-verification
path: ${{ runner.temp }}/pnpm-metadata/lockfile-verified.jsonl

quality:
name: Release quality checks
needs: [preflight]
Expand Down Expand Up @@ -206,6 +216,9 @@ jobs:
- name: Typecheck
run: vp run typecheck

- name: Install browser secret helper build libraries
run: sudo apt-get update && sudo apt-get install -y libsecret-1-dev pkg-config

- name: Test
run: vp run test

Expand Down Expand Up @@ -446,7 +459,18 @@ jobs:
path: ${{ steps.package_cache_path.outputs.path }}
key: windows-release-packages-v1-${{ matrix.arch }}-${{ hashFiles('pnpm-lock.yaml') }}

# pnpm checks the lockfile and policy before reusing this result. A missing
# artifact leaves the cache empty, so installation runs the checks again.
- name: Download dependency verification
continue-on-error: true
uses: actions/download-artifact@v8
with:
name: release-dependency-verification
path: ${{ runner.temp }}/pnpm-metadata

- name: Install desktop dependencies
env:
pnpm_config_cache_dir: ${{ runner.temp }}/pnpm-metadata
run: vp install --filter=@t3tools/desktop... --filter=t3... --filter=@t3tools/scripts...

- name: Cache resource monitor
Expand Down Expand Up @@ -503,12 +527,13 @@ jobs:
exit $code
}

- name: Install ImageMagick
- name: Install Linux desktop build libraries
if: matrix.platform == 'linux'
shell: bash
run: |
sudo apt-get update
sudo apt-get install -y libsecret-1-dev pkg-config
if ! command -v magick >/dev/null 2>&1 && ! command -v convert >/dev/null 2>&1; then
sudo apt-get update
sudo apt-get install -y imagemagick
fi

Expand Down Expand Up @@ -583,6 +608,7 @@ jobs:
- name: Build desktop artifact
shell: bash
env:
pnpm_config_cache_dir: ${{ runner.temp }}/pnpm-metadata
T3CODE_DESKTOP_REUSE_RESOURCE_MONITOR: ${{ steps.resource_monitor_cache.outputs.cache-hit == 'true' }}
CSC_LINK: ${{ secrets.CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
Expand Down
81 changes: 81 additions & 0 deletions .github/workflows/windows-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# On-demand Windows test lane. Manual only: nothing in the suite passes on
# Windows yet, so this exists to give contributors (and agents) a cloud Windows
# box to iterate against. Once the suite is green here, fold it into ci.yml.
#
# gh workflow run windows-tests.yml --ref <branch> -f package=packages/shared
# gh workflow run windows-tests.yml --ref <branch> -f package=apps/server \
# -f files="src/process/externalLauncher.test.ts src/cli/theme.test.ts"
# gh run watch && gh run view --log-failed
name: Windows Tests

on:
workflow_dispatch:
inputs:
package:
description: "Workspace directory to test, e.g. apps/server or packages/shared. Empty runs every package except apps/server."
type: string
default: ""
files:
description: "Space-separated test files relative to the package directory. Empty runs the package's whole suite. Requires package."
type: string
default: ""

permissions:
contents: read

jobs:
test:
name: Test (${{ inputs.package || 'all non-server' }})
runs-on: blacksmith-8vcpu-windows-2025
timeout-minutes: 45
steps:
- name: Checkout
uses: actions/checkout@v6
with:
sparse-checkout: |
/*
!/.repos/
sparse-checkout-cone-mode: false

# setup-vp's own cache restores a Linux-shaped store on Windows, which is
# slower than no cache (see #7975). Cache pnpm's Windows store directly.
- name: Setup Vite+
uses: voidzero-dev/setup-vp@v1
with:
node-version-file: package.json
cache: false
run-install: false

- name: Resolve package cache path
id: package_cache_path
shell: pwsh
run: '"path=$(vp pm cache dir)" >> $env:GITHUB_OUTPUT'

- name: Cache packages
uses: actions/cache@v6
with:
path: ${{ steps.package_cache_path.outputs.path }}
key: windows-tests-packages-v1-${{ hashFiles('pnpm-lock.yaml') }}

- name: Install
run: vp install

- name: Ensure Electron runtime is installed
if: inputs.package == '' || inputs.package == 'apps/desktop'
run: vp run --filter "@t3tools/desktop" ensure:electron

# `vp run ... test -- <files>` does not forward positional args to vitest,
# so file-scoped runs call `vp test run` inside the package instead.
- name: Test
shell: pwsh
run: |
$package = '${{ inputs.package }}'
$files = '${{ inputs.files }}'
if ($package -eq '') {
vp run --parallel --concurrency-limit 4 --filter '!t3' --filter '!@t3tools/monorepo' test
} elseif ($files -eq '') {
vp run --filter "./$package" test
} else {
Set-Location $package
vp test run $files.Split(' ')
}
1 change: 1 addition & 0 deletions apps/desktop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"@clerk/electron": "catalog:",
"@clerk/electron-passkeys": "catalog:",
"@effect/platform-node": "catalog:",
"@napi-rs/keyring": "^1.3.0",
"@t3tools/client-runtime": "workspace:*",
"@t3tools/contracts": "workspace:*",
"@t3tools/shared": "workspace:*",
Expand Down
103 changes: 103 additions & 0 deletions apps/desktop/scripts/browser-secret-native.test.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
import * as NodeChildProcess from "node:child_process";
import * as NodeFS from "node:fs";
import * as NodeOS from "node:os";
import * as NodePath from "node:path";
import * as NodeURL from "node:url";
import { afterAll, beforeAll, describe, expect, it } from "vite-plus/test";

// oxlint-disable-next-line t3code/no-global-process-runtime -- The native compiler targets the actual host; this script has no Effect runtime.
const hostArch = process.arch;
// oxlint-disable-next-line t3code/no-global-process-runtime -- Native compilation only runs on the actual Linux host.
const hostPlatform = process.platform;

describe.skipIf(hostPlatform !== "linux")("bundled libsecret helper", () => {
let directory;
let executable;
beforeAll(() => {
directory = NodeFS.mkdtempSync(NodePath.join(NodeOS.tmpdir(), "t3-browser-secret-test-"));
executable = NodePath.join(directory, "t3-browser-secret");
const root = NodeURL.fileURLToPath(new URL("../../../native/browser-secret/", import.meta.url));
const flags = NodeChildProcess.execFileSync(
"pkg-config",
["--cflags", "--libs", "libsecret-1"],
{
encoding: "utf8",
},
)
.trim()
.split(/\s+/);
NodeChildProcess.execFileSync(
process.env.CC || "cc",
[
"-std=c11",
"-Wall",
"-Wextra",
"-Werror",
NodePath.join(root, "main.c"),
NodePath.join(root, "test.c"),
"-Wl,--wrap=secret_service_search_sync",
"-Wl,--wrap=secret_item_get_locked",
"-Wl,--wrap=secret_item_get_secret",
"-o",
executable,
...flags,
],
{ stdio: "pipe" },
);
});
afterAll(() => {
if (directory) NodeFS.rmSync(directory, { recursive: true, force: true });
});

const run = (args) =>
NodeChildProcess.spawnSync(executable, args, {
env: { ...process.env, DBUS_SESSION_BUS_ADDRESS: "unix:path=/unused-test-bus" },
});

it("builds an executable for the requested architecture into a staged resource directory", () => {
const output = NodePath.join(directory, "resources", "browser-secret", "t3-browser-secret");
NodeChildProcess.execFileSync(process.execPath, [
NodeURL.fileURLToPath(new URL("./build-browser-secret.mjs", import.meta.url)),
"--arch",
hostArch,
"--output",
output,
]);
const header = NodeFS.readFileSync(output).subarray(0, 20);
expect(header.toString("hex", 0, 6)).toBe("7f454c460201");
expect(header.readUInt16LE(18)).toBe({ x64: 62, arm64: 183 }[hostArch]);
expect(NodeFS.statSync(output).mode & 0o111).not.toBe(0);
// Invalid arguments exit before the real executable could contact a keyring.
expect(NodeChildProcess.spawnSync(output, []).status).toBe(64);
});

it("preserves the exact secret bytes with no added or removed delimiter", () => {
const result = run(["success"]);
expect(result.status).toBe(0);
expect(result.stdout).toEqual(Buffer.from("secret\0with whitespace \t\r\n"));
expect(result.stderr.length).toBe(0);
});

for (const [scenario, code] of [
["missing", 2],
["empty", 2],
["locked", 3],
["cancelled", 3],
["denied", 3],
["unavailable", 4],
["unloaded", 4],
]) {
it(`reports ${scenario} without emitting a secret`, () => {
const result = run([scenario]);
expect(result.status).toBe(code);
expect(result.stdout.length).toBe(0);
});
}
it("rejects invalid arguments before accessing the keyring", () => {
for (const args of [[], [""], ["chrome", "extra"]]) {
const result = run(args);
expect(result.status).toBe(64);
expect(result.stdout.length).toBe(0);
}
});
});
Loading