Skip to content

Release 0.7.0 - #40

Merged
enowdev merged 23 commits into
mainfrom
release/v0.7.0
Nov 5, 2026
Merged

enowdev merged 23 commits into
mainfrom
release/v0.7.0

Conversation

@enowdev

@enowdev enowdev commented Nov 5, 2026

Copy link
Copy Markdown
Owner

Merges the seven finished branches and publishes 0.7.0.

Branches merged (no conflicts): feat/omp-model-api, fix/opencode2-context-limit, fix/rag-retrieve-always, fix/platform-tab-key, fix/chat-own-transcript, fix/daemon-memory-mac, fix/switch-keeps-user-default.

Version: cmd/enowx/mygo.json 0.7.0, version.String 0.7.0, and the CHANGELOG.md section the update dialog and the release notes read.

Protocol record: proto/testdata/api.txt was regenerated with go test ./proto -run API -update; the hand edit was already correct, so the regeneration changed nothing.

Fixes for main's red CI (run 41923133123) come in their own commits, each a real fix rather than a weakened test.

🤖 Generated with Claude Code

enowdev and others added 23 commits November 5, 2026 06:04
OpenCode 2 reads a model's limits from its entry under `providers`, and
assumes 200,000 context and 32,000 output for one that says none. The
provider enowX writes there carried only a name, so a session on a config
with 1,000,000 context showed its footer against 200,000 (42.7K was 21%).

Both counts go in together, as its schema requires them, with 1.x's
defaults when a model gives only one, so both forms in the file agree.

Co-Authored-By: Claude Code <noreply@anthropic.com>
OMP reads its providers and models from models.yml in its agent folder, and
names the key as a variable rather than holding it. A config's sessions now
get an agent folder of their own (PI_CODING_AGENT_DIR) holding that file, so
the user's ~/.omp/agent is neither read nor written; OMP_SKIP_SETUP keeps a
fresh folder from running its setup wizard first.

Co-Authored-By: Claude Code <noreply@anthropic.com>
Retrieval only happened when a project's Context switch was on, and its
query's embedding was never recorded: ragTokens ran only after an index,
with the tokens Index() reported, so the usage page showed an index's
calls and nothing of any prompt's search.

core/rag now tells whoever built the engine about each request to the
embedder as it happens, for an index and for a search, so both are
counted and a failed batch that still cost tokens is not lost.

The start-of-prompt hook searches every prompt of a session whose project
is indexed: the switch is no longer read and the judge is no longer asked
which parts bear on it. Consent still gates it, the four results and 6000
characters are kept, the search is bounded at 3 seconds, and a failed
embedder falls back to the index's words, marked as such, with the reason
kept in RAGStatus.ContextError and logged.

Co-Authored-By: Claude Code <noreply@anthropic.com>
The switch "Give prompts the parts that bear on them" and the judge's
use "RAG: context or not" no longer exist, so the Index tool and the
settings' project details stop offering them: turning a project on now
turns on only the memory offer, and the Index tool says every prompt
gets four parts up to 6000 characters where its agent has a
start-of-prompt hook.

A failed prompt search shows there too, from RAGStatus.ContextError.

Co-Authored-By: Claude Code <noreply@anthropic.com>
A tab created under an existing session copied its parent's lease
verbatim and never asked the app for a credential, so a Claude
Platform tab under a shell session held no agent key and the agent
printed "no API key: add one in enowX (Settings, vault, platform
anthropic)" although the vault had one.

vaultSessionEnv now takes the account, and when a tab's own agent has
a VaultPlatform and the lease holds none of that platform's key, it
asks the app for it through the same proto.VaultSession path a new
session uses (askSession), filtered to that platform's credentials.
The parent's other credentials, env and secrets are copied unchanged,
and the key lands only in the tab's agent-only channel.

The lease also records the agent it was made for, so a restart or a
switch hands it to the right agent; switchAgent, goaStartOnAgent and
the GOA pre-flight now go through restartVaultEnv, which re-asks when
another agent's key is wanted.

Co-Authored-By: Claude Code <noreply@anthropic.com>
A team's one-time re-check (teamRecheck) marked itself done only after
the last page, so a pull that timed out at ?after=869 after 3m27s started
again from seq 0 at every refresh. An open chat asks every 5 s, so the
daemon re-read the whole space, about 12 MB a request: 31.65 GB allocated
by cloudclient.(*Client).Items, 100% of Client.call's allocations.

The recheck now records the seq it reached (RecheckAt) before each page
and marks itself done only once no page follows, and a chat's refresh
within 3 s of a completed sync is answered from what that sync took.

sync.conflicts was already fixed in 83f15e8; left alone.

Co-Authored-By: Claude Code <noreply@anthropic.com>
The store read every day file into memory on the first scan and kept it:
45.6 MB of the Mac daemon's heap for 126,000 calls, when a week of
summaries needs 333 rows. Only the last two days are held as calls now
(hotDays); an older day is read from its file when a summary needs it
and summed by everything a summary splits by, a few dozen rows.

A summary's ends are read call by call, so a range cut mid-day stays
exact, and the summed days are priced by a table key, so a changed price
table sums them again. A call's ID is still remembered across days
(whereDays), so one kept again on another day counts once. Every split,
day row, budget and session badge adds up to the same figures the calls
do.

Co-Authored-By: Claude Code <noreply@anthropic.com>
The daemon's own memory is mostly one scrollback a session, and
docs/performance.md measured 5 full ones at 65 MB at 10 MiB against 10 MB
at 2 MiB: about 11 MB a full session, so 30 full sessions went from about
406 to about 76 MB. A long build's log is cut sooner; an agent's chat
isn't affected, being read from its transcript.

The doc now records the change and the three fixes as done, with what was
measured and what is estimated: the scrollback number is from the
scenario, the cloud pull and token store ones from the owner's Mac
profile, not from a build of this branch.

Co-Authored-By: Claude Code <noreply@anthropic.com>
A session took the newest transcript of its folder that changed after it
was created. A new session spawned where an older one is at work so took
that one's whole conversation, then kept its id, so resuming went on with
it too. Claims on files didn't help: they are in memory, and first come.

Being recently changed says nothing of whose a file is, so now: a session's
own folder when it has one; a conversation known by id is that file alone
(Claude Code's SessionStart names it, even before writing it); otherwise one
that began after the session and no other session is on. The chat, resume,
fork, transfer, handoffs and the model watcher all go by this.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
enowX typed /model and /effort into a running session. Claude Code 2.1.318
saves both in ~/.claude/settings.json as the default for new sessions, so
switching one worker changed every later session's model.

A new daemon method, session.settings, changes a session's model and effort
by starting its agent again on its conversation with its flags, for agents
whose commands save (Settings.SavesDefaults: Claude Code, Codex). Claude
Platform's commands hold for its session, so it is still typed to. switch,
the chat's composer, goa delegate and the board's Change model all use it,
and Route.Switch no longer offers those commands.

A restart is refused while the agent is at work or asking, when stopping
would lose what it runs, and on a config, which decides its model. The
transcript is read from where it stood at the switch, as it goes on naming
the old model until the next answer. The permission mode isn't affected:
Shift+Tab doesn't write the settings file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude Platform, Project Docs, the community library at ui.enowx.ai,
Claude Code always in bypass, RAG retrieval on every prompt, 2 MiB of
scrollback and the memory work, a session's model switched on its own
conversation, and the seven finished branches.

Co-Authored-By: Claude Code <noreply@anthropic.com>
TestPlatformE2E looked for the agent's program, the sleep a tool ran, and
the key on any command line by reading /proc, which macOS doesn't have, so
its InterruptMidTool, HibernateWakeAndKill, MCP and SystemPrompt parts
waited 20 seconds for a process they could never see. They go through
core/procstat, which reads ps's processes on macOS and /proc on Linux.

Co-Authored-By: Claude Code <noreply@anthropic.com>
fix/chat-own-transcript replaced transcript.FindIn with Find (an agent's
default folder) and Stored (a session's own folder), and daemon/transcript.go
reads one then the other. The package's test still called FindIn, so
core/transcript didn't build and every job of the release's CI failed there.
The test now asks the same two questions, so it still checks both places.

Co-Authored-By: Claude Code <noreply@anthropic.com>
The test asserted that the first of two refreshes read the space, but the
sync loop's own pull can end within pullEvery of it and answer both from
what it took, so it read nothing and failed. It now asks again, past
pullEvery, until a refresh really reads the space, then checks that the one
right after it is answered from that read. What it asserts is unchanged:
consecutive refreshes of one chat cost one read.

Co-Authored-By: Claude Code <noreply@anthropic.com>
A session's turn ending now moves its task to turn-ended on the board
(goaWorkerChanged), so the task the test added as working was no longer a
task under way when hibernate() looked, and the session hibernated. The test
waits for that move, then puts the task back as working, as one just typed
into a session still saying done, and checks hibernation stays off it.

Co-Authored-By: Claude Code <noreply@anthropic.com>
The check that hibernation stayed off could pass because the session still
read as active rather than because of the task, so the test now also asks
the plan to name that task. What it asserts is unchanged.

Co-Authored-By: Claude Code <noreply@anthropic.com>
@enowdev
enowdev deleted the release/v0.7.0 branch November 5, 2026 04:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant