Commit Graph
1329 Commits
Author SHA1 Message Date
Dotta a67f5086f0 fix(runner): close provider launch trust gaps 2026-09-03 00:59:23 -05:00
Dotta d2d225e643 fix(runner): align Codex ACPX auth isolation 2026-09-03 00:48:48 -05:00
Dotta 919d919304 fix(runner): isolate ACPX Codex shell state 2026-09-03 00:19:59 -05:00
Dotta da796d9fb3 test(runner): acknowledge terminal result delivery 2026-09-03 00:01:25 -05:00
Dotta 21f326b544 Revert "ci(runner): classify standard ACPX diagnostic codes"
This reverts commit 851356c68c.
2026-09-02 23:59:38 -05:00
Dotta 876bd8e1f5 Revert "ci(runner): identify guardian admission failures"
This reverts commit 5cc56fff4f.
2026-09-02 23:59:38 -05:00
Dotta cd5b353b52 Revert "ci(runner): classify ACPX admission stages"
This reverts commit ae25fd4466.
2026-09-02 23:59:34 -05:00
Dotta 5c1b7918ca fix(runner): preserve ACPX command attestation 2026-09-02 23:57:21 -05:00
Dotta 1f1103c139 fix(runner): acknowledge terminal transitions durably 2026-09-02 23:57:21 -05:00
Dotta 78b793f222 fix(runner): project ACPX session identity 2026-09-02 23:46:13 -05:00
Dotta f71a771c16 fix(runner): reconcile terminal result delivery 2026-09-02 23:38:32 -05:00
Dotta 39f62116e2 fix(runner): project ACPX bridge tool catalog 2026-09-02 23:34:32 -05:00
Dotta 9f590c4552 fix(runner): preserve trusted ACPX terminal catalog 2026-09-02 23:26:10 -05:00
Dotta ab41f9fc32 test(runner): wait for Codex tool completion 2026-09-02 23:26:10 -05:00
Dotta 0ea77b2391 fix(runner): stop after terminal result delivery failure 2026-09-02 23:14:22 -05:00
Dotta ae25fd4466 ci(runner): classify ACPX admission stages 2026-09-02 23:14:22 -05:00
Dotta 66efaf142a fix(runner): read ACPX output error codes 2026-09-02 23:00:34 -05:00
Dotta 9238eea8dd fix(runner): stop after delivered terminal results 2026-09-02 22:59:17 -05:00
Dotta 9134a784ed fix(runner): persist terminal lifecycle before delivery 2026-09-02 22:59:17 -05:00
Dotta 5cc56fff4f ci(runner): identify guardian admission failures 2026-09-02 22:56:53 -05:00
Dotta 894fc1a814 fix(runner): traverse ACPX error causes safely 2026-09-02 22:48:43 -05:00
Dotta 851356c68c ci(runner): classify standard ACPX diagnostic codes 2026-09-02 22:41:37 -05:00
Dotta 7dce215d3b fix(runner): preserve ACPX failure detail codes 2026-09-02 22:26:26 -05:00
Dotta 39bce7e730 fix(runner): classify ACPX session ensure failures 2026-09-02 22:14:21 -05:00
Dotta e45efa6a0a fix(runner): surface ACPX admission classifications 2026-09-02 21:49:12 -05:00
Dotta e60a83c394 fix(runner): restore ACPX backend identity fallback 2026-09-02 21:37:38 -05:00
Dotta 4f028ae5ba fix(runner): classify ACPX admission failures 2026-09-02 21:29:51 -05:00
Dotta 26a6ce48bc fix(runner): verify ACPX model from durable state 2026-09-02 21:14:32 -05:00
Dotta 8ab2b54ace fix(runner): retain bounded ACPX startup diagnosis 2026-09-02 20:58:50 -05:00
Dotta 8bf1ff114c fix(runner): preserve verified runtime across descendants 2026-09-02 20:50:33 -05:00
Dotta 00ed904a81 fix(runner): mirror Codex runtime profile in runnerd 2026-09-02 20:31:55 -05:00
Dotta 7433aa3a37 fix(runner): qualify Codex ACP runtime executable 2026-09-02 20:23:39 -05:00
Dotta 005490d1b4 fix(runner): preserve provider startup classifications 2026-09-02 19:55:34 -05:00
Dotta 2ffcc0104a Merge remote-tracking branch 'origin/master' into fix/runner-paid-matrix-integrity
* origin/master:
  fix(onboarding): preserve draft through company refetch (#12735)
  feat(codex-local): give each Codex account its own home and path secret (#12709)
  feat(claude-local): add Claude Fable 5.1 support (#12730)
2026-09-02 19:32:45 -05:00
Dotta 0d8accea8c fix(runner): classify bounded ACPX startup failures 2026-09-02 19:32:40 -05:00
Dotta 464bcfec26 fix(runner): scope verified runtime inheritance 2026-09-02 19:29:03 -05:00
Dotta cf8e7d475a test(runner): match macOS verified runtime snapshot 2026-09-02 19:13:40 -05:00
Dotta b8e26f101e fix(runner): preserve verified runtime for provider descendants 2026-09-02 19:12:41 -05:00
Dotta 325e1e813d fix(runner): load sealed CommonJS entrypoints by descriptor 2026-09-02 19:00:11 -05:00
Dotta 7c85257f66 fix(runner): track closed ACPX input portably 2026-09-02 18:48:04 -05:00
Dotta 476ca3d877 fix(runner): close ACPX sidecar stdin cleanly 2026-09-02 18:45:12 -05:00
Dotta 16e165d958 fix(runner): define descriptor bundle module URL 2026-09-02 18:40:38 -05:00
Dotta d414396011 fix(runner): compile descriptor bundles without import meta 2026-09-02 18:37:44 -05:00
Dotta 62b79deb20 fix(runner): restore verified JS provider startup 2026-09-02 18:32:59 -05:00
Dotta 96fcadeb51 fix(runner): load sealed Node entrypoints as ESM 2026-09-02 18:13:54 -05:00
Dotta 8d36deaa72 fix(runner): scope verified ESM mode to Node 2026-09-02 18:00:27 -05:00
Dotta 03bab72ee8 fix(runner): restore verified native provider startup 2026-09-02 17:23:10 -05:00
Dotta 84f1fa89b4 fix(runner): secure bundled provider entrypoints 2026-09-02 16:55:16 -05:00
Nicky LeachandPaperclip 9064cfd09e feat(codex-local): give each Codex account its own home and path secret (#12709)
## Thinking Path

> - Paperclip is the control plane for companies that use AI agents for
work
> - Local adapters connect Paperclip agents to provider command line
tools
> - The Codex adapter stores login data in a shared company home
> - A shared home cannot keep credentials for more than one Codex
account
> - This pull request gives each account a safe home and a matching
company secret
> - The benefit is that one company can use multiple Codex accounts at
the same time

## Linked Issues or Issue Description

**Problem or motivation**

A company can hold only one Codex subscription credential because device
login uses one shared home. A second account cannot log in without
replacing or conflicting with the first credential.

**Proposed solution**

This change validates the vendor account identifier, stores each
credential in its own home, and creates a company secret that points to
that home. Repeat login calls return success when the matching secret
already exists.

**Roadmap alignment**

The change supports the roadmap goal for centrally managed secrets with
scoped access and audited resolution.

**Additional context**

The security review returned approve with no blocking finding. The
branch adds shared account-handle validation and tests for device login
and the Codex local adapter.

## What Changed

- Add strict allowlist validation for Codex account handles.
- Store each Codex account credential in a separate home under the Codex
cache root.
- Verify that the resolved account home stays inside the cache root.
- Create the `CODEX_HOME_<handle>` company secret for each account.
- Keep repeat and concurrent login calls safe and idempotent.
- Add shared helper and route, adapter, and validation tests.

## Verification

- `pnpm --filter @paperclipai/adapter-codex-local test` passes with 343
tests.
- `pnpm --filter @paperclipai/server test
src/__tests__/agent-device-login-routes.test.ts` passes with 25 tests.
- The adapter suite passes with 23 tests.
- The shared package and Codex adapter typechecks pass.
- Continuous integration must pass on every check before merge.

## Risks

The account handle becomes part of a directory path and secret name. The
strict allowlist and root containment check reduce path traversal risk.
Existing single-account homes remain unchanged unless a new device login
creates an account-specific home.

## Model Used

OpenAI GPT-5 (exact runtime model ID: gpt-5), with tool use and code
execution. The runtime context window is not exposed in this run.

## Checklist

- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have searched GitHub for duplicate or related PRs and linked
them above
- [x] I have either (a) linked existing issues with `Fixes: #` / `Closes
#` / `Refs #` OR (b) described the issue in-PR following the relevant
issue template
- [x] I have not referenced internal/instance-local Paperclip issues or
links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip`
URLs)
- [x] My branch name describes the change (e.g. `docs/...`, `fix/...`)
and contains no internal Paperclip ticket id or instance-derived details
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] All Paperclip CI gates are green
- [ ] Greptile is 5/5 with no open P2s, recommendations, or follow-ups
- [x] I will address all Greptile and reviewer comments before
requesting merge

---------

Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-09-02 14:46:53 -07:00
Dotta dfe7aaf26e fix(runner): stop after failed lifecycle commands 2026-09-02 16:34:24 -05:00