Skip to content

Releases: bbesner/pocket-code

1.94.0 / build 187

Choose a tag to compare

@bbesner bbesner released this 04 Nov 17:01
4c36376

Pin and unpin in one click. Every conversation in the list now has a pin beside its ⋯ button: faint gray on an unpinned conversation (click it to pin) and orange on a pinned one (click it to unpin); clicking the pin does not open the conversation. Pin conversation is now the first choice in Conversation options. The row's separate pin mark is gone (the button shows the state). Frontend only: no server, data or settings migration. Requested by Damon.

1.93.0 / build 186

Choose a tag to compare

@bbesner bbesner released this 03 Nov 17:54
7b41941

Finding a secret and answering the Vault is easier: newest-first list with search and a New mark, links that open one secret, a one-sentence request with an orange Allow once and Deny, notification body tap opens the request, a failed notification Allow says why. Requested by Damon. PR #224.

1.92.0 / build 185

Choose a tag to compare

@bbesner bbesner released this 02 Nov 16:19
ae8897c

Requested by Brad: a measurement of four weeks of his Claude Code use found that long conversations, not the models' own writing, used most of his plan (65% of the cost came from requests made after a conversation passed 200K tokens), and that subagents ran on the same model as the conversation that started them. He asked for a context limit and a subagent policy in Pocket itself, for every agent, with a choice of how and when to compact. This release is phase 1 of the spec.

  • Policy. context-policy.mjs checks and reads contextPolicy (compaction.mode agent | limit, compaction.limit 50K–1M; workers.model default | tier-down; workers.effort) and turns it into each engine's launch options. The default changes nothing, and saving the default stores null.
  • Claude Code. spawnRunner adds env to --settings: CLAUDE_CODE_AUTO_COMPACT_WINDOW, CLAUDE_CODE_SUBAGENT_MODEL (opus under Fable or Mythos, sonnet under Opus) and CLAUDE_CODE_SUBAGENT_EFFORT. --settings outranks ~/.claude/settings.json env; this was verified on 2.1.316 (a 150K window in /context, and a subagent on Sonnet 5.5 at low effort while settings.json said opus). The leader is the turn's model, then Pocket's default, then the CLI's. Runner markers record policyKey, and a reused process whose policy changed is replaced (context policy changed) unless it is running background jobs.
  • Codex. thread/start, thread/resume and thread/fork carry config: model_auto_compact_token_limit (85% of the limit), agents.default_subagent_model (the newest GPT Sol under GPT Astra, codexNewestSol) and agents.default_subagent_reasoning_effort. The leader is the turn's model, else config.toml's model (codexDefaultModel). A session opened with another policy is reopened. This was verified on 0.166.0: a sub-agent with no model ran gpt-6.1-sol at low.
  • Engines. The contextPolicy feature is true for Claude and Codex and false for OpenRouter: OpenCode's compaction has no token limit, so that comes in phase 2.
  • Settings. Agents & instance → Context and subagents: Compact conversations, Subagent model, Subagent effort, and a note saying which agents it applies to. Saving restarts idle processes.
  • Tests: context-policy.test.mjs (defaults, tiers, launch options, validation; over HTTP, the settings round trip, the Claude --settings env before and after a change, a Fable leader, a Codex default leader from config.toml, and clearing). fake-claude records settingsEnv, and fake-codex records each thread's config and model.

1.91.1 / build 184

Choose a tag to compare

@bbesner bbesner released this 31 Oct 19:39
579d891

Inbox Watch set up with Codex uses the newest models: the judge runs the newest GPT Sol the installed Codex lists (GPT-6.1 Sol today), and reading mail the newest GPT Luna. A Codex too old for GPT-6.1 Sol keeps GPT-6 Sol. Watchers already set up keep their models. See CHANGELOG.md.

1.91.0 / build 184

Choose a tag to compare

@bbesner bbesner released this 31 Oct 14:13
a053a30

Only the newest model versions are shown, and new ones appear by themselves. Codex lists GPT-6.1 Sol instead of GPT-6 Sol, and Default says GPT-6.1 Sol. Claude lists the newest Fable, Opus, Sonnet and Haiku. A conversation, saved prompt or Pocket default that names an older version runs the newest one. Pocket reads Anthropic's model list daily with Claude Code's sign-in, so a new Claude model joins the menu without a Pocket update. See CHANGELOG.md.

1.90.0

Choose a tag to compare

@bbesner bbesner released this 31 Oct 12:26
d29c147

Inbox Watch learns from what you put on your list, and no longer says you added something a Gmail filter labelled. An email that arrives already carrying the Pocket Inbox label (because one of your Gmail filters adds it) now reads Your Gmail filter put this on your list, not You added this. When you label an email yourself, the watcher notes what it had done with it (ignored it, kept it for the digest, skipped it as routine) and turns that into a short rule, as narrow as the examples allow: one email teaches it about that sender and topic, several of a kind teach it the kind. Not useful works the same way in the other direction, and the rules it has learned are merged, widened or dropped as you go on. They sit at the end of your rules under Learned from your choices, where you can edit or delete any of them, and the quick first pass now reads the whole rules file. Reported by Brad.

1.89.2 / build 183

Choose a tag to compare

@bbesner bbesner released this 30 Oct 03:19
d022005

Switching Claude accounts no longer makes you wait or start over. A message you send to a conversation whose background job (a build, a watcher) still holds the earlier sign-in now waits in its queue and sends by itself, on the new account, as soon as the job finishes. Stop background jobs and send now beside it skips the wait, and the Queue shows what it is waiting for. Reported by Brad.

See CHANGELOG.md for details.

1.89.1 / build 182

Choose a tag to compare

@bbesner bbesner released this 30 Oct 02:55
fe6fe80

Switching Claude accounts no longer leaves a conversation stuck. When you sign in with another account, a conversation with a background job still running (a test run, a watcher) keeps the earlier sign-in so the job is not cut off, and Pocket refused your messages there until the job ended, which for a watcher could be never. The Not sent card now names the job and offers Stop background jobs and send, which ends the job and continues the conversation on the new account. And Retry same message now really asks again: a refused message used to get the same refusal back without checking, even after the reason had gone. Reported by Brad.

See CHANGELOG.md for details.

1.89.0 / build 181

Choose a tag to compare

@bbesner bbesner released this 30 Oct 01:56
406848a

Casey's second review: 24 fixes and six security advisories (GHSA-7x69-vwp4-vmqq, GHSA-m899-2j2c-4m7f, GHSA-rwg5-2r2c-c2mh, GHSA-pcmm-3r32-jg6p, GHSA-vvfj-fq67-gmr3, GHSA-j8pf-7jw9-g68r). New optional setting POCKET_TRUSTED_PROXY=1 for tunnel installs without Cloudflare Access. Details: CHANGELOG.md 1.89.0.

1.88.1 / build 180

Choose a tag to compare

@bbesner bbesner released this 29 Oct 16:00
dd93e6f

Reported by Brad: sessions with reply cards waiting (the "Phone agents tunnel probe failures" and Douglas Immler Inbox Watch alerts) were not in the Attention tab.

  • Response ready survives the CLI's exit write. When its process exits, the Claude CLI appends untimestamped bookkeeping lines (cost-state, last-prompt, sometimes ai-title, atis-latch, mode) to the transcript. Pocket closes a process after POCKET_IDLE_CLOSE_MS (one hour) or, under POCKET_MAX_PROCESSES (8), as soon as another conversation starts: at 15:29 a burst of Inbox Watch alerts closed df09b314 11 s and e7774d1f 25 s after their replies. sessionState dropped any outcome older than the transcript's mtime by more than 5 s, and the watcher flagged the write as Activity elsewhere, so an unopened reply became Recent and left Attention. Every message line carries a timestamp; bookkeeping lines carry none. quietSinceOwned now asks foreignTurns (the check runner reuse already trusts) whether any user or assistant line follows our last turn's recorded size, cached per mtime; if none, the outcome stands and the watcher ignores the write. A turn from a terminal or code-server still replaces it.
  • Migration: none. Outcomes in session-meta.json that were hidden this way come back: on this install 492 rows return to Response ready, 11 of them unread and in the list (Oct 24 onward), which show in Attention once; Mark all reviewed clears them.
  • Tests: test/fake-claude.mjs appends cost-state/last-prompt when its input closes, like the CLI. test/review-fixes.test.mjs closes a finished session through the process cap, moves its mtime a minute on, and expects Response ready in the list and the conversation (not Activity elsewhere), then a terminal user line ends it; fails on 1.88.0 with observed. test/session-state.test.mjs covers quietSince.