Skip to content

chore(deps): bump @earendil-works/pi-durable from 1.1.0 to 1.4.0 - #506

Merged
powerfooI merged 2 commits into
mainfrom
dependabot/bun/earendil-works/pi-durable-1.4.0
Oct 27, 2026
Merged

powerfooI merged 2 commits into
mainfrom
dependabot/bun/earendil-works/pi-durable-1.4.0

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Oct 27, 2026

Copy link
Copy Markdown
Contributor

Bumps @earendil-works/pi-durable from 1.1.0 to 1.4.0.

Release notes

Sourced from @​earendil-works/pi-durable's releases.

v1.4.0

New Features

  • Image input for classifiers: codemode models.classify() accepts images for TypeSafe's Jev and Cloudflare's Clef models on typesafe, cloudflare-workers-ai, and OpenRouter. See Use classifier models and Codemode.
  • Models Configuration reference: every provider, model, model override, and compatibility field of models.json, generated from its schema. See Models Configuration.
  • Summaries without a fixed output cap: compaction and branch summaries use the model's output limit, so long reasoning no longer makes them fail. See Compaction.
  • Codemode waits for a free worker: parallel scripts and in-process subagents queue instead of failing, and PI_CODEMODE_MAX_WORKERS raises the limit. See Codemode limits.
  • Rex terminal support: OSC 8 hyperlinks, truecolor, and inline images.

Added

  • Added a Models Configuration reference generated from the models.json schema, listing all provider, model, model override, and compatibility fields (#10790)
  • Codemode models.classify() now accepts images for TypeSafe's Jev and Cloudflare's Clef models on typesafe, cloudflare-workers-ai, and OpenRouter, and lists Clef Omni and Jev 1.14 on Workers AI.
  • Provider-level compat in models.json now also applies to classifier models, with the System One fields imageInput and sendImageOptInHeader for proxies that serve another service's classifiers. Extension classifier models accept compat too.
  • Added MiniMax-M3.1-Flash to the minimax and minimax-cn providers, with thinking levels low through max (#11121)
  • Added support for the Rex terminal: OSC 8 hyperlinks, truecolor, and inline images (#11131, #11150 by @​petrroll, #11183 by @​nihaals)

Changed

  • Provider attribution headers now come from pi-ai's client identity. Extensions' before_provider_headers handlers no longer see the OpenRouter, NVIDIA NIM, and OpenCode attribution headers; returning null for one still removes it. Cloudflare requests send pi's detailed User-Agent instead of pi-coding-agent, as do GitHub release checks for tool downloads, and OpenCode requests send x-opencode-client whenever attribution is enabled, not only with a session.
  • generateSummary() and generateSummaryWithUsage() now ignore their reserveTokens parameter. Summary requests use the model's output limit instead.
  • Changed the default GitHub Copilot model from gpt-5.4, which Copilot retired, to gpt-6.1-sol.
  • Changed the default NVIDIA model to nvidia/nemotron-3.5-super-vl-120b-a12b (#10910 by @​cv)
  • Changed the default Xiaomi model to mimo-v2.6-pro for the xiaomi and Xiaomi Token Plan providers, since mimo-v2.5-pro left the catalog.
  • Grok 4.3 and Grok 4.5 on the xai provider now offer the xhigh thinking level.
  • Sign in with ChatGPT: ChatGPT Business workspace usage-limit errors are not retried and tell the user to ask their workspace admin to increase the limit.

Fixed

  • Fixed compaction and branch summaries failing with "generation hit the token cap" when reasoning used most of the fixed summary output limit. Summaries now use the model's output limit, and compaction.reserveTokens only controls when compaction starts (#9512, #9075).
  • Fixed models.schema.json missing descriptions for provider and model fields, so editors showed no hints for them (#10790)
  • Fixed pi update failing with "Managed install marker is missing or invalid" when managed-install.json starts with a UTF-8 BOM, which Windows PowerShell 5.1 adds when it rewrites the file.
  • Fixed HTML export showing literal asterisks for Markdown bold and italic next to CJK punctuation (#3353, #10154)
  • Fixed the terminal staying in mouse-tracking, focus-reporting, Kitty keyboard, and alternate-screen modes when pi exits without its normal terminal teardown, which flooded the shell prompt with escape sequences (#11170)
  • Fixed concurrent extension select/confirm/input/editor dialogs and inline custom() components in interactive mode: a second dialog replaced the first and the first promise never settled; closing the visible dialog now shows the previous one again (#11166, #9909)
  • Fixed pasting in the shell hanging after copying text in pi and suspending it with Ctrl+Z on Linux: the background wl-copy/xclip/xsel process that keeps serving the clipboard was suspended along with pi (#11179)
  • Fixed codemode scripts failing immediately when both codemode workers are busy, for example with parallel codemode calls or in-process subagents. Scripts now wait up to 60 seconds for a free worker, and PI_CODEMODE_MAX_WORKERS raises the limit of two workers (#11184)
  • Fixed extensions failing to load when importing @earendil-works/pi-ai/models (e.g. for clampThinkingLevel) by exposing the subpath through the extension loader aliases and virtual modules (#11156)
  • Fixed mcp.json files that start with a UTF-8 BOM failing to parse, which skipped all their MCP servers and made pi mcp add/pi mcp remove fail (#11191)
  • Fixed /compact <instructions> ignoring the instructions when summarizing the start of a turn that compaction splits. When the split turn was the only new content since the last compaction, the instructions were ignored entirely (#11058)
  • Fixed resumed sessions and /tree navigation leaving extension tools inactive when the branch recorded its tools before they were registered, such as tools from extensions installed after the session started. Extension tools the branch never added or removed are now active unless they are registered with defaultActive: false (#11062, #11075)
  • Fixed sessions breaking after recovery from a response cut off at the output limit: the truncated tool call was omitted but its tool results were kept, so providers rejected every later request (#11227, #11233 by @​petrroll)
  • Fixed the grep tool following RIPGREP_CONFIG_PATH, where options such as --fixed-strings silently changed regex searches into literal ones. The tool now runs rg --no-config (#11203, #11230 by @​petrroll)
  • Fixed Windows shell detection rejecting runnable Microsoft Store shell aliases (#9504 by @​petrroll)
  • Fixed Windows shell detection missing PowerShell outside PATH and the legacy WSL bash.exe launcher when Windows is not installed in C:\Windows. pi now checks %ProgramFiles%\PowerShell\7, %SystemRoot%\System32\WindowsPowerShell\v1.0, and %SystemRoot% (#9501 by @​petrroll)
  • Fixed GitHub Copilot sessions with large request bodies, such as many images, failing with HTTP 413 failed to parse request instead of compacting and retrying (#11016 by @​petrroll)
  • Fixed the openai-codex provider offering gpt-5.5 and gpt-5.3-codex-spark, which always fail for ChatGPT accounts (#11173 by @​lucasmeijer)
  • Fixed whitespace-only tool output (for example a bare \r\n from bash) making OpenAI Completions, OpenAI Responses, and Google requests fail with a 400 (#8720)
  • Fixed automatic retry not triggering for more gateway upstream failures, stream disconnected before completion errors relayed by Codex CLI proxies, and transient Google Vertex OAuth token refresh failures, and retrying errors because of digits inside request ids or byte counts (#10920, #11057, #10996)
  • Fixed OpenAI Responses models losing the prompt cache on every deferred tool load after a tool was removed (#10940)

... (truncated)

Changelog

Sourced from @​earendil-works/pi-durable's changelog.

[1.4.0] - 2026-10-21

Breaking Changes

  • TaskRuntime.sleep() is removed: it waited inside a phase, which holds an invocation and, after a restart, reruns the phase and restarts the wait. A task now ends its phase asleep with runtime.sleepUntil(until, checkpoint, context) or by returning { status: "sleeping", until, checkpoint } from runtime.commit(); move the work after the wait into the next phase and carry what it needs in the checkpoint. TaskRuntime.setTimer() paces work inside a phase without waiting for it.
  • Tasks have a sleeping status, so code that handles every TaskState, TaskGraphState, or TaskInspection state needs a case for it.
  • Opening a SQLite storage migrates it to schema version 2 automatically, rebuilding its task table. A migrated database cannot be opened by 1.3.0 or earlier, so a deployment cannot roll back past this release. JSONL storage needs no migration, but 1.3.0 or earlier never resumes a sleeping task it finds (a run's conversation stays busy).
  • TaskRuntime has sleepUntil() and setTimer(), and ToolExecutionApi has now(): code that builds either object by hand, such as a test fake or a tool wrapper that does not spread the original, must add them.
  • A task cut off by a crash 5 times in a row without committing a new state is parked instead of run again (see the crash-loop guard under Added); set settings.restartLimit to Infinity to keep the old behavior. TaskInspection's blocked reasons include restart_limit.
  • defineDoc() and defineDocFamily() require an explicit checkpointWhen predicate on every definition; there is no default. Use () => false to keep ordinary changes as deltas, or supply a policy that periodically writes a base.

Added

  • Added IndexedDbStorage (@earendil-works/pi-durable/storage/indexeddb), a browser storage backed by IndexedDB.
  • HarnessOptions.telemetry emits the content-free DURABLE_TELEMETRY_SCHEMA: public submission admission spans, task phase spans (including extension tasks), committed entry and submission events, running phase-change checkpoints, and nested-tool replay events. Optional propagation stores opaque carriers on submissions and tasks so queued inputs and reopened tasks retain their trace; TaskOptions.trace accepts a carrier override or "root" (absence inherits the creator's carrier); creation-time links connect inputs sharing a run, while steer admissions link to the running trace. Internal admissions emit events without a submit span. Optional metrics record phase duration and live task counts. Failed phases record fixed error-status categories (task_faulted, task_failed, task_orphaned) and diagnostics capped at 500 characters; aborted phases keep status ok. Every onReport report also emits a fixed-field pi.durable.report event on its current span (dropped by the NOOP span when there is none), plus a pi.durable.reports counter by type; report telemetry contains no error payload and leaves the callback unchanged. Clock failures report without a phase context. Generation and compaction forward their phase context to pi-ai requests.
  • settings.compaction.modelOverrides sets compaction thresholds per model, keyed by exact "provider/modelId", so one harness can serve small- and large-window models; the threshold check, overflow recovery, and the compaction task use the entry of the model they act for (#10942).
  • Durable sleeps: a sleeping task holds no invocation, survives restarts, and resumes at its checkpoint once the Harness clock reaches until.
  • HarnessOptions.setTimer arms the timers of the Session, the scheduler, and its tasks (progress throttles, idle-memory eviction, sleeps), also for createSession(); with now, they run on a host or fake clock. A foreground timer the host throws on or declines falls back to setTimeout. ToolExecutionApi.now() reads the Harness clock.
  • Harness.wake() and HarnessOptions.onWake tell a host when the Session next needs a process: active while work can run, at for the earliest sleep. With onWake, the Harness keeps no timer for sleeps, so a Cloudflare Durable Object can hibernate and wake on its alarm, calling resume().
  • Crash-loop guard: open counts the restarts of each task that a crash, eviction, or reset cut off (TaskRecord.restarts); a close writes the tasks it stopped back as pending uncounted, and a new state the task commits starts the count over. At settings.restartLimit the task is parked: blocked with reason restart_limit in inspect() and the task graph, not active in wake(), and reported once. Harness.retryTask(id) runs it again. An abort handler cut off that many times ends its task faulted.
  • onReport(error, info): info (ReportInfo) says what happened in type: session_failed; task_faulted, task_parked, migration_failed, task_outdated, or task_error with the task and the extension that installed it; extension_error with the extension's name; host_error with the failing HostCallback; or listener_error.
  • settings.afterFailedRun: a run that fails with model_error or no_model keeps the inputs queued behind it (keep, the default), starts the next run with them (continue), or settles them unanswered with reason run_failed (withdraw).
  • The task graph shows why a task cannot run (TaskGraphNode.blocked: missing_task, task_too_old, migration_failed, or restart_limit) and follows registry changes and failed migrations.
  • Added HarnessOptions.identity (a pi-ai ClientIdentity) to set the User-Agent and provider attribution of every model request through the Harness, including hooks and tools. api.models in tools and hooks is now a wrapper of the host's Models that adds the identity, not the same object.
  • HarnessOptions.models and HarnessOptions.settings also accept a function returning the current value, like env. Generation, compaction, hooks and tools call it at each use (api.models reads the current value at each access), so a host can replace its model configuration or settings without reopening the Harness. A plain object still works.

Changed

  • A task phase that faults is reported through onReport (as task_faulted), not only recorded in its outcome.
  • onReport gets a second argument, info, and TaskRuntime.report() takes an optional from (see Added); an onReport written for one argument still works.
  • Generation retry backoffs, deferred-response polls, and compaction retry backoffs sleep instead of waiting in a running phase, so a process can stop or hibernate during them. A record an earlier version stored mid-backoff sleeps again when it resumes before its time. A deferred poll whose model is gone after a reopen now fails no_model once the poll is due, not at once.
  • Code mode measures script deadlines and wall time on the Harness clock (HarnessOptions.now) instead of Date.now().
  • SQLite drivers, portable interfaces, and the generic migration runner now come from @earendil-works/chord/sqlite. Existing Durable SQLite entry points keep re-exporting their public names; storage helpers and Durable schema migrations stay here.
  • ToolControl.terminate is now typed boolean instead of true, matching pi-agent-core and pi-coding-agent; false does not end the run (#10858).

Fixed

  • In Cloudflare Workers with nodejs_compat, the timers that evict idle documents and contexts were armed, since timers there have an unref(); a pending one kept a Durable Object from hibernating and blocked its eviction. They are now declined in Workers, and memory is freed at later commits.
  • The README's Errors section now limits the StorageRequestError exemption to reads: a StorageRequestError thrown by commit() or mintId() fails the Harness like any other storage error (#11014).
  • The Node environment now detects the legacy WSL bash.exe launcher from %SystemRoot% instead of assuming C:\Windows (#9501 by @​petrroll).

[1.3.0] - 2026-10-15

Added

  • SqliteStorage.open(database, { prefix }) can namespace every table and index; openNodeSqliteStorage() and openDurableObjectSqliteStorage() forward it, for databases shared with host tables.

Changed

  • Cloudflare Durable Object SQLite adapters created for the same storage object now coordinate their operations, allowing multiple Pi storages to safely share one Durable Object database.

... (truncated)

Commits
  • 4a08025 Release v1.4.0
  • f76b248 docs(ai,tui,coding-agent): audit changelogs since v1.3.0
  • cae9fd2 Revert "feat(durable): replicate storages as a commit log"
  • 4c25119 feat(durable): replicate storages as a commit log
  • 04a93ba fix(ai,agent,coding-agent,durable): client identity follow-ups
  • adc5fa9 feat(ai,agent,coding-agent): move client identity and provider attribution in...
  • 16f5f0a feat(durable): IndexedDbStorage, a browser storage backed by IndexedDB (@​eare...
  • 61060dd fix(coding-agent): resolve Windows shells from installation directories
  • 5c1736f feat: checkpointWhen is required on Durable document definitions
  • 2ec55d8 feat: Durable and pi-ai telemetry; Context.telemetry is always a span
  • Additional commits viewable in compare view

Dependabot compatibility score

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

Bumps [@earendil-works/pi-durable](https://github.com/earendil-works/pi/tree/HEAD/packages/durable) from 1.1.0 to 1.4.0.
- [Release notes](https://github.com/earendil-works/pi/releases)
- [Changelog](https://github.com/earendil-works/pi/blob/main/packages/durable/CHANGELOG.md)
- [Commits](https://github.com/earendil-works/pi/commits/v1.4.0/packages/durable)

---
updated-dependencies:
- dependency-name: "@earendil-works/pi-durable"
  dependency-version: 1.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Updates project dependencies or actions javascript Pull requests that update javascript code labels Oct 27, 2026
@powerfooI
powerfooI merged commit 0476112 into main Oct 27, 2026
5 checks passed
@powerfooI
powerfooI deleted the dependabot/bun/earendil-works/pi-durable-1.4.0 branch October 27, 2026 01:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Updates project dependencies or actions javascript Pull requests that update javascript code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant