From 1b58ac6ec953097a9bd94c95d0af866c37232151 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Oct 2026 18:46:09 -0700 Subject: [PATCH] build(deps): bump smol-toml from 1.8.0 to 1.9.1 (#16020) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Thinking Path > - Paperclip is the open source app people use to manage AI agents for work. > - The Codex runner must set trust for the exact startup project. > - smol-toml 1.9.1 returns tables with null prototypes. > - Object spread replaces those prototypes and causes strict validation to reject valid trust edits. > - This PR keeps the parsed tables and adds tests for the dependency update. > - Codex can start while unrelated settings and trust boundaries stay intact. ## Linked Issues or Issue Description Refs #16028. That merged PR contains the same table-preservation fix and tests for both prototype styles. This branch retains that work and adds more regression cases. Related dependency updates: #15293 and #15364. **What happened?** Eight startup trust tests fail after the update to smol-toml 1.9.1. The error is `codex_startup_trust_cannot_preserve_configuration`. **Expected behavior** Set trust for the exact startup project. Keep unrelated configuration bytes and sibling project trust unchanged. **Steps to reproduce** 1. Check out the original PR head, `90b133dfd963af4f19b4df11fdd6c11b4eeb2a2d`. 2. Install dependencies with `pnpm install --frozen-lockfile`. 3. In `packages/paperclip-runner`, run `pnpm exec vitest run src/drivers/codex/codex-startup-trust.test.ts`. **Paperclip version or commit** The verified head is `1a8e8ad8b2e1049ebb68595d85c92e3c0621559d`. **Deployment mode** Built from source on Linux. The affected code runs before Codex starts. ## What Changed - Keep Dependabot's update from smol-toml 1.8.0 to 1.9.1 in the runner and server. - Keep parsed project tables. Use `parse("")` to create missing tables with the parser's prototype. - Keep strict candidate validation and the upstream tests for both prototype styles. - Add tests for nested values, dates, times, special numbers, prototype-named keys, sibling trust, and repeated calls. - Preserve the original Dependabot commit and lockfile. The two follow-up commits change only the trust source and tests. ## Verification - All 28 startup trust cases pass at the verified head. Run the command above. - The focused strict TypeScript check passes. Use `tsc --ignoreConfig --noEmit --module nodenext --moduleResolution nodenext --target es2023 --types node --esModuleInterop --strict --skipLibCheck src/drivers/codex/codex-startup-trust.ts src/drivers/codex/codex-startup-trust.test.ts`. - The runner TypeScript build passes. The full local build stops because the test workspace has no Cargo executable. - The broader Codex suite passed 271 of 272 cases before the source conflict resolution. One unrelated fixture expects the runtime's workspace path to be absent. - The repository type check exited 137 in the DB package. The full local test command was stopped after resource exhaustion. - The final files merge cleanly with master `976cdc77ed564dc3e014621505890b647e554a7f`. `git diff --check` passes. - [CI for the verified head](https://github.com/paperclipai/paperclip/actions/runs/38664681165) passed. All 55 active checks passed; two Storybook checks were skipped. Snyk also passed. [Greptile cycle 3](https://github.com/paperclipai/paperclip/pull/16020#issuecomment-6182103775) scored this head 5/5 with no actionable findings and no open review threads. ## Risks - This update changes the parser used by the runner and server. CI must check both packages. - The trust edit must preserve unrelated TOML values and bytes. Regression tests cover this behavior. - Local resource and tool limits prevent a complete local validation result. The full remote CI run passed at the verified head. ## Model Used OpenAI GPT-6 through Codex helped with the compatibility fix, tests, and review. The runtime does not expose the exact model snapshot or context window size. The agent used repository tools, code execution, and GitHub tools. Dependabot produced the original dependency and lockfile update. ## 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 — the focused 28-case suite and strict type check pass; broader limits are listed above - [x] I have added or updated tests where applicable - [x] I have updated relevant documentation to reflect my changes — this PR records the compatibility behavior and verification - [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 --- ## Original Dependabot Update Bumps [smol-toml](https://github.com/squirrelchat/smol-toml) from 1.8.0 to 1.9.1.
Release notes

Sourced from smol-toml's releases.

v1.9.1

What's Changed

Full Changelog: https://github.com/squirrelchat/smol-toml/compare/v1.9.0...v1.9.1

v1.9.0

Huge update!!! This is most likely the largest update the library received since its release, with lots of new features and improvements.

Performance improvements

Significant parts of the internal parse logic have been rewritten, improving performance by 1.5x-2x. The library was already comfortably ahead of the others, but it is now faster than ever, sitting at 4x faster parse performance than the closest maintained implementation.

Problematic code paths have also been replaced by safer implementations, solving potential DoS vectors. See GHSA-r4xh-jqrq-34v2.

Note: the objects returned by the library now have a null prototype. This is a transparent change for 99.9% of users, and is one of the most significant contributors to the major performance gains in this version.

Full Temporal support

Version 1.8.0 brought support for Temporal in stringify; now the library is also able to emit Temporal objects instead of its own ad-hoc TomlDate object. It is not enabled by default, but it will become the default in v2. Enable by setting useLegacyDate: false in the parser's options.

Better Temporal support in stringify

Temporal support has been improved since it released: Temporal objects that cannot be represented (such as Temporal.PlainMonthDay) now throw an error (instead of silently emitting a bogus object).

A new option has been added to stringify to disallow Temporal objects that cannot be fully represented in TOML. This includes ZonedDateTime objects with a IANA timezone attached instead of a plain offset, and dates with a specific calendar value set. Enable by setting strictTemporal: true in the options.

Handling of unsafe keys

Since its release the library has been protected against prototype pollution attacks, setting properties like __proto__ using safe mechanisms that do not trigger prototype pollution. However, while the returned objects are safe on their own, they may become problematic if used carelessly.

Inspired by secure-json-parse, the library now offers a way to either drop unsafe properties from the returned object, or to throw an error and reject documents altogether. By default, these potentially unsafe keys are preserved and returned.

Miscellaneous updates

Full Changelog: https://github.com/squirrelchat/smol-toml/compare/v1.8.0...v1.9.0

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=smol-toml&package-manager=npm_and_yarn&previous-version=1.8.0&new-version=1.9.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Devin Foley Co-authored-by: Paperclip --- packages/paperclip-runner/package.json | 2 +- .../drivers/codex/codex-startup-trust.test.ts | 56 +++++++++++++++++++ pnpm-lock.yaml | 14 ++--- server/package.json | 2 +- 4 files changed, 65 insertions(+), 9 deletions(-) diff --git a/packages/paperclip-runner/package.json b/packages/paperclip-runner/package.json index 910453c3273..66218496966 100644 --- a/packages/paperclip-runner/package.json +++ b/packages/paperclip-runner/package.json @@ -181,7 +181,7 @@ "opencode-ai": "1.18.34", "react-markdown": "^10.1.0", "remark-gfm": "^4.0.1", - "smol-toml": "^1.4.2" + "smol-toml": "^1.9.1" }, "peerDependencies": { "react": ">=18", diff --git a/packages/paperclip-runner/src/drivers/codex/codex-startup-trust.test.ts b/packages/paperclip-runner/src/drivers/codex/codex-startup-trust.test.ts index e8ef76d4d72..1544e1a269d 100644 --- a/packages/paperclip-runner/src/drivers/codex/codex-startup-trust.test.ts +++ b/packages/paperclip-runner/src/drivers/codex/codex-startup-trust.test.ts @@ -1,3 +1,4 @@ +import { deepStrictEqual } from "node:assert"; import { mkdtempSync, mkdirSync, @@ -99,6 +100,61 @@ describe.each([ }, ); + it.each(["missing", "untrusted", "trusted"])( + "preserves nested TOML values and sibling trust with target trust %s", + (trust) => { + const temp = realpathSync(mkdtempSync(join(tmpdir(), "codex-trust-values-"))); + try { + const cwd = join(temp, "project"); + const home = join(temp, "home"); + mkdirSync(cwd); + mkdirSync(home); + const unrelated = [ + 'special = [nan, inf, -inf, -0.0]', + 'created = 2026-10-12T19:04:14Z', + 'local_date = 2026-10-12', + 'local_time = 19:04:14', + '[projects."/unrelated"]', + 'trust_level = "untrusted"', + 'settings = { __proto__ = { keep = true }, constructor = { name = "unchanged" } }', + '[[mcp_servers.fixture.entries]]', + 'name = "unchanged"', + '', + ].join("\n"); + const target = trust === "missing" ? "" : [ + `[projects.${JSON.stringify(cwd)}]`, + `trust_level = "${trust}" # retain target comment`, + `[projects.${JSON.stringify(cwd)}.settings]`, + 'nested = { __proto__ = { keep = true }, values = [nan, -0.0] }', + '', + ].join("\n"); + const original = unrelated + target; + writeFileSync(join(home, "config.toml"), original); + + trustCodexStartupRoot(home, cwd); + + const updated = readFileSync(join(home, "config.toml"), "utf8"); + expect(updated.startsWith(unrelated)).toBe(true); + if (trust !== "missing") { + expect(updated).toBe(unrelated + target.replace( + 'trust_level = "untrusted"', 'trust_level = "trusted"', + )); + } + const expected = parse(original); + const actual = parse(updated); + const projects = actual.projects as Record>; + expect(projects[cwd].trust_level).toBe("trusted"); + if (trust === "missing") delete projects[cwd]; + else projects[cwd].trust_level = trust; + deepStrictEqual(actual, expected); + trustCodexStartupRoot(home, cwd); + expect(readFileSync(join(home, "config.toml"), "utf8")).toBe(updated); + } finally { + rmSync(temp, { recursive: true, force: true }); + } + }, + ); + it("trusts the exact non-Git root and preserves unrelated config", () => { const temp = realpathSync(mkdtempSync(join(tmpdir(), "codex-trust-"))); try { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d162c049ec4..114e61bc775 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -525,8 +525,8 @@ importers: specifier: ^4.0.1 version: 4.0.1 smol-toml: - specifier: ^1.4.2 - version: 1.8.0 + specifier: ^1.9.1 + version: 1.9.1 optionalDependencies: '@github/copilot-darwin-arm64': specifier: 1.0.88 @@ -1074,8 +1074,8 @@ importers: specifier: ^0.35.4 version: 0.35.4(@types/node@24.13.3) smol-toml: - specifier: ^1.4.2 - version: 1.8.0 + specifier: ^1.9.1 + version: 1.9.1 ssh2: specifier: ^1.17.0 version: 1.17.0 @@ -8482,8 +8482,8 @@ packages: engines: {node: '>=18'} hasBin: true - smol-toml@1.8.0: - resolution: {integrity: sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==} + smol-toml@1.9.1: + resolution: {integrity: sha512-j7WyPdf0CJoutMzMoPLF/bVXHtKZIT9Rb4eGeEbWw8X2t5oirjPgpL+OpaENZrILYaXqYwnVH+qgUwVbl+pUJQ==} engines: {node: '>= 18'} sonic-boom@4.2.1: @@ -16892,7 +16892,7 @@ snapshots: - bare-buffer - react-native-b4a - smol-toml@1.8.0: {} + smol-toml@1.9.1: {} sonic-boom@4.2.1: dependencies: diff --git a/server/package.json b/server/package.json index 0ce4ac72f0f..ab0bf9e23a2 100644 --- a/server/package.json +++ b/server/package.json @@ -107,7 +107,7 @@ "pino-http": "^11.0.0", "pino-pretty": "^13.1.3", "sharp": "^0.35.4", - "smol-toml": "^1.4.2", + "smol-toml": "^1.9.1", "ssh2": "^1.17.0", "svix": "1.76.1", "ws": "^8.22.0",