Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
427 commits
Select commit Hold shift + click to select a range
5ecb7f6
fix(ai-harness): give the log view back when a session fails to open
AlemTuzlak Oct 1, 2026
ae1d023
feat(ai-harness): sessions that share one log
AlemTuzlak Oct 1, 2026
2bff4d3
feat(ai-persistence): a LeaseStore type and the stores.leases key
AlemTuzlak Oct 1, 2026
96d33e9
fix(ai-harness): a host with reduce fits every HarnessHost parameter
AlemTuzlak Oct 1, 2026
36e4c0d
refactor(ai-harness): repairTranscript takes the pending tool calls
AlemTuzlak Oct 1, 2026
fc035aa
feat(ai-harness): turn leases from a host lease store
AlemTuzlak Oct 1, 2026
627776c
fix(ai-harness): release the turn lease before the turn ends
AlemTuzlak Oct 1, 2026
562f88a
feat(examples): harness CLI on Cloudflare
AlemTuzlak Oct 1, 2026
7770101
feat(ai-harness): keep started tool calls in the log
AlemTuzlak Oct 1, 2026
a7f2388
feat(ai-harness): types for the turn hooks
AlemTuzlak Oct 1, 2026
ce14a53
feat(ai-harness): a recover hook for durable inputs
AlemTuzlak Oct 1, 2026
efc4e59
feat(ai-harness): retryTransientErrors and isTransientModelError
AlemTuzlak Oct 1, 2026
467e77a
feat(ai-harness): retry a failed model call in the same turn
AlemTuzlak Oct 1, 2026
7b64428
fix(ai-harness): retry keeps the resume, the steer, and the earlier text
AlemTuzlak Oct 1, 2026
ab68c7b
feat(ai-harness): a beforeFinish hook that keeps the turn going
AlemTuzlak Oct 1, 2026
f049329
fix(ai-harness): a cancelled turn adds nothing from beforeFinish
AlemTuzlak Oct 1, 2026
2d49b76
docs(harness): turn control, shared logs, leases, recover, and the re…
AlemTuzlak Oct 1, 2026
9dfe29d
feat(ai-harness): stop a join at an aborted or refused steer
AlemTuzlak Oct 1, 2026
9b60dba
test(e2e): a retried 503 and a beforeFinish turn over the harness pro…
AlemTuzlak Oct 1, 2026
5d3b406
feat(ai-harness): an onJoin hook for joined inputs
AlemTuzlak Oct 1, 2026
e6cb8af
fix(ai-harness): recovery settles a cancelled input that never ran
AlemTuzlak Oct 1, 2026
8c9e2d3
chore: changeset for the generic harness host features
AlemTuzlak Oct 1, 2026
7b15764
fix(ai-harness): a join claims its steers, and a late cancel is refused
AlemTuzlak Oct 1, 2026
8e3c4d9
test(ai-harness): a join stops at a steer cancelled while canJoin runs
AlemTuzlak Oct 1, 2026
a89b522
Merge origin/feat/harness-p14-mcp-server into feat/harness-host-generic
AlemTuzlak Oct 1, 2026
40bce96
fix(ai-harness): fail a background agent that a stopped host left run…
AlemTuzlak Oct 2, 2026
ce2c04c
fix(ai-claude-code): count cache tokens in promptTokens
AlemTuzlak Oct 2, 2026
2e4184a
fix(ai-bedrock): count cache tokens in promptTokens
AlemTuzlak Oct 2, 2026
583d78c
fix(ai-anthropic): count cache tokens in promptTokens
AlemTuzlak Oct 2, 2026
52ea90b
fix(ai-openrouter): report cache-read tokens on the Responses adapter
AlemTuzlak Oct 2, 2026
24f899c
feat(ai): add the promptCache option to chat()
AlemTuzlak Oct 2, 2026
121ae82
feat(ai-bedrock): add automatic cache points for Claude models
AlemTuzlak Oct 2, 2026
c548cb4
feat(ai-openai): send prompt cache fields on Responses and Chat Compl…
AlemTuzlak Oct 2, 2026
608636c
feat(ai-mistral): send the prompt cache key and report cache reads
AlemTuzlak Oct 2, 2026
988d887
feat(ai-harness): cache prompts in every session by default
AlemTuzlak Oct 2, 2026
d4c8a3e
feat(ai-openrouter): add automatic cache markers for Claude models
AlemTuzlak Oct 2, 2026
574daab
feat(ai-anthropic): add automatic prompt cache markers
AlemTuzlak Oct 2, 2026
d067f6c
test(ai-cloudflare): prove the binding passes prompt cache fields thr…
AlemTuzlak Oct 2, 2026
819d221
feat(ai-openai): apply prompt cache rules to openaiCompatible
AlemTuzlak Oct 2, 2026
cc0db80
docs: add the prompt caching guide
AlemTuzlak Oct 2, 2026
efd2a18
test(e2e): check the prompt cache fields on the wire
AlemTuzlak Oct 2, 2026
41e8abb
chore: add the prompt caching changeset
AlemTuzlak Oct 2, 2026
b6a7500
Merge remote-tracking branch 'origin/feat/harness-p14-mcp-server' int…
AlemTuzlak Oct 2, 2026
79a8b37
Merge origin/main into feat/harness-p14-mcp-server
AlemTuzlak Oct 2, 2026
a501c7b
feat(ai, ai-harness): route a harness turn to root agents
AlemTuzlak Oct 2, 2026
5001eca
feat(ai): add the ModelMessage block order map and its helpers
AlemTuzlak Oct 2, 2026
6ef4847
fix(ai): text after a thinking block starts a new text part
AlemTuzlak Oct 2, 2026
1241689
fix(ai-anthropic): end each thinking block in the stream
AlemTuzlak Oct 2, 2026
c5beabf
test(ai-skills): cover the skill source and the failure paths of the …
AlemTuzlak Oct 2, 2026
5ca1582
Merge remote-tracking branch 'origin/feat/harness-p14-mcp-server' int…
AlemTuzlak Oct 2, 2026
0bd0739
feat(ai): chat() writes blockOrder on assistant messages
AlemTuzlak Oct 2, 2026
5cc000e
fix(ai-harness): run turn hooks in a handoff, and resume a subagents.…
AlemTuzlak Oct 2, 2026
6528940
feat(ai): keep the block order between UIMessage and ModelMessage
AlemTuzlak Oct 2, 2026
6c27489
feat(ai): add mid-conversation change types and helpers
AlemTuzlak Oct 2, 2026
d3f5790
fix(ai-harness): continue an interrupted turn after a restart
AlemTuzlak Oct 2, 2026
193ec94
test(ai-skills): cover load_skill, a removed skill, and a failed watcher
AlemTuzlak Oct 2, 2026
5c4f92a
feat(ai): add the mid-conversation planner and prompt hash
AlemTuzlak Oct 2, 2026
216faf4
feat(ai-anthropic): replay assistant blocks in their block order
AlemTuzlak Oct 2, 2026
d67e2f0
feat(openai-base): send mid-conversation changes in Responses requests
AlemTuzlak Oct 2, 2026
ddc0b2c
feat(ai): send and save mid-conversation changes in chat()
AlemTuzlak Oct 2, 2026
2ae57b5
test(ai-harness): keep the block order through the log and a rebuild
AlemTuzlak Oct 2, 2026
5f39276
test(ai-harness): keep the start tools across turns, a rebuild, and a…
AlemTuzlak Oct 2, 2026
7301f2f
fix(ai-persistence): keep the stored mid-conversation record when a c…
AlemTuzlak Oct 2, 2026
d8c0165
feat(ai): send assistant wire rows in block order and join them on th…
AlemTuzlak Oct 2, 2026
723e2a5
feat(ai-openai): use mid-conversation channels on the GPT models that…
AlemTuzlak Oct 2, 2026
017ac06
feat(ai-anthropic): use mid-conversation channels on the Claude model…
AlemTuzlak Oct 2, 2026
2558e7e
chore: add changesets for block order and mid-conversation changes
AlemTuzlak Oct 2, 2026
4851601
docs(ai): explain mid-conversation changes and the kept block order
AlemTuzlak Oct 2, 2026
3eb401f
test(ai-e2e): keep the order of a client tool answer with thinking
AlemTuzlak Oct 2, 2026
589b143
test(e2e): check mid-conversation tool changes on the wire
AlemTuzlak Oct 2, 2026
87b67bc
docs(ai): say when the mid-conversation record and the Claude beta apply
AlemTuzlak Oct 2, 2026
71f2591
Merge remote-tracking branch 'origin/feat/harness-p14-mcp-server' int…
AlemTuzlak Oct 2, 2026
81f4d9e
feat(ai): let a middleware set the prompt cache of a model call
AlemTuzlak Oct 2, 2026
b28bb79
fix(openai-base): send the function call namespace back to the Respon…
AlemTuzlak Oct 2, 2026
577ef1c
feat(ai-harness): add per-turn overrides to prompt() and followUp()
AlemTuzlak Oct 2, 2026
598bada
test(e2e): check per-turn overrides on the wire
AlemTuzlak Oct 2, 2026
328ee92
fix(ai-harness): take the same reasoning option as chat()
AlemTuzlak Oct 2, 2026
ceea3a4
docs: per-turn overrides, harness reasoning, and the cache in onConfig
AlemTuzlak Oct 2, 2026
a8b8d2d
chore: add the turn overrides changeset
AlemTuzlak Oct 2, 2026
75c87cd
feat(ai-mcp): fill missing schema fields and freeze tool annotations
AlemTuzlak Oct 3, 2026
347f692
feat(ai-mcp): add toolName to set the MCP tool names the model sees
AlemTuzlak Oct 3, 2026
eac67f2
feat(ai, ai-harness): add LogRecordsCapability and provide it on a du…
AlemTuzlak Oct 3, 2026
e9a713a
feat(ai-mcp): add requestOptions for MCP request timeouts
AlemTuzlak Oct 3, 2026
a5c8616
feat(ai-mcp): accept a strict list of tool names in toolFilter
AlemTuzlak Oct 3, 2026
f80e249
feat(ai-compaction): count tokens with the reported usage
AlemTuzlak Oct 3, 2026
1e89faf
test(ai-harness): check compaction-style records from a middleware
AlemTuzlak Oct 3, 2026
ccdef92
docs(ai-mcp): document toolName, requestOptions, and the toolFilter list
AlemTuzlak Oct 3, 2026
29694fc
test(e2e): check the MCP tool options on the wire
AlemTuzlak Oct 3, 2026
9f90723
feat(ai-compaction): add compactNext and the auto option
AlemTuzlak Oct 3, 2026
18314ec
feat(ai-compaction): report the reason, usage, and errors of a compac…
AlemTuzlak Oct 3, 2026
bca797c
feat(ai-compaction): durable compaction records and the after-turn check
AlemTuzlak Oct 3, 2026
2443f0c
feat(ai-compaction): turn cut, summary merge, and conversationSummarizer
AlemTuzlak Oct 4, 2026
2e7b5dd
fix(ai-harness): commit the engine list with log records from a middl…
AlemTuzlak Oct 4, 2026
eb034cb
test(e2e): check durable compaction in a harness session
AlemTuzlak Oct 4, 2026
a05e8c4
docs(ai-compaction): document usage counts, compactNext, durable comp…
AlemTuzlak Oct 4, 2026
6735e83
fix(ai): fakeText modalities, parentRunId, and unique tool call ids
AlemTuzlak Oct 5, 2026
0dd064b
feat(ai): let a tool that asks for input set the interrupt reason
AlemTuzlak Oct 5, 2026
5d6ba16
feat(ai-harness): per-input sender and context, useChat on POST run, …
AlemTuzlak Oct 5, 2026
6636a8f
fix(ai-mcp): keep the connector sign-in per sender
AlemTuzlak Oct 5, 2026
802377e
feat(ai-harness-cli): runCli takes a host and a principal
AlemTuzlak Oct 5, 2026
79e523a
test(e2e): check the harness run route, inputs, and a reloaded ChatCl…
AlemTuzlak Oct 5, 2026
3061750
docs(ai-harness): shared threads, useChat on POST run, client tools, …
AlemTuzlak Oct 5, 2026
c9f8e5f
chore: add changesets for the harness report fixes
AlemTuzlak Oct 5, 2026
fdb6d75
fix(ai): preserve replay and adapter behavior across saved turns
AlemTuzlak Oct 5, 2026
fdaeabe
Merge branch 'main' into feat/harness-p14-mcp-server
AlemTuzlak Oct 5, 2026
4c12b1e
fix(ai-harness): pass the parent run of a queued resume turn
AlemTuzlak Oct 5, 2026
01a42c2
ci: apply automated fixes
autofix-ci[bot] Oct 5, 2026
af7274d
fix(ai-compaction): fail the compaction when the summary is empty
AlemTuzlak Oct 5, 2026
581efd8
fix(ai-harness): keep a host record from the last model call of a turn
AlemTuzlak Oct 5, 2026
71d5e93
test(ai-mcp): count both tools/list walks in the sender isolation test
AlemTuzlak Oct 5, 2026
e677b75
fix(ai-harness): do not offer an interrupt again after its tool ran
AlemTuzlak Oct 5, 2026
343c8fb
feat(ai): add a durable step to the agent run context
AlemTuzlak Oct 5, 2026
bce32d6
feat(ai-harness): usage totals, resumable agents, thread settings, fo…
AlemTuzlak Oct 5, 2026
7e591a7
test(e2e): check usage, settings, reset, fork, and a resumable agent
AlemTuzlak Oct 5, 2026
20b7a86
docs(ai-harness): usage, fork and reset, thread settings, and resumab…
AlemTuzlak Oct 5, 2026
6f3ea4a
chore: add changesets for usage, settings, fork, reset, and resumable…
AlemTuzlak Oct 5, 2026
bf329d5
fix(ai): run a tool with no input or null arguments as {} again
AlemTuzlak Oct 5, 2026
c1e9fda
fix(ai): record no execute_tool span for a client tool
AlemTuzlak Oct 5, 2026
f02f0dd
test(e2e): keep two scenarios true under the final tool input check
AlemTuzlak Oct 5, 2026
f07b75e
test(e2e): count only this turn's tool results in the tools-test adapter
AlemTuzlak Oct 5, 2026
8092599
test: expect no input and null tool arguments to run as {} in adapter…
AlemTuzlak Oct 5, 2026
15868e6
test(ai-compaction): cover part text in the summary prompt and after-…
AlemTuzlak Oct 5, 2026
432bc5d
feat(ai, ai-harness, ai-persistence): add the first opencode primitives
AlemTuzlak Oct 6, 2026
35965d9
feat(ai-harness): add the status feed, child sessions, and coding too…
AlemTuzlak Oct 6, 2026
661c193
Merge branch 'main' into feat/harness-p14-mcp-server
AlemTuzlak Oct 6, 2026
6767029
feat: take a model's reasoning data from the adapter config
AlemTuzlak Oct 6, 2026
d4cab6f
feat(ai-harness, ai-persistence): finish the coding tools and the har…
AlemTuzlak Oct 6, 2026
b24c0b6
feat(ai-models): price tiers and 1-hour cache writes, no Claude on go…
AlemTuzlak Oct 6, 2026
f317047
Merge branch 'main' into feat/harness-p14-mcp-server
AlemTuzlak Oct 6, 2026
d26ce8f
feat(openai-base): replay Responses answer items with their id and phase
AlemTuzlak Oct 6, 2026
c0d7bfe
docs: reasoning from the adapter config, catalog adapters, and cost r…
AlemTuzlak Oct 6, 2026
280263d
test(e2e): expect the failed-message mark on a chunk before RUN_ERROR
AlemTuzlak Oct 6, 2026
1a6241d
feat: send toolChoice from every provider, and add the mcp() harness …
AlemTuzlak Oct 6, 2026
1d6c666
feat(examples): add Batman-themed harness CLI
AlemTuzlak Oct 6, 2026
bf5db16
ci: apply automated fixes
autofix-ci[bot] Oct 6, 2026
b34c85f
Merge branch 'feat/harness-p14-mcp-server' of origin into the opencod…
AlemTuzlak Oct 6, 2026
e1a9b00
fix(ai-dashboard): pair again after a restart, and open a thread from…
AlemTuzlak Oct 6, 2026
8cfb1e3
fix(ai-harness): clear the oxlint errors in http, formatter, and patch
AlemTuzlak Oct 6, 2026
53fab01
fix(examples): resolve harness-cli-batman like harness-cli in the loc…
AlemTuzlak Oct 6, 2026
ef76ab6
Merge branch 'main' into feat/harness-p14-mcp-server
AlemTuzlak Oct 6, 2026
7b15388
fix(ai-anthropic): read the no-forced-tool list with any model id
AlemTuzlak Oct 6, 2026
8559ebb
test(e2e): check that toolChoice reaches the wire
AlemTuzlak Oct 6, 2026
b8ba547
docs(harness): sessions, waiting inputs, fork points, and the session…
AlemTuzlak Oct 6, 2026
ceacede
fix(ai-bedrock): send the tools with auto for none after a tool call
AlemTuzlak Oct 6, 2026
c824007
docs(harness): dashboard restarts, opening a thread, and toolExecution
AlemTuzlak Oct 6, 2026
4c9ca0c
refactor(ai-harness): one fork, through host.fork
AlemTuzlak Oct 6, 2026
4ae3164
refactor(ai-harness): count usage once, in session.usage()
AlemTuzlak Oct 6, 2026
2b0d79c
docs: toolChoice, replaceResult, and the single subagent tool
AlemTuzlak Oct 6, 2026
af46c2d
docs(harness): the coding tools, and running them in a sandbox
AlemTuzlak Oct 6, 2026
29081a6
test(e2e): sessions, waiting inputs, and approvals over HTTP
AlemTuzlak Oct 6, 2026
f75d46d
test(e2e): plan mode in a subagent, and the order of tool runs
AlemTuzlak Oct 6, 2026
222e574
docs(harness): permissions and agent profiles
AlemTuzlak Oct 6, 2026
a0eb579
feat: send the Anthropic thinking shape that the model record gives
AlemTuzlak Oct 6, 2026
57ea69f
docs, e2e: the Anthropic thinking shape from the record
AlemTuzlak Oct 6, 2026
bffca33
docs(harness): the coding agent hub, snapshots, the mcp() plugin, and…
AlemTuzlak Oct 6, 2026
25bf72f
test(e2e): the coding agent plugins
AlemTuzlak Oct 6, 2026
2128e16
docs: add the new harness pages to the nav, and use the newest models
AlemTuzlak Oct 6, 2026
ac33982
fix(ai-harness): share the rules of permissions() with other plugins
AlemTuzlak Oct 6, 2026
a521105
test(e2e): a middleware replaces a tool result
AlemTuzlak Oct 6, 2026
6656c1d
fix(ai-vercel-gateway): Gemma 4 31B reasons, as in the catalog
AlemTuzlak Oct 6, 2026
70ef41c
fix(ai-harness): clients set only exposed config and run only exposed…
AlemTuzlak Oct 6, 2026
2e3ea69
feat(ai): ctx.agents starts agents when a host binds it
claude Oct 6, 2026
618d711
test(ai-isolate-e2b): cover stderr without an out-of-memory report
AlemTuzlak Oct 6, 2026
5c5dded
feat(ai-compaction): add the background option, the background reason…
claude Oct 6, 2026
3fea32e
fix(ai-harness, ai-code-mode): code mode asks permissions() which too…
AlemTuzlak Oct 6, 2026
41baf9c
test(e2e): open a thread from a dashboard host row
AlemTuzlak Oct 6, 2026
08db374
fix(ai-mcp): the harness MCP server lists only exposed commands
AlemTuzlak Oct 6, 2026
d59df51
docs: update the dates of the pages that changed after the nav pass
AlemTuzlak Oct 6, 2026
6b42bb3
fix(ai-dashboard): an input that arrives while its thread opens waits
AlemTuzlak Oct 6, 2026
e8cedb2
fix(ai-dashboard): report a frame the host cannot handle
AlemTuzlak Oct 6, 2026
a89ff1e
feat(ai-persistence): add the WorkClaimStore contract and its memory …
claude Oct 6, 2026
065b91d
chore: changesets for the opencode primitives
AlemTuzlak Oct 6, 2026
ab9c6bb
test(e2e): continue a subagent by its sessionId
AlemTuzlak Oct 6, 2026
a24b0a7
test(e2e): the coding tools in a harness turn
AlemTuzlak Oct 6, 2026
53a84b5
Merge branch 'feat/harness-p14-mcp-server' of origin
AlemTuzlak Oct 6, 2026
57e3a52
chore: format the files of the opencode primitives with oxfmt
AlemTuzlak Oct 6, 2026
f1cc7a0
feat(ai-compaction): start a background summary past atTokens
claude Oct 6, 2026
f3f1525
feat(ai-harness): claim a busy thread in stores.workClaims
claude Oct 6, 2026
90f72d9
feat(ai-compaction): apply a ready background summary at the next run
claude Oct 6, 2026
be151e1
feat(ai-harness): keep every agent run's transcript in its own thread
claude Oct 6, 2026
f24e824
feat(ai-harness): resume the pending work of stopped hosts with host.…
claude Oct 6, 2026
66b9ba8
docs(ai-harness): resume pending work after a deploy, and the WorkCla…
claude Oct 6, 2026
f4c98f0
test(e2e): resume a stopped host's work with resumePending
claude Oct 6, 2026
9ef3b49
feat(ai-compaction): wait for a running background summary over maxTo…
claude Oct 6, 2026
2c014c0
fix: type errors and an env-dependent test found by the quality gate
AlemTuzlak Oct 7, 2026
00234bd
fix(ai-vertex): resolve the same @google/genai copy as ai-gemini
AlemTuzlak Oct 7, 2026
e6b2f78
docs(ai-compaction): prepare the summary in the background
claude Oct 7, 2026
36a5216
test(e2e): cover background compaction in the durable wire spec
claude Oct 7, 2026
fd0794d
feat(ai-harness): send follow-ups and steers to agent runs
claude Oct 7, 2026
694fa00
chore(knip): ignore the zod dev dependency of ai-vertex
AlemTuzlak Oct 7, 2026
db4b69c
feat(ai-harness): steer a running agent at its next model call
claude Oct 7, 2026
a6a13a4
chore: name the new changesets after what they change
AlemTuzlak Oct 7, 2026
b47cd0a
docs: fix the per-iteration tool recipe, and name the e2e tools file
AlemTuzlak Oct 7, 2026
96536b3
feat(ai-harness): list and find agent runs, also after a restart
claude Oct 7, 2026
9d3386b
feat(ai-harness): agent code starts agents with ctx.agents
claude Oct 7, 2026
18fd27c
feat(ai-harness): client.sendToAgent and send() on view agents
claude Oct 7, 2026
e39469c
feat(ai-harness): keep agent messages across a host stop
claude Oct 7, 2026
07ff4c7
test(e2e): steer and follow up a background agent over the protocol
claude Oct 7, 2026
02cb4ea
docs(ai-harness): message a running agent
claude Oct 7, 2026
5c400e8
chore: toolExecution goes in the harness changeset
AlemTuzlak Oct 7, 2026
25ef516
fix(ai-dashboard): keep refusals for late views, and send the remote …
AlemTuzlak Oct 7, 2026
7ca6c0c
fix(ai-bedrock): tool history with no tools, and structured output on…
AlemTuzlak Oct 7, 2026
d4f4ef8
Merge branch 'feat/harness-p14-mcp-server' into parity/work
claude Oct 7, 2026
f6fd071
docs: update the dates of the pages this work changed
claude Oct 7, 2026
1485815
feat(ai-anthropic): mid-conversation effort by default on Anthropic's…
AlemTuzlak Oct 7, 2026
d9d29d6
feat: the CLI-style adapters follow toolChoice where they can
AlemTuzlak Oct 7, 2026
f04bcac
fix(ai-harness): /undo and /redo restore only the files of the turn
AlemTuzlak Oct 7, 2026
58c175f
fix(ai-harness): links, grep, and Windows exe lookup cannot get aroun…
AlemTuzlak Oct 7, 2026
6df3c9f
fix(ai-harness): the step limit refuses tool calls, and a child keeps…
AlemTuzlak Oct 7, 2026
3d6db26
Merge branch 'main' into feat/harness-p14-mcp-server
AlemTuzlak Oct 7, 2026
9670eb6
fix(ai-harness): fork checks the harness, and a client sees what it m…
AlemTuzlak Oct 7, 2026
cfb5aaf
ci: apply automated fixes
autofix-ci[bot] Oct 7, 2026
c945aaa
test(e2e): expose the drafter's release command
claude Oct 7, 2026
ea8b578
Merge branch 'feat/harness-p14-mcp-server' into parity/work
AlemTuzlak Oct 7, 2026
361a4f6
fix(ai-mcp): timeoutMs of mcp() limits the connect step
AlemTuzlak Oct 7, 2026
c88d0a6
chore: changesets and docs dates for the review fixes
AlemTuzlak Oct 7, 2026
2669df2
Merge remote-tracking branch 'origin/feat/harness-p14-mcp-server' int…
AlemTuzlak Oct 7, 2026
161d99e
test(ai-compaction): cover the usage of a background summary
claude Oct 7, 2026
4eeacf9
docs(ai-harness): use the newest OpenAI model in the agent message sa…
claude Oct 7, 2026
a713c3f
Merge remote-tracking branch 'origin/feat/harness-p14-mcp-server' int…
AlemTuzlak Oct 7, 2026
a523ec5
fix(ai-mcp): requestOptions of createMCPClient also limit connect
AlemTuzlak Oct 7, 2026
fd86651
feat(ai-harness): recovery fixes for a durable host (Flue gaps 3, 4, …
AlemTuzlak Oct 7, 2026
381677c
Merge remote-tracking branch 'origin/feat/harness-p14-mcp-server' int…
AlemTuzlak Oct 7, 2026
252606c
feat(ai-harness): durable turn state for a host (Flue gaps 2, 7, 9, 10)
AlemTuzlak Oct 7, 2026
9699176
Merge remote-tracking branch 'origin/main' into HEAD
AlemTuzlak Oct 7, 2026
8428ad3
Merge remote-tracking branch 'origin/main' into HEAD
AlemTuzlak Oct 7, 2026
fec8c26
feat(ai): add wrapFetch to chat(), onConfig, and TextOptions
claude Oct 7, 2026
59efba9
feat(ai-harness): list and forget saved permission rules
claude Oct 7, 2026
d4ffcd4
feat(ai-harness): continue a partial answer after a model error
claude Oct 7, 2026
afaf034
feat(ai-harness): questions with a url, and MCP elicitation as sessio…
claude Oct 7, 2026
e4670a9
feat(adapters): send model requests through wrapFetch in SDK adapters
claude Oct 7, 2026
82d78e1
feat(ai-harness): search and filter the session list
claude Oct 7, 2026
cf4a345
feat(openai-base): send model calls through wrapFetch
claude Oct 7, 2026
26a9da9
feat(ai-harness): tell the model when the working folder changes
claude Oct 7, 2026
c072e55
feat(ai-harness): cut-off answers and tool batches after a crash (Flu…
AlemTuzlak Oct 7, 2026
1002025
Merge remote-tracking branch 'origin/main' into HEAD
AlemTuzlak Oct 7, 2026
94735c1
docs(ai-harness): the durable-host recovery options
AlemTuzlak Oct 7, 2026
67071a1
feat(compaction): native provider compaction
claude Oct 7, 2026
9cb8534
feat(openai-base): wire support for GitHub Copilot and the ChatGPT plan
claude Oct 7, 2026
3752e64
feat(ai-harness): revert a session to any message, saved, with unrevert
claude Oct 7, 2026
b3d072c
test(e2e): continue, a recoverable close with continueCutOff, and eph…
AlemTuzlak Oct 7, 2026
cdd1147
feat(ai-harness): reload plugins and change agents while a session runs
claude Oct 7, 2026
27ad058
fix(ai): never run or ask for a tool call of an answer cut at the out…
AlemTuzlak Oct 7, 2026
5f46b05
Merge remote-tracking branch 'origin/main' into HEAD
AlemTuzlak Oct 7, 2026
7c65d01
feat(ai-harness): move a running tool call to the background
claude Oct 7, 2026
3768770
Merge remote-tracking branch 'origin/feat/harness-p14-mcp-server' int…
AlemTuzlak Oct 7, 2026
8bec360
Merge commit '7c65d0157' into worktree-graceful-bouncing-castle
AlemTuzlak Oct 7, 2026
4d3bf22
fix(ai-compaction): native compaction falls back to the strategy
AlemTuzlak Oct 7, 2026
d35fb06
docs: dates of the pages that the fork-readiness batch changed
AlemTuzlak Oct 7, 2026
d5a3cc8
Merge remote-tracking branch 'origin/feat/harness-p14-mcp-server' int…
AlemTuzlak Oct 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
20 changes: 20 additions & 0 deletions .changeset/adapter-reasoning-config.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
---
'@tanstack/ai': minor
'@tanstack/ai-anthropic': minor
'@tanstack/ai-openai': minor
'@tanstack/ai-gemini': minor
'@tanstack/ai-bedrock': minor
'@tanstack/ai-mistral': minor
'@tanstack/ai-cloudflare': minor
'@tanstack/ai-models': minor
---

Give an adapter the model's reasoning data in its config. A model id that is not in the adapter's own list (a gateway id, a new model, or a catalog id) got no reasoning field before. Now `reasoning?: ModelReasoning` in the config wins over the adapter's table, for the request fields and for the levels that `chat({ reasoning })` takes. `false` sends no reasoning field. Without it, nothing changes.

The factories take any model id string: `anthropicText`, `createAnthropicChat`, `anthropicVertexText`, `openaiText`, `createOpenaiChat`, `azureOpenaiText`, `geminiText`, `createGeminiChat`, `createBedrockConverse`, `mistralText`, `createMistralText`, `cloudflareText`, and `createCloudflareText`. A misspelled id is no longer a type error.

`@tanstack/ai-models` adds `modelReasoning(record)`, which turns a catalog record into the config value:

```ts
createAnthropicChat(record.id, apiKey, { reasoning: modelReasoning(record) })
```
5 changes: 5 additions & 0 deletions .changeset/ai-models-catalog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@tanstack/ai-models': minor
---

New package: a runtime catalog of 1,932 models across 38 providers, generated from models.dev and the OpenRouter and Vercel AI Gateway model lists. `getProviders`, `getModels`, and `getModel` return each model's id, input modalities, context window, output limit, prices, reasoning levels, and request quirks (`compat`). `supportedReasoningLevels`, `clampReasoningLevel`, and `modelCost` work on a record, and `generatedAt` is the time of the data. Each provider also has its own subpath, for example `@tanstack/ai-models/deepseek`.
5 changes: 5 additions & 0 deletions .changeset/ai-models-no-vertex-claude.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@tanstack/ai-models': patch
---

Leave the Claude models out of the `google-vertex` catalog. They had the Gemini wire (`api: 'google-vertex'`), which the Gemini adapter cannot call. Use `anthropicVertexText` from `@tanstack/ai-anthropic/vertex` for Claude on Vertex.
5 changes: 5 additions & 0 deletions .changeset/ai-null-tool-input.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@tanstack/ai': patch
---

Run a tool again when the model sends no input or a literal `null` for a tool with no required fields (an empty tool_use block, issue #265). The final tool input check rejected these, so the tool did not run. Now no input is `{}`, and a `null` that the schema rejects is checked as `{}`. Other values must still fit the schema.
16 changes: 16 additions & 0 deletions .changeset/anthropic-thinking-shape.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
'@tanstack/ai': minor
'@tanstack/ai-anthropic': minor
'@tanstack/ai-models': minor
'@tanstack/ai-vercel-gateway': patch
---

Send the Anthropic thinking shape that the model record gives.

- `ModelReasoning.adaptive`: `true` sends adaptive thinking with the effort, `false` sends budget thinking. Without it, the adapter picks from the model id, as before. Adaptive thinking without a level map now sends pi's default effort (`minimal` and `low` give `low`, `medium` gives `medium`, the rest give `high`).
- `ModelReasoning.midConversationEffort`: the level goes into the messages as an effort `system` message, with `block_binding`, a fixed `output_config.effort: 'high'`, and the `mid-conversation-output-config-2026-07-01` and `thinking-binding-controls-2026-08-01` betas. Each answer keeps its level in `metadata.tanstack.reasoningEffort`, so a level change keeps the cached start. On Anthropic's own API, `anthropicText` and `createAnthropicChat` turn it on for `claude-fable-5-1`, `claude-opus-5`, and `claude-opus-5-5` without a `reasoning` config. A custom `baseURL`, `fetch`, client, or `ANTHROPIC_BASE_URL` turns that default off.
- `midConversationChannels` takes `{ tools?: boolean; systemPrompts?: boolean }` to turn on one channel only.

`modelReasoning(record)` sets `adaptive` from `compat.forceAdaptiveThinking` and `midConversationEffort` from the new `compat.supportsMidConvoEffort` for `anthropic-messages` records. The catalog flags now equal pi's: Claude 4.6 and later think adaptively on every provider (also with dot ids such as `anthropic/claude-opus-4.7`), and the other Vercel AI Gateway models think with a budget.

Vercel `google/gemma-4-31b-it` reasons, in the catalog and in `@tanstack/ai-vercel-gateway`. Vercel's own model list tags it `reasoning`. Seven Fireworks records take Fireworks' own effort levels.
12 changes: 12 additions & 0 deletions .changeset/block-order.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
'@tanstack/ai': minor
'@tanstack/ai-anthropic': minor
---

Keep the order of Claude's thinking, text, and tool calls in one answer.

- Claude can answer with thinking, a tool call, more thinking, and another tool call. The stream, the stored messages, the client wire, and the next request to Claude keep that order.
- `ModelMessage` has a new optional `blockOrder` field. The library writes it only when the order is not the default (thinking, then text, then tool calls), so a message in the default order does not change. `orderedAssistantBlocks(message)` gives adapter authors the blocks in order.
- Each Claude thinking block ends with its own `REASONING_MESSAGE_END` and `REASONING_END`.
- Text after a second thinking block starts a new text part.
- On the client wire, an answer in another order goes out as ordered rows. A row that exists only for the order has `metadata.tanstack.continues`, and the server joins it back into one message. A `UIMessage` that holds two model calls with a tool result between them reaches the server as assistant, tool, assistant, for every adapter.
9 changes: 9 additions & 0 deletions .changeset/cloudflare-binding-fetch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
'@tanstack/ai-cloudflare': minor
---

Add `cloudflareBindingFetch({ binding, vendor, gateway })`. It sends the requests of the Anthropic and OpenAI text adapters (`createAnthropicChat`, `createOpenaiChat`) through the Workers AI binding (`env.AI.run`) to the AI Gateway `anthropic/...` and `openai/...` models, so a Worker can use Claude and GPT with no provider key.

- `vendor: 'anthropic'` carries Anthropic Messages requests, and `vendor: 'openai'` carries OpenAI Responses requests.
- The request body goes to `env.AI.run('<vendor>/<model>', body)`. Headers such as `anthropic-beta` go along as `extraHeaders`, and the SDK's auth and transport headers are dropped.
- A Cloudflare error body is rewrapped so the SDK reports its message.
11 changes: 11 additions & 0 deletions .changeset/compaction-background.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
'@tanstack/ai-compaction': minor
---

Prepare a compaction summary in the background with `withCompaction({ background: { atTokens } })`.

- When the count at a model call is over `atTokens` and not over `maxTokens`, the strategy runs on a copy of the messages. The model call does not wait for it.
- The result waits in the metadata store (namespace `@tanstack/ai-compaction:background`), or in memory without one. It applies at the first model call of the next run: as a `tanstack.compaction` record on a durable host, or as the checkpoint.
- A model call over `maxTokens` while the summary runs waits for it and applies it. It compacts inline only when the list is still over `maxTokens`.
- A result whose kept message is gone, because a newer compaction cut further, is dropped. `compaction:ended` and `onCompact` report it with `stale: true`. A failed summary is reported with `error` and applies nothing.
- `CompactionReason` has a new value, `'background'`. Setup throws when `atTokens` is not below `maxTokens`.
5 changes: 5 additions & 0 deletions .changeset/compaction-empty-summary.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@tanstack/ai-compaction': patch
---

Fail a compaction when the summarizer returns an empty or whitespace-only summary. Before, `summarizeOldest` replaced the history with an empty summary, so the history was lost. Now the compaction fails like any failed strategy: the history stays, `compaction:ended` (or `onCompact` after the turn) carries the error, and no durable record is written. With `continueOnError`, the run sends the history as it is.
12 changes: 12 additions & 0 deletions .changeset/compaction-usage-and-durable.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
'@tanstack/ai-compaction': minor
---

Count with real usage, compact on demand, and keep compaction in a harness log.

- `countTokens: 'usage'` counts with the usage the provider reported for the last call, plus an estimate of the newer messages.
- `compactNext(threadId)` compacts at the next model call, for example after a context overflow. `auto: false` turns off compaction at `maxTokens` and keeps `compactNext` and the overflow check.
- With `countTokens: 'usage'` and `durable: true`, a harness turn checks once more after its last model call. When the usage passed `maxTokens` or `contextWindow`, compaction runs right away. `contextWindow` also counts with `auto: false`.
- `durable: true` writes a `tanstack.compaction` record into a harness session log. Set `project: { version, record: projectCompaction }` on the host.
- `compaction:ended` and `onCompact` report `reason`, the summary `usage`, and an `error`. `continueOnError` sends the full messages when the strategy fails.
- `summarizeOldest({ cut: 'turn' })` gives the start of a cut turn its own summary. `conversationSummarizer` writes a structured summary, updates the older summary, and takes a `details` hook.
8 changes: 8 additions & 0 deletions .changeset/context-overflow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@tanstack/ai': minor
---

Add `isContextOverflow({ error, usage, finishReason, contextWindow, provider })`. It tells you that a model call failed, or ended early, because the input did not fit in the model's context window, so you can compact the history and retry.

- It knows the overflow error messages of about 25 providers (Anthropic, OpenAI, Gemini, Bedrock, Mistral, xAI, Groq, OpenRouter, Ollama, and more), and it ignores rate-limit and throttle errors.
- With `contextWindow`, it also finds a silent overflow (the input is bigger than the window) and a length stop with no output and a full window.
5 changes: 5 additions & 0 deletions .changeset/core-provider-keys.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@tanstack/ai': minor
---

`keyedAdapter(provider, create)` wraps an adapter factory that needs a provider key, and `isKeyedAdapter` tells it apart from a plain adapter. Agents get `ctx.keys` (`get`, `require`, and `adapter`) from the new `SubagentBinding.keys`, or else from each provider's `env` names.
10 changes: 10 additions & 0 deletions .changeset/dashboard-pair-again-and-open-thread.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
'@tanstack/ai-dashboard': minor
---

The dashboard host recovers from a restart, and the page opens threads.

- **Pair again.** After a dashboard restart, a saved host token gets a `401`. With `onPairingCode`, the host pairs again and calls `onToken` with the new token. Without it, the new `onError` option gets the error. `connection.token` holds the current token.
- **`onError`** also gets an error when the host cannot handle a frame, for example when a thread cannot open. The connection stays.
- **Open a thread.** A host that sets `allowRemoteStart` gets an "Open a thread" form in its row. The host sends the flag in its hello, and for other hosts the open route answers `403` with `remote_start_disabled`. A message sent right after the open waits for the thread.
- **Refusals stay visible.** A refused input shows as "Refused:" with the reason, also in a view that you open later. A refused thread keeps its harness name in the sessions list.
9 changes: 9 additions & 0 deletions .changeset/fake-text-adapter.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
'@tanstack/ai': minor
---

Add `fakeText()` at the new `@tanstack/ai/testing` subpath: a text adapter that answers from a script, for tests of `chat()`, tools, and middleware with no network and no API key.

- Queue answers with `setResponses` and `appendResponses`. An answer is `{ text?, thinking?, toolCalls?, finishReason?, error? }`, or a function that gets `{ request, state }`. An empty queue fails with "No more fake responses queued".
- Token usage is estimated as `ceil(characters / 4)`. With `cache: true`, the part of a request that matches the thread's previous request counts as cached tokens.
- Options: `model`, `input` (the adapter's input modalities), `contextWindow`, and `tokensPerSecond` for stream pacing. The stream stops when the request aborts.
9 changes: 9 additions & 0 deletions .changeset/fake-text-fixes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
'@tanstack/ai': patch
---

Fix three problems in `fakeText` from `@tanstack/ai/testing`.

- `fakeText()` type-checks as a text adapter with `exactOptionalPropertyTypes: true`. `inputModalities` is now an optional property.
- `RUN_STARTED` carries `parentRunId` when the call has one, as real adapters do.
- Tool call ids are unique across `fakeText()` instances. The default id is now `fake-call-<fake>-<call>-<index>`.
8 changes: 8 additions & 0 deletions .changeset/fork-ready-g10-question-url.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@tanstack/ai-harness': minor
'@tanstack/ai-mcp': minor
---

A question can now have a `url`. `ctx.session.ask({ message, url })` sends the link to clients in the question event, in `snapshot().pendingQuestions`, and in the view state. The user opens the page, then answers. The session does not open the page.

`mcp()` and `mcpConnector` now ask the user when an MCP server asks for input in a tool call. A form request becomes a session question with the requested schema. A URL request becomes a question with the `url`. The answer goes back to the server. The form content is `accept`, and `{ action: 'decline' }` and `{ action: 'cancel' }` decline or cancel. The harness MCP clients now declare URL elicitation. `chat()` does not change.
6 changes: 6 additions & 0 deletions .changeset/fork-ready-g11-session-search.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'@tanstack/ai-persistence': minor
'@tanstack/ai-harness': minor
---

Search and filter the session list. `SessionIndexListOptions` has `search` (title text, without case), `harness`, and `metadata` (exact string values). The memory store and the conformance suite support them. `GET sessions` lists only the sessions of the harness of the handler, and reads the `search` and `metadata.<key>` query parameters. `listSessions` of the client sends `search` and `metadata`.
5 changes: 5 additions & 0 deletions .changeset/fork-ready-g1a-wrapfetch-core.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@tanstack/ai': minor
---

Add `wrapFetch` to `chat()`, to the middleware `onConfig` config, and to `TextOptions`. A wrapper gets the next fetch and gives back a new fetch, so it can change the HTTP request and response of a model call. The engine chains the `chat()` option and the middleware wrappers into one function. A middleware wrapper applies to one model call only. The new `FetchWrapper` type names the wrapper.
6 changes: 6 additions & 0 deletions .changeset/fork-ready-g1b-wrapfetch-openai-base.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'@tanstack/openai-base': minor
'@tanstack/ai-openai': patch
---

The Chat Completions and Responses text adapters now support `wrapFetch`. When a call sets `wrapFetch`, the adapter sends its HTTP requests through the wrapper. The client of the adapter does not change for other calls. Every adapter that builds on `@tanstack/openai-base` gets this, for example OpenAI, Azure OpenAI, Grok, Groq, and Bedrock. Without `wrapFetch`, the requests do not change.
8 changes: 8 additions & 0 deletions .changeset/fork-ready-g1c-wrapfetch-other-adapters.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@tanstack/ai-anthropic': patch
'@tanstack/ai-mistral': patch
'@tanstack/ai-ollama': patch
'@tanstack/ai-openrouter': patch
---

The Anthropic, Mistral, Ollama, and OpenRouter text adapters now send each model request through the `wrapFetch` of the call. Without `wrapFetch`, the request does not change. An Anthropic or Ollama adapter with an injected client ignores `wrapFetch`, because the adapter cannot reach the fetch of that client.
11 changes: 11 additions & 0 deletions .changeset/fork-ready-g2-native-compaction.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
'@tanstack/ai': minor
'@tanstack/ai-compaction': minor
'@tanstack/openai-base': minor
---

A text adapter can now have an optional `compact(options)` method. It sends the history to the provider's own compaction endpoint, and resolves to the history for the next calls. The options are `TextCompactOptions`: `messages`, `model`, `signal`, and `wrapFetch`.

The OpenAI Responses adapters implement `compact` with `POST /responses/compact`. The encrypted `compaction` item goes back to the same model as it is on later requests.

`withCompaction` has a new `native` option. Pass the adapter of the `chat()` call. When the adapter has `compact`, it runs in place of `strategy`. When `compact` fails, `strategy` runs. Without the option, nothing changes.
10 changes: 10 additions & 0 deletions .changeset/fork-ready-g3-provider-coverage.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
'@tanstack/openai-base': minor
'@tanstack/ai-openai': minor
---

The adapters now work with GitHub Copilot and with a ChatGPT plan token.

- The Responses adapter streams one tool call when the item id changes on each event. GitHub Copilot sends a new item id on each event of a stateless response.
- The OpenAI-compatible Chat Completions adapter reads the thinking that GitHub Copilot streams on `delta.reasoning_text`.
- The OpenAI-compatible docs list more providers and show the setup for GitHub Copilot and for a ChatGPT plan.
7 changes: 7 additions & 0 deletions .changeset/fork-ready-g4-revert.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@tanstack/ai-harness': minor
---

A session can now go back to any earlier message. `session.revert(messageId)` hides the later messages in the transcript, and `session.unrevert()` brings them back. With `snapshots()`, the files that the later tool calls changed go back too. The next prompt drops the hidden messages for good. The session saves the revert in the log, or in `stores.metadata` on a host without a log, so a restart keeps it.

Clients send the new `revert` and `unrevert` inputs with `client.revert(messageId)` and `client.unrevert()`. The harness must list `'undo'` in `expose.commands`. A `harness.revert` event tells views to read the transcript again. Each `tanstack/snapshots:step` record now has the `toolCallIds` of its step.
7 changes: 7 additions & 0 deletions .changeset/fork-ready-g5-live-reload.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@tanstack/ai-harness': minor
---

A session can now reload its plugins while it runs. `session.reload()` waits for the running turn, cleans up the session plugins, and sets them up again from `harness.plugins()`. The transcript, the log, the thread settings, and the inbox stay. Clients get a `harness.reloaded` event. If a new `setup` throws, the session keeps working with no plugins, and the promise rejects. `host.reload(harness)` reloads every open session of that harness. The `agents()` plugin reads its folders again at each reload.

Plugins can now add and remove their own agents while the session runs, with `ctx.agents.set(agent)` and `ctx.agents.delete(name)`. A name that another plugin or the harness owns throws.
8 changes: 8 additions & 0 deletions .changeset/fork-ready-g6-background-tool.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@tanstack/ai-harness': minor
'@tanstack/ai': minor
---

A user can move a running tool call to the background. Send the `background` input or call `session.background(toolCallId?)`. The call returns at once, and the job keeps running. When the job ends, the model gets its result as a note, and an idle session wakes. `bash` and the single `subagent` tool support it. A client needs no `expose` entry for it.

The tool context has a new optional `detach` field. A tool passes its work to `detach` and races the two promises to support the move.
5 changes: 5 additions & 0 deletions .changeset/fork-ready-g7-continue-partial.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@tanstack/ai-harness': minor
---

`turn.onModelError` can answer `'continue'`. The partial text of the failed call stays in the turn result and in the transcript. The next model call gets that text and a note to continue it. `ModelErrorContext` has a new `partial` flag. `retryTransientErrors()` answers `'continue'` when the failed call streamed text, and `'retry'` otherwise. The `harness.turn.retry` event has a new `continued` field.
5 changes: 5 additions & 0 deletions .changeset/fork-ready-g8-cwd-note.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@tanstack/ai-harness': patch
---

The model now hears when the working folder of a thread changes. When `session.configure()` sets a new `cwd`, or clears it with `null`, the transcript gets a short note before the next model call. The note names the new folder, or says that the default folder applies again. The same `cwd` again adds no note.
5 changes: 5 additions & 0 deletions .changeset/fork-ready-g9-saved-permissions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@tanstack/ai-harness': minor
---

`permissions()` has a `/permissions` command. It lists the saved "always" rules of the project. `/permissions forget <n>` deletes one, and the open session asks again at the next matching call. Server code can do the same with `listSavedPermissions` and `deleteSavedPermission` from `@tanstack/ai-harness/plugins`.
Loading
Loading