Commit Graph

17736 Commits

Author SHA1 Message Date
Filip M
1ff027c332 i18n(hr): started updating hr translation
Related issue #13766
2026-09-08 16:12:33 +02:00
Mitchell Hashimoto
b0c421fcd2 libghostty: return safe pointers for empty output (#14177)
Normalize empty buffers and borrowed strings at the libghostty-vt C
boundary to null pointers.

Zig can use sentinel addresses such as 0x1 for empty slices. Returning
these pointers to Go can cause a fatal invalid-pointer error when the
runtime relocates a goroutine's stack, even though the length is zero.
2026-09-07 21:02:01 -07:00
Mitchell Hashimoto
dd2edd760d libvt: return safe pointers for empty output
Normalize empty buffers and borrowed strings at the libghostty-vt C
boundary to null pointers.

Zig can use sentinel addresses such as 0x1 for empty slices. Returning
these pointers to Go can cause a fatal invalid-pointer error when the
runtime relocates a goroutine's stack, even though the length is zero.
2026-09-07 20:42:28 -07:00
Mitchell Hashimoto
82232ecde5 renderer: never stop the display link while holding the draw mutex (#14171)
Fixes #14150

drawFrame called syncDisplayLink from its no-redraw path while still
holding draw_mutex, and syncDisplayLink stops the CVDisplayLink when
there is no work left. CVDisplayLinkStop is a blocking join on
CoreVideo's IO thread. On macOS the apprt also calls drawFrame from the
CoreAnimation layer display callback on the main thread, which takes the
same mutex, so any CoreVideo stall inside that stop deadlocked.
2026-09-07 09:45:25 -07:00
Mitchell Hashimoto
623106cc4e config: rebuild RepeatableCommand's C mirror on clone (#14170)
## Why

`RepeatableCommand.clone` copies `value_c` shallowly: the cloned
`Command.C` structs keep string pointers into the *source* config's
memory, so the clone only stays valid as long as its source lives. Every
other field of a config clone is a deep copy — this is the one spot
where the clone silently borrows.

The macOS app never notices because of how it rotates configs: its
clone's source is the core-owned live config, and both are replaced
together on the next reload, so a clone never outlives its source. An
embedder that clones a config and then frees the source — a legal
sequence, e.g. promoting the clone to be the new active config — reads
freed memory the next time it fetches `command-palette-entry` through
the C API. Caught by AddressSanitizer.

History: the shallow copy is as old as the C exposure itself.
`dbe6035da` introduced `RepeatableCommand` with a correct deep `clone`
(zig-side `value` only); `017021787` added the `value_c` mirror for
`ghostty_config_get`, maintaining it carefully in `init`/`parseCLI` but
extending `clone` with only the mechanical `ArrayList.clone` — the
struct array copies, the string ownership doesn't. Nothing in-tree
exercises clone-then-free-source, so it stayed latent.

## What

Rebuild the C mirror from the cloned commands using the same
`Command.cval` path `parseCLI` uses, so the clone's C strings live in
the clone's own allocation. A regression test asserts the clone's C
strings do not alias the source's while staying equal in content.

## AI disclosure

Developed with AI assistance (Claude Code). The bug was found by
AddressSanitizer while testing the Windows embedding host; the
root-cause analysis, the fix, and the regression test were produced in
an AI-assisted session, then reviewed and verified by the submitter
(ASan clean after the fix, `RepeatableCommand` tests passing).
2026-09-07 09:25:41 -07:00
Mitchell Hashimoto
72cf508551 renderer: never stop the display link while holding the draw mutex
Fixes #14150

drawFrame called syncDisplayLink from its no-redraw path while still
holding draw_mutex, and syncDisplayLink stops the CVDisplayLink when
there is no work left. CVDisplayLinkStop is a blocking join on
CoreVideo's IO thread. On macOS the apprt also calls drawFrame from the
CoreAnimation layer display callback on the main thread, which takes
the same mutex, so any CoreVideo stall inside that stop deadlocked.
2026-09-07 09:21:52 -07:00
Mitchell Hashimoto
da9e21602f build(deps): bump c-hive/gha-remove-artifacts from 1.4.0 to 1.8.0 (#14165)
Bumps
[c-hive/gha-remove-artifacts](https://github.com/c-hive/gha-remove-artifacts)
from 1.4.0 to 1.8.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/c-hive/gha-remove-artifacts/releases">c-hive/gha-remove-artifacts's
releases</a>.</em></p>
<blockquote>
<h2>v1.8.0</h2>
<p>Enhancements:</p>
<ul>
<li>New <code>skip-recent-commits</code> input keeps every artifact of
the N most recent commits, regardless of how many artifacts each commit
produced. Applied before <code>skip-recent</code>, so the two can be
combined. Fixes <a
href="https://redirect.github.com/c-hive/gha-remove-artifacts/issues/28">#28</a></li>
<li><code>GITHUB_TOKEN</code> can now be set on both <code>env:</code>
and <code>with:</code> (for example when it is exported for all steps)
without the action failing. The input takes precedence. Fixes <a
href="https://redirect.github.com/c-hive/gha-remove-artifacts/issues/48">#48</a></li>
</ul>
<h2>v1.7.0</h2>
<p>Enhancements:</p>
<ul>
<li>New <code>dry-run</code> input: logs which artifacts would be
removed without deleting anything.</li>
<li>Stricter input validation. <code>age</code> now rejects fractional
amounts and units that are not durations (for example <code>30 D</code>,
which moment silently treated as zero); <code>skip-recent</code> and
<code>max-retries</code> must be non-negative integers. Previously such
values could make every artifact eligible for deletion.</li>
<li>Artifacts without commit information are reported separately from
tagged ones when <code>skip-tags</code> is on.</li>
</ul>
<p>Maintenance:</p>
<ul>
<li>Rewritten in TypeScript under <code>src/</code>, bundled with
esbuild</li>
<li>Unit tests for input parsing and the cleanup plan, plus end-to-end
tests against a mock GitHub API covering deletion, rate limit retries
and failure handling</li>
<li>CI split into lint, typecheck, test, build and run jobs</li>
<li>Dropped dependencies: yn, dotenv-safe, cross-env,
eslint-plugin-import</li>
</ul>
<h2>v1.6.0</h2>
<p>Enhancements:</p>
<ul>
<li>Artifacts are now listed repo-wide instead of per workflow run. This
cuts API requests by roughly two orders of magnitude and removes the
hardcoded 90-day window, so artifacts on repositories with longer
retention are now cleaned up too. Fixes <a
href="https://redirect.github.com/c-hive/gha-remove-artifacts/issues/62">#62</a></li>
<li>A failed deletion no longer aborts the run: remaining artifacts are
still processed and the action fails at the end with a count.</li>
<li>With <code>skip-tags</code>, artifacts without commit information
are kept rather than deleted.</li>
<li>The log ends with a summary of removed and skipped artifacts. Fixes
<a
href="https://redirect.github.com/c-hive/gha-remove-artifacts/issues/21">#21</a></li>
</ul>
<p>Maintenance:</p>
<ul>
<li>CI checks that <code>dist/</code> matches the source instead of
auto-committing it</li>
<li>Removed CodeQL workflow, pre-commit hooks and
eslint-plugin-import</li>
<li>Dependency purposes documented in <code>package.json</code></li>
</ul>
<h2>v1.5.0</h2>
<p>Enhancements:</p>
<ul>
<li>New <code>max-retries</code> input caps how often a rate-limited
request is retried before the action fails. <strong>Default: 5.</strong>
Previously requests were retried indefinitely; set a larger value to
keep the old behaviour. Fixes <a
href="https://redirect.github.com/c-hive/gha-remove-artifacts/issues/36">#36</a>,
<a
href="https://redirect.github.com/c-hive/gha-remove-artifacts/issues/49">#49</a>,
<a
href="https://redirect.github.com/c-hive/gha-remove-artifacts/issues/51">#51</a></li>
<li>Action runtime updated to Node 24 (<a
href="https://redirect.github.com/c-hive/gha-remove-artifacts/issues/63">#63</a>)</li>
</ul>
<p>Maintenance:</p>
<ul>
<li>All dependencies upgraded (<code>@actions/core</code> 3,
<code>@octokit/action</code> 8, <code>@octokit/plugin-throttling</code>
11, moment 2.30). <code>pnpm audit</code> reports no known
vulnerabilities.</li>
<li>Source converted to ESM, bundled with <code>@vercel/ncc</code></li>
<li>Tooling: pnpm, ESLint 10, Prettier 3, CI on Node 24</li>
<li>Docs: <code>action.yml</code> description, updated retention docs
link</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="62c2fbea93"><code>62c2fbe</code></a>
Bump version to 1.8.0</li>
<li><a
href="449a616233"><code>449a616</code></a>
Add skip-recent-commits input and accept GITHUB_TOKEN from env and
input</li>
<li><a
href="4bff15786b"><code>4bff157</code></a>
Bump version to 1.7.0</li>
<li><a
href="a52e55eb4f"><code>a52e55e</code></a>
Add end-to-end tests against a mock GitHub API</li>
<li><a
href="03f14e2351"><code>03f14e2</code></a>
Simplify config parsing, logging and tsconfig</li>
<li><a
href="04de7b0694"><code>04de7b0</code></a>
Address review findings on the TypeScript rewrite</li>
<li><a
href="8b74b1b6fc"><code>8b74b1b</code></a>
Rewrite in TypeScript, add tests, merge CI workflows</li>
<li><a
href="73aaf4a5bf"><code>73aaf4a</code></a>
Bump version to 1.6.0</li>
<li><a
href="c4da97c8ee"><code>c4da97c</code></a>
Ignore CLAUDE.local.md</li>
<li><a
href="614c11c542"><code>614c11c</code></a>
Describe each dependency in package.json</li>
<li>Additional commits viewable in <a
href="44fc7acaf1...62c2fbea93">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=c-hive/gha-remove-artifacts&package-manager=github_actions&previous-version=1.4.0&new-version=1.8.0)](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)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

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 <dependency name> 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)


</details>
2026-09-07 08:47:17 -07:00
Mitchell Hashimoto
ccaf7c7761 build(deps): bump ryand56/r2-upload-action from 1.4 to 1.5 (#14164)
Bumps
[ryand56/r2-upload-action](https://github.com/ryand56/r2-upload-action)
from 1.4 to 1.5.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/ryand56/r2-upload-action/releases">ryand56/r2-upload-action's
releases</a>.</em></p>
<blockquote>
<h2>v1.5</h2>
<h2>What's Changed</h2>
<ul>
<li>chore(deps): update dependency <code>@​types/node</code> to v22.9.0
by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/524">ryand56/r2-upload-action#524</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.686.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/526">ryand56/r2-upload-action#526</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.687.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/527">ryand56/r2-upload-action#527</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.688.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/528">ryand56/r2-upload-action#528</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.689.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/529">ryand56/r2-upload-action#529</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.691.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/530">ryand56/r2-upload-action#530</a></li>
<li>chore(deps): update determinatesystems/nix-installer-action action
to v16 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/531">ryand56/r2-upload-action#531</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.693.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/532">ryand56/r2-upload-action#532</a></li>
<li>chore(deps): update dependency <code>@​vercel/ncc</code> to v0.38.3
by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/534">ryand56/r2-upload-action#534</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.693.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/533">ryand56/r2-upload-action#533</a></li>
<li>chore(deps): update dependency typescript to v5.7.2 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/537">ryand56/r2-upload-action#537</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.700.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/536">ryand56/r2-upload-action#536</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.701.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/538">ryand56/r2-upload-action#538</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.703.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/539">ryand56/r2-upload-action#539</a></li>
<li>chore(deps): update dependency <code>@​types/node</code> to v22.10.1
by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/535">ryand56/r2-upload-action#535</a></li>
<li>chore(deps): update dependency dotenv to v16.4.6 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/540">ryand56/r2-upload-action#540</a></li>
<li>chore(deps): update dependency dotenv to v16.4.7 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/541">ryand56/r2-upload-action#541</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.705.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/542">ryand56/r2-upload-action#542</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.709.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/543">ryand56/r2-upload-action#543</a></li>
<li>chore(deps): update dependency <code>@​types/node</code> to v22.10.2
by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/544">ryand56/r2-upload-action#544</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.712.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/545">ryand56/r2-upload-action#545</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.713.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/546">ryand56/r2-upload-action#546</a></li>
<li>fix(deps): update dependency mime to v4.0.6 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/548">ryand56/r2-upload-action#548</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.715.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/547">ryand56/r2-upload-action#547</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.717.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/549">ryand56/r2-upload-action#549</a></li>
<li>chore(deps): update dependency <code>@​types/node</code> to v22.10.3
by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/550">ryand56/r2-upload-action#550</a></li>
<li>chore(deps): update dependency <code>@​types/node</code> to v22.10.5
by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/551">ryand56/r2-upload-action#551</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.722.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/552">ryand56/r2-upload-action#552</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.723.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/553">ryand56/r2-upload-action#553</a></li>
<li>chore(deps): update dependency typescript to v5.7.3 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/554">ryand56/r2-upload-action#554</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.726.1 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/555">ryand56/r2-upload-action#555</a></li>
<li>chore(deps): update dependency <code>@​types/node</code> to v22.10.6
by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/556">ryand56/r2-upload-action#556</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.731.1 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/557">ryand56/r2-upload-action#557</a></li>
<li>chore(deps): update dependency <code>@​types/node</code> to v22.10.7
by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/558">ryand56/r2-upload-action#558</a></li>
<li>chore(deps): update determinatesystems/magic-nix-cache-action action
to v9 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/560">ryand56/r2-upload-action#560</a></li>
<li>chore(deps): update dependency <code>@​types/node</code> to
v22.10.10 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/561">ryand56/r2-upload-action#561</a></li>
<li>chore(deps): update dependency typescript to v5.8.2 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/564">ryand56/r2-upload-action#564</a></li>
<li>ci(test-nix): replace magic nix cache with flakehub cache by <a
href="https://github.com/ryand56"><code>@​ryand56</code></a> in <a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/567">ryand56/r2-upload-action#567</a></li>
<li>chore(deps): update dependency typescript to v5.8.3 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/566">ryand56/r2-upload-action#566</a></li>
<li>fix(deps): update dependency mime to v4.0.7 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/565">ryand56/r2-upload-action#565</a></li>
<li>chore(deps): update determinatesystems/nix-installer-action action
to v17 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/569">ryand56/r2-upload-action#569</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.810.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/559">ryand56/r2-upload-action#559</a></li>
<li>chore(deps): update dependency <code>@​types/node</code> to
v22.15.19 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/572">ryand56/r2-upload-action#572</a></li>
<li>chore(deps): update stefanzweifel/git-auto-commit-action action to
v6 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/576">ryand56/r2-upload-action#576</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.832.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/571">ryand56/r2-upload-action#571</a></li>
<li>chore(deps): update dependency <code>@​types/node</code> to
v22.15.33 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/573">ryand56/r2-upload-action#573</a></li>
<li>fix(deps): update aws-sdk-js-v3 monorepo to v3.837.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/577">ryand56/r2-upload-action#577</a></li>
<li>chore(deps): update dependency dotenv to v16.6.0 by <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot] in
<a
href="https://redirect.github.com/ryand56/r2-upload-action/pull/578">ryand56/r2-upload-action#578</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="33ebb7a494"><code>33ebb7a</code></a>
chore: update to nodejs 24</li>
<li><a
href="61474c8f6a"><code>61474c8</code></a>
chore: update mappings [skip ci]</li>
<li><a
href="7d9e7c27f8"><code>7d9e7c2</code></a>
chore(deps): update typescript to v6</li>
<li><a
href="6e86c77f4a"><code>6e86c77</code></a>
fix(renovate): increase minimumReleaseAge and add packageRules for
ts</li>
<li><a
href="fd3d3d4ccd"><code>fd3d3d4</code></a>
chore(deps): update dependency jest to v30.5.1</li>
<li><a
href="0b5990b910"><code>0b5990b</code></a>
chore(deps): update dependency github-action-ts-run-api to v3.1.0</li>
<li><a
href="4196309eee"><code>4196309</code></a>
chore(deps): update dependency dotenv to v17.4.2</li>
<li><a
href="d62fd13887"><code>d62fd13</code></a>
chore(deps): update dependency <code>@​vercel/ncc</code> to ^0.45.0</li>
<li><a
href="5124bb9938"><code>5124bb9</code></a>
chore(deps): update dependency ts-jest to v29.4.12</li>
<li><a
href="820995a4f1"><code>820995a</code></a>
chore(deps): update dependency <code>@​actions/core</code> to
v3.0.1</li>
<li>Additional commits viewable in <a
href="b801a390ac...33ebb7a494">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ryand56/r2-upload-action&package-manager=github_actions&previous-version=1.4&new-version=1.5)](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)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

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 <dependency name> 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)


</details>
2026-09-07 08:47:04 -07:00
Mitchell Hashimoto
82938b633b deps: update translate-c backport (#14126)
This is just a monthly refresh, things have been pretty quiet on both
the Aro and translate-c sides.

ecbc5c7...f97cdfc

05e7b9dd87...4e879eb8ab
2026-09-06 18:35:00 -07:00
Chris Marchesi
2b3b893919 deps: update translate-c backport 2026-09-06 17:39:24 -07:00
dependabot[bot]
e9283ba872 build(deps): bump c-hive/gha-remove-artifacts from 1.4.0 to 1.8.0
Bumps [c-hive/gha-remove-artifacts](https://github.com/c-hive/gha-remove-artifacts) from 1.4.0 to 1.8.0.
- [Release notes](https://github.com/c-hive/gha-remove-artifacts/releases)
- [Commits](44fc7acaf1...62c2fbea93)

---
updated-dependencies:
- dependency-name: c-hive/gha-remove-artifacts
  dependency-version: 1.8.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-07 00:18:38 +00:00
dependabot[bot]
258c057c0a build(deps): bump ryand56/r2-upload-action from 1.4 to 1.5
Bumps [ryand56/r2-upload-action](https://github.com/ryand56/r2-upload-action) from 1.4 to 1.5.
- [Release notes](https://github.com/ryand56/r2-upload-action/releases)
- [Commits](b801a390ac...33ebb7a494)

---
updated-dependencies:
- dependency-name: ryand56/r2-upload-action
  dependency-version: '1.5'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-07 00:18:30 +00:00
ghostty-vouch[bot]
97f2ddb06e Sync CODEOWNERS vouch list (#14163)
Sync CODEOWNERS owners with vouch list.

## Added Users

- @slowdub

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-09-07 00:01:08 +00:00
Jeffrey C. Ollie
f426f6f181 Update iTerm2 colorschemes (#14159)
Upstream release:
https://github.com/mbadolato/iTerm2-Color-Schemes/releases/tag/release-20260831-151010-752a9c0
2026-09-06 16:58:49 -05:00
Mitchell Hashimoto
955d902fa6 pkg/fontconfig: update to 2.18.3 (#14113)
Supersedes #14071 (just additional review and local re-generation/re-org
of needed headers).

This updates our own bundled fontconfig (for static builds) to 2.18.3.

Note that fontconfig has changed their build process a bit since this
has been updated last; they are leaning on the Autoconf (and Meson as
they are now deprecating use of Autoconf) toolchain(s) to now generate a
number of headers that are a part of the build process.

Since servicing this dependency in an effort to keep the build pure Zig
is starting to get more complex, I've added some documentation on how to
actually get a snapshot of the fontconfig repository in a state where
files can be looked for and copied over as needed. Otherwise, we might
want to in the future consider removing this altogether and just rely on
system integrations.
2026-09-06 14:39:51 -07:00
i999rri
5909690de1 config: rebuild RepeatableCommand's C mirror on clone
Cloning value_c copied Command.C structs whose string pointers
still referenced the source config's memory; once the source was
freed, an embedded host reading the command list after a config
replace (ghostty_config_clone + ghostty_config_free of the old
one) hit use-after-free, caught by ASan. Rebuild the mirror from
the cloned commands with the same cval path parseCLI uses, and add
a regression test asserting the clone's C strings do not alias the
source's.
2026-09-07 02:09:49 +09:00
mitchellh
11d1cc4fc8 deps: Update iTerm2 color schemes 2026-09-06 00:22:51 +00:00
Mitchell Hashimoto
492300cad1 input: encode non-ASCII alt prefixes as UTF-8 (#14146)
Legacy Alt-as-Escape now prefixes the complete UTF-8 sequence for
non-ASCII input. When text is unavailable, the encoder falls back to the
UTF-8 encoding of the unshifted codepoint.

This fixes 16 xterm legacy cases and eight fixterms cases without
changing MOK2. The cases I'm talking about are in my comparison
harness...

The helper now writes Escape and the selected payload directly. It
preserves macOS Option-as-Alt translation and shifted ASCII behavior.
2026-09-04 10:49:54 -07:00
Mitchell Hashimoto
587e08f3f7 input: encode non-ASCII alt prefixes as UTF-8
Legacy Alt-as-Escape now prefixes the complete UTF-8 sequence for
non-ASCII input. When text is unavailable, the encoder falls back to
the UTF-8 encoding of the unshifted codepoint.

This fixes 16 xterm legacy cases and eight fixterms cases without changing
MOK2. The cases I'm talking about are in my comparison harness...

The helper now writes Escape and the selected payload directly. It
preserves macOS Option-as-Alt translation and shifted ASCII behavior.
2026-09-04 10:36:56 -07:00
Mitchell Hashimoto
b97654fe76 input: improve xterm modifyOtherKeys 2 compatibility (#14145)
Follow-up to #14144

I wrote a harness that created all possible US-layout keyboard input
combinations with xterm patch 411 and Ghostty main and compared their
full encoding sequence. There are various miscompatibilities on purpose
but these were definitely bugs I wanted to address first.

- Normal-mode numeric keypad keys now preserve their numeric output
instead of falling through to generic MOK2 encoding. Application keypad
behavior is unchanged.
- F13 through F25 now emit their xterm-compatible function-key
sequences, including modifier parameters.
- Help and Context Menu now emit editing-key codes 28 and 29.
- Alt+Escape now emits `CSI 27;3;27~` under MOK2 while retaining the
traditional `ESC ESC` encoding otherwise.

After these changes, 2,081 of 2,096 cases match xterm exactly. The
remaining 15 differences are intentional.
2026-09-04 10:10:49 -07:00
Mitchell Hashimoto
cc3fd8a773 input: encode help and context menu keys 2026-09-04 09:49:21 -07:00
Mitchell Hashimoto
37e3cdd2d2 input: encode alt+escape with MOK2 2026-09-04 09:49:21 -07:00
Mitchell Hashimoto
e7bdda9918 input: encode F13 through F25 2026-09-04 09:49:21 -07:00
Mitchell Hashimoto
636a2f35b4 input: preserve numeric keypad output with MOK2 2026-09-04 09:49:21 -07:00
Mitchell Hashimoto
1f5bb5769f input: encode ctrl keys with modifyOtherKeys 2 (#14144)
#7425

Control-modified characters use xterm's MOK2 encoding.

I incorrectly believed previously that MOK2 ctrl chars were still
encoded as C0 bytes. This is wrong. I'm going to do a more in depth
audit if possible with every possible key combination against xterm to
see where we diverge but this fixes this for now without regressing any
tests.

Background: https://invisible-island.net/xterm/modified-keys.html
2026-09-04 08:57:13 -07:00
Mitchell Hashimoto
4406cea3e9 input: encode ctrl keys with modifyOtherKeys 2
#7425

Control-modified characters use xterm's MOK2 encoding.

I incorrectly believed previously that MOK2 ctrl chars were still encoded 
as C0 bytes. This is wrong. I'm going to do a more in depth audit if
possible with every possible key combination against xterm to see where
we diverge but this fixes this for now without regressing any tests.

Background: https://invisible-island.net/xterm/modified-keys.html
2026-09-04 08:42:41 -07:00
Mitchell Hashimoto
c81f0b2687 terminal: cut the fixed heap cost of a new terminal nearly in half (#14138)
This focuses explicitly on the non-mmap allocations for a
`ghostty_terminal_new` result. The result is that we lower this portion
of the memory by almost half. The total benefit is smaller since 70% of
a terminal is mmap'd allocations, but this still yields an absolute ~5KB
savings on macOS on every new terminal (not just empty, but also with a
normal prompt and so on).

Four changes to make it happy, broken down into individual commits.
Nothing crazy:

- **Page list nodes are pooled individually.** The node pool was a
`std.heap.MemoryPool`, which sits on an arena that preheats and grows
1.5x, so we paid for wasted space. Nodes now come from `UntouchedPool`
(the same pool as page buffers) with a preheat of one, so the cost is
exactlyone node (well, exactly one bucket element size in whatever
allocator).
- **Pin pool and tracked pin set are sized for two pins.** Every screen
tracks exactly a viewport pin and a cursor pin at creation, but we
preheated eight pins and let the tracked pin map grow to 17 slots on the
first insert via doubling.
- **The kitty temp dir path is allocated only when set.** The C wrapper
embedded a 1 KiB `max_path_bytes` buffer that only embedders that set
`kitty_image_medium_temp_file` ever wrote to.
- **The default palette is shared instead of copied.** `DynamicPalette`
carried two full 1 KiB palettes, `current` and `original`, and
`original` was almost always the built-in default. It is now a pointer
to the shared built-in default, or to an allocator-owned copy when a
custom default is set. This introduces a new OOM path but we gracefully
handle it by either ignoring or resetting.

Memory measurements:

| Per terminal                                | Before   | After    |
|---------------------------------------------|----------|----------|
| phys_footprint delta, fresh                 | 30,066 B | 25,069 B |
| phys_footprint delta, styled prompt written | 47,023 B | 41,944 B |
| malloc zone bytes dirtied, fresh            | 12,698 B | 7,782 B  |
| malloc blocks live after `terminal_new`     | 11,904 B | 6,688 B  |
| malloc blocks live after the prompt         | 12,320 B | 7,104 B  |

I ran `ghostty-bench +terminal-stream` on a 500 MB ascii corpus, main vs
this branch interleaved, and there is no noticeable change.

**AI usage:** Fable did validation of the work, I did the
implementations, commit messages, and PR notes.
2026-09-03 16:09:39 -07:00
Mitchell Hashimoto
d1cd56a56c terminal: dynamic palette shares the built-in default instead of copying it per terminal 2026-09-03 15:17:51 -07:00
Mitchell Hashimoto
105d0a5453 terminal: C terminal wrapper allocates the kitty temp dir path only when it is set 2026-09-03 14:01:39 -07:00
Mitchell Hashimoto
35a6fb747f terminal: PageList preheats only the viewport and cursor pins 2026-09-03 13:59:43 -07:00
Mitchell Hashimoto
efa3c66ed1 terminal: PageList nodes are pooled individually from the gpa instead of an arena 2026-09-03 13:58:07 -07:00
Mitchell Hashimoto
07bccf7a31 terminal: make all page data structures treat zero as empty to avoid eagerly paging in mmap pages (#14137)
This updates all our page data structures so that the `0` value
(literally `@memset(0)`) means empty. This way, when we initialize a new
page via mmap (OS-guaranteed zeroed), we don't need to write to it, and
don't trigger the kernel to physically map the memory.

From Ghostty 1.3.1, our empty terminal physical memory usage goes from
128 KB to 48 KB (#14130) to 16 KB (this PR). And even with an empty
prompt written on my machine, it holds at 16KB, only increasing to two
pages (32 KB) with 24 rows written.

Here are some measurements. 

| Per terminal | Before (macOS) | After (macOS) | Before (Linux) | After
(Linux) |

|-------------------------------------------------------|----------------|---------------|----------------|---------------|
| Page-list memory dirty, fresh | 48 KiB | 16 KiB | 24 KiB | 8 KiB |
| Page-list memory dirty, 24 visible rows written | 64 KiB | 32 KiB | 36
KiB | 20 KiB |

Note macOS uses 16KB pages and Linux generally uses 4 KB pages. 

I ran `ghostty-bench +terminal-stream` main vs this branch and with
every normal workload the results are within noise (sometimes faster
sometimes slower).

**AI usage:** It was used as a judge/validator. The actual changes were
me, commit messages and PR messages all me.
2026-09-03 11:54:45 -07:00
Mitchell Hashimoto
d2ff6d77a0 terminal: pages initialize from zeroed memory and cache-line align their cells 2026-09-03 11:44:46 -07:00
Mitchell Hashimoto
6112935a2f terminal: hash map keeps its capacity and entry pointers in the struct 2026-09-03 11:44:45 -07:00
Mitchell Hashimoto
c0a4f80d80 terminal: hash map and ref counted set can initialize from zeroed memory 2026-09-03 11:44:45 -07:00
Mitchell Hashimoto
ffe015ee55 terminal: bitmap allocator marks free chunks with zero bits 2026-09-03 09:10:17 -07:00
Mitchell Hashimoto
09ff85b2ac macOS: fix find previous action when search is focused (#14131)
Typo found by @lrytz.
2026-09-03 08:38:09 -07:00
Mitchell Hashimoto
3cca3e0b95 macOS: follow up cascading fix for #14118 (#14132)
Didn't respect the comment above. Sorry for the back&forth changes 🫪
2026-09-03 08:38:00 -07:00
Lukas
e8936b8969 macOS: follow up cascading fix for #14118
Didn't respect the comment above before when reverting and testing hidden title 🫪
2026-09-03 09:22:36 +02:00
Lukas
e347482fba macOS: fix find previous action when search is focused 2026-09-03 08:13:21 +02:00
Mitchell Hashimoto
31bdcd5a79 terminal: don't touch me! keep the page pool free list unobtrusive (#14130)
This replaces the `std.heap.MemoryPool` used for page buffers with a
custom pool called `UntouchedPool`. This keeps its free list in a side
array and never reads/writes items until `create()`. This means that
demand-driven allocations (like mmaped pages) don't incur physical costs
until they're actually used.

The standard `std.heap.MemoryPool` uses an intrusive linked list for its
items which causes every item to be touched, which forces a full page-in
of memory.

It turns out we also had a lot of assertions and logic to work around
this in various ways (size of rows, asserting we overwrite the free list
entry, etc.) that we can now remove because of this.

For an 80x24 terminal on macOS (16 KB pages):

| Per terminal                 | Before   | After    |
|------------------------------|----------|----------|
| Page-list memory dirty       | 128 KiB  | 48 KiB   |
| Process phys_footprint delta | 143 KiB  | 62 KiB   |
| Page-list virtual size       | 2208 KiB | 1600 KiB |

The remaining 48 KB is the active page, because we sprinkle metadata
around the page which forces every page to be paged in. I'm going to
follow this up with some work trying to move all our metadata to the
front of the page so we only page one in until the rest is needed, but
not sure if its achievable.

Micro-benchmarks on the pool show that its twice the speed (slower) to
create/free due to the side list, but in an actual `+terminal-stream`
benchmark churning through pages, there is no measurable difference. I
think its a good trade.
2026-09-02 21:12:14 -07:00
Mitchell Hashimoto
e01e75bbb2 terminal: don't touch me! keep the page pool free list unobtrusive
This replaces the `std.heap.MemoryPool` used for page buffers with
a custom pool called `UntouchedPool`. This keeps its free list in a side
array and never reads/writes items until `create()`. This means that
demand-driven allocations (like mmaped pages) don't incur physical costs
until they're actually used.

The standard `std.heap.MemoryPool` uses an intrusive linked list for
its items which causes every item to be touched, which forces a full
page-in of memory.

It turns out we also had a lot of assertions and logic to work around
this in various ways (size of rows, asserting we overwrite the free
list entry, etc.) that we can now remove because of this.

For an 80x24 terminal on macOS (16 KB pages):

| Per terminal                 | Before   | After    |
|------------------------------|----------|----------|
| Page-list memory dirty       | 128 KiB  | 48 KiB   |
| Process phys_footprint delta | 143 KiB  | 62 KiB   |
| Page-list virtual size       | 2208 KiB | 1600 KiB |

The remaining 48 KB is the active page, because we sprinkle metadata
around the page which forces every page to be paged in. I'm going to
follow this up with some work trying to move all our metadata to the
front of the page so we only page one in until the rest is needed,
but not sure if its achievable.

Micro-benchmarks on the pool show that its twice the speed (slower) to
create/free due to the side list, but in an actual `+terminal-stream`
benchmark churning through pages, there is no measurable difference. I
think its a good trade.
2026-09-02 20:52:40 -07:00
Mitchell Hashimoto
600003455a surface: restore application mouse shape after modifier overrides (#14128)
This fixes a regression of 9a6469743 introduced in 6e8ed4e8b.

With this fix the mouse pointer will be restored to the previous (which
could have be set to something else via OSC22), not a hardcoded .text or
.default.

It also will change the cursor to a text selection if shift is held even
without mouse tracking, I think this is the expected behavior when a
cursor is set via OSC22. (Kitty additionaly, once you start selecting
changes to text (I-beam), this would be a follow-up if we desire to
behave like kitty with OSC22 pointers).
2026-09-02 20:14:44 -07:00
Chris Marchesi
0fb6d29404 SurfaceMouse: simplify keyToMouseShape
keyToMouseShape was initially designed with more of a transition table
model in mind to handle key presses/overrides based on very specific
cursor states. This never materialized, so I think it's safe to just
simply the process of handling overrides and/or passing along the
current cursor state from the terminal in the event of key presses.

Also removed a test that is essentially a duplicate of one before it now
(returning current surface shape in the event of no overrides).
2026-09-02 19:03:24 -07:00
Jesse Miller
3a766ccf50 surface: show .text (i-beam) while shift is held without mouse tracking
I think this is the expected behavoir when a custom OSC22 pointer is set. Once
shift is released it will return to mouse_shape (whatever the pointer
was before shit held).
2026-09-02 14:43:20 -06:00
Jesse Miller
6674aa3ba8 surface: update keyToMouseShape tests to expect mouse_shape
Update the tests to expect the mouse_shape back, not the hardcoded
.default or .text
2026-09-02 14:41:32 -06:00
Jesse Miller
5dfb672986 surface: restore mouse_shape when modifier overrides end
hard-coded .default & .text overrode a previously set OSC22 pointer
shape, this was a regression introduced in 6e8ed4e8b.
2026-09-02 14:39:46 -06:00
Mitchell Hashimoto
349f026087 os/open: consume the newline when draining opener stderr (#14125)
Fixes the runaway-thread bug reported in #14100 (vouched there).

`openThread` drains the spawned opener's stderr with
`takeDelimiterExclusive('\n')`. That function tosses only the exclusive
length, so the `'\n'` is never consumed. Once the child writes one line
to stderr, every subsequent call returns an empty slice without
advancing the stream: the `while (true)` loop spins forever — one pinned
core per affected `open()`, logging empty `os-open: open stderr=`
warnings at tens of thousands of messages per second for the lifetime of
the process — and `exe.wait()` is never reached, so the child is never
reaped.

This change reads inclusively (`takeDelimiterInclusive`, which does
consume the delimiter) and trims the `'\n'` for logging.

Observed in the wild embedding libghostty on macOS: several days of
uptime accumulated six leaked opener threads at ~70% of a core each
(~4.4 cores), from six link clicks whose `/usr/bin/open` wrote to
stderr. After the fix, the same workload shows zero `os-open` log
traffic and no leaked threads.

Repro without the fix: open a link whose handler writes to stderr (e.g.
an OSC 8 link with an unknown scheme), then watch a core pin and `log
stream --predicate 'subsystem == "com.mitchellh.ghostty"'` flood.

**AI disclosure** (per `AI_POLICY.md`): the bug was diagnosed and this
patch drafted with Claude Code (thread sampling, log analysis, and
reading the Zig 0.16 `std.Io.Reader` source to confirm
`takeDelimiterExclusive`/`takeDelimiterInclusive` toss semantics). I
reviewed the analysis and the change, understand both, and verified the
fix in a production build of the embedding app.
2026-09-02 10:27:42 -07:00
trag1c
e212b73cda Update mk localization for v1.4 (#14088)
Addressing #13766 for mk.
2026-09-02 18:57:57 +02:00
trag1c
372d6914b8 i18n: complete eu translation (#14095) 2026-09-02 18:51:00 +02:00