Commit Graph
1328 Commits
Author SHA1 Message Date
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
Michael NguyenandPaperclip dfdfc8664e feat(claude-local): add Claude Fable 5.1 support (#12730)
## Thinking Path

> - Paperclip is the open source app people use to manage AI agents for
work.
> - The Claude local adapter lets operators select a Claude model for an
agent.
> - Claude Fable 5.1 was absent from the adapter model lists.
> - The adapter runtime also used a Claude Code build that rejected
Fable 5.1.
> - This pull request adds the direct Anthropic ID and the AWS Bedrock
inference profile ID.
> - It also updates the Claude ACP runtime and keeps the Paperclip usage
and isolation patches.
> - The benefit is that operators can select and run Claude Fable 5.1
through the Claude adapter.

## Linked Issues or Issue Description

Refs #8810. That issue covers related model ID handling. This change
does not change provider-prefixed model IDs.

**Agent or provider**

Claude Code through the built-in `claude_local` adapter. The requested
model is Claude Fable 5.1.

**Why this adapter is useful**

Operators can use Fable 5.1 without entering an undocumented model ID.
The configured model also reaches both supported Claude execution lanes.

**How the agent is invoked**

The CLI lane sends `--model claude-fable-5-1`. The ACP lane sends
`ANTHROPIC_MODEL=claude-fable-5-1` to
`@agentclientprotocol/claude-agent-acp`.

**Are you willing to implement it?**

Yes. This pull request includes the implementation and tests.

**Additional context**

Claude Code 2.1.232 rejected Fable 5.1 and required version 2.1.251 or
newer. ACP package 0.73.0 includes Claude Code 2.1.257. The update keeps
Paperclip's usage metadata and isolated-context behavior.

## What Changed

- Added `claude-fable-5-1` to the direct Claude fallback list.
- Added `us.anthropic.claude-fable-5-1` to the AWS Bedrock list.
- Kept the existing default model at the first position in each list.
- Updated the Claude ACP dependency from 0.70 to 0.73.
- Carried the Paperclip usage and isolated-context changes into the 0.73
patch.
- Added a Claude Code 2.1.251 minimum-version preflight for Fable 5.1
when using the standard `claude` executable, surfaced in both adapter
Test and execution. Explicit custom wrappers retain their existing
compatibility contract.
- Kept local adapter Tests from executing caller-selected binaries: when
runtime `PATH` selects a different Claude executable than the trusted
probe, the Test warns and defers the authoritative version check to
execution instead of approving or rejecting the alternate installation.
- Added tests for model listing, discovery deduplication, Bedrock
filtering, model pass-through in both execution lanes, old-CLI rejection
before launch, custom-wrapper compatibility, and local runtime-PATH
mismatch handling.

## Verification

- `pnpm --filter @paperclipai/adapter-claude-local typecheck`
- `pnpm exec vitest run
packages/adapters/claude-local/src/server/execute.remote.test.ts
packages/adapters/claude-local/src/server/test.remote.test.ts
packages/adapters/claude-local/src/server/test.probe.test.ts
packages/adapters/claude-local/src/server/acp.test.ts
server/src/__tests__/adapter-models.test.ts` (72 tests passed)
- `node --test scripts/acpx-patch-packaging.test.mjs` (13 tests passed)
- `pnpm -r typecheck`
- `pnpm build`
- A local Paperclip agent run completed with `usageJson.model` set to
`claude-fable-5-1` through ACP 0.73.0 and its bundled Claude Code
2.1.257.
- `pnpm test:run` completed 5,638 passing tests and 24 skipped tests. It
also found 24 failures in unrelated workspace-runtime,
path-canonicalization, and runtime-exposure tests on macOS with Node 26.
These failures do not touch this diff. Clean pull request CI is the
final full-suite gate.

## Risks

- The ACP dependency update can change Claude runtime behavior outside
model selection. Focused ACP tests, the full typecheck, the production
build, and a real local Fable run reduce this risk.
- The 0.73 patch must stay aligned with the installed ACP version.
Dependency-resolution CI verifies the manifest and patch pair.
- Fable 5.1 adds a short `claude --version` preflight to standard
CLI-lane Tests and runs. The result is intentionally not cached so an
in-place Claude Code upgrade takes effect without restarting Paperclip.
Explicit custom wrappers are not version-probed because their output and
compatibility contract can differ from the standard executable.
- Local Tests preserve the existing deny-by-default probe boundary and
do not execute a binary selected by caller-controlled `PATH`. A
mismatched runtime binary produces an explicit warning without blocking
an otherwise valid setup; execution independently validates the actual
runtime-selected CLI before launch.
- The AWS Bedrock identifier differs from earlier IDs because Fable 5.1
has no `-v1` suffix. The model-list test locks this exact value.
- There is no schema change or migration.

> For core feature work, check [`ROADMAP.md`](ROADMAP.md) first and
discuss it in `#dev` before opening the PR. Feature PRs that overlap
with planned core work may need to be redirected — check the roadmap
first. See `CONTRIBUTING.md`.

## Model Used

Provider: OpenAI. Model: GPT-5 Codex. The host did not expose a more
specific model ID or context-window size. Capabilities used: agentic
reasoning, repository editing, shell execution, web research, and local
runtime verification.

## 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
- [x] 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:32:01 -07:00