<feed xmlns='http://www.w3.org/2005/Atom'>
<title>pantograph.git/libpanto/src/file_system_jsonl_store.zig, branch main</title>
<subtitle>Unnamed repository; edit this file 'description' to name the repository.
</subtitle>
<id>https://code.tjp.lol/pantograph.git/atom?h=main</id>
<link rel='self' href='https://code.tjp.lol/pantograph.git/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://code.tjp.lol/pantograph.git/'/>
<updated>2026-07-07T18:15:28Z</updated>
<entry>
<title>Move libpanto projects to libpantograph dependency</title>
<updated>2026-07-07T18:15:28Z</updated>
<author>
<name>t</name>
<email>t@tjp.lol</email>
</author>
<published>2026-07-07T17:29:23Z</published>
<link rel='alternate' type='text/html' href='https://code.tjp.lol/pantograph.git/commit/?id=621d7fee0ace729f8d44126032d2c6e13f72ee7f'/>
<id>urn:sha1:621d7fee0ace729f8d44126032d2c6e13f72ee7f</id>
<content type='text'>
Remove the in-repo libpanto sources and binding projects from pantograph.
Consume libpantograph through the Zig package URL at
code.tjp.lol/libpantograph.git, including the Lua module artifact used by
CLI extensions.
</content>
</entry>
<entry>
<title>big cli/tui gaps project</title>
<updated>2026-07-05T22:23:49Z</updated>
<author>
<name>t</name>
<email>t@tjp.lol</email>
</author>
<published>2026-07-04T15:50:12Z</published>
<link rel='alternate' type='text/html' href='https://code.tjp.lol/pantograph.git/commit/?id=f759f149377942c4e04802c45162cda1c9bfb2b3'/>
<id>urn:sha1:f759f149377942c4e04802c45162cda1c9bfb2b3</id>
<content type='text'>
</content>
</entry>
<entry>
<title>libpanto ponytail-audit simplifications</title>
<updated>2026-06-23T15:34:55Z</updated>
<author>
<name>t</name>
<email>t@tjp.lol</email>
</author>
<published>2026-06-23T00:18:28Z</published>
<link rel='alternate' type='text/html' href='https://code.tjp.lol/pantograph.git/commit/?id=538a5d926fa626a00cc3dc12c555f11f82867efd'/>
<id>urn:sha1:538a5d926fa626a00cc3dc12c555f11f82867efd</id>
<content type='text'>
</content>
</entry>
<entry>
<title>preserve signature origins across compactions</title>
<updated>2026-06-18T20:16:24Z</updated>
<author>
<name>t</name>
<email>t@tjp.lol</email>
</author>
<published>2026-06-18T20:15:55Z</published>
<link rel='alternate' type='text/html' href='https://code.tjp.lol/pantograph.git/commit/?id=270cd00129551647e7c764a13836e03e0b2dc4e2'/>
<id>urn:sha1:270cd00129551647e7c764a13836e03e0b2dc4e2</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Add Codex Responses support and session debugging</title>
<updated>2026-06-15T21:08:32Z</updated>
<author>
<name>t</name>
<email>t@tjp.lol</email>
</author>
<published>2026-06-14T05:45:59Z</published>
<link rel='alternate' type='text/html' href='https://code.tjp.lol/pantograph.git/commit/?id=02b4c7a35ac0b714bc045d54fb4bb45d1ce4e490'/>
<id>urn:sha1:02b4c7a35ac0b714bc045d54fb4bb45d1ce4e490</id>
<content type='text'>
Teach provider config and auth resolution about the Codex Responses
dialect, including user-facing `style = "openai_responses"` with
`dialect = "codex"`. Serialize and parse Responses traffic with
provider-specific reasoning replay, assistant phase metadata, and robust
function-call assembly keyed by `output_index` so streamed tool inputs
survive proxy quirks and empty terminal payloads.

Also persist thinking origins and message metadata across sessions, add
the Anthropic interleaved-thinking header switch, write per-session
debug logs, and improve the TUI and scripts for inspecting tool output
and session costs.
</content>
</entry>
<entry>
<title>libpanto API fixes</title>
<updated>2026-06-11T15:23:28Z</updated>
<author>
<name>t</name>
<email>t@tjp.lol</email>
</author>
<published>2026-06-11T15:08:42Z</published>
<link rel='alternate' type='text/html' href='https://code.tjp.lol/pantograph.git/commit/?id=e2477f7d2d2a4eab870a2bd61534cfd146907915'/>
<id>urn:sha1:e2477f7d2d2a4eab870a2bd61534cfd146907915</id>
<content type='text'>
- FSJSONLStore: don't require `cwd`, instead panto CLI provides it in
  the session metadata
- Lua: expose the `SessionStore` interface and the `FSJSONLStore` and
  `NullStore` implementations
- C: use idiomatic `const char *` for incoming strings
- C: expose the `FSJSONLStore` and `NullStore` implementations
</content>
</entry>
<entry>
<title>Add addUserText helper; update all call sites</title>
<updated>2026-06-10T18:17:27Z</updated>
<author>
<name>t</name>
<email>t@tjp.lol</email>
</author>
<published>2026-06-10T16:06:07Z</published>
<link rel='alternate' type='text/html' href='https://code.tjp.lol/pantograph.git/commit/?id=bb85e867bc938138f29fb45230169af1ba60761c'/>
<id>urn:sha1:bb85e867bc938138f29fb45230169af1ba60761c</id>
<content type='text'>
Conversation.addUserMessage now takes a []ContentBlock (symmetric with
addAssistantMessage). Introduce a thin addUserText wrapper in agent.zig
for the plain-text case and update every call site in agent.zig and
anthropic_messages_json.zig accordingly.
</content>
</entry>
<entry>
<title>anthropic thinking</title>
<updated>2026-06-09T17:56:35Z</updated>
<author>
<name>t</name>
<email>t@tjp.lol</email>
</author>
<published>2026-06-09T17:56:15Z</published>
<link rel='alternate' type='text/html' href='https://code.tjp.lol/pantograph.git/commit/?id=a7fe265365ba5e8bfbd0e65c827d38c038be7b0f'/>
<id>urn:sha1:a7fe265365ba5e8bfbd0e65c827d38c038be7b0f</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Alias Conversation instead of facading it; merge addAssistantMessage</title>
<updated>2026-06-07T20:57:58Z</updated>
<author>
<name>t</name>
<email>t@tjp.lol</email>
</author>
<published>2026-06-07T20:57:58Z</published>
<link rel='alternate' type='text/html' href='https://code.tjp.lol/pantograph.git/commit/?id=17a985cb41727b8a1bca4d95f334106c09386040'/>
<id>urn:sha1:17a985cb41727b8a1bca4d95f334106c09386040</id>
<content type='text'>
A facade that forwards every method 1:1 is worse than paring the real type
down to the intended surface and aliasing it. conversation.Conversation's
interface is already the public surface we want (init/deinit, the
add*/replace* builders, and messages/allocator as plain data fields), so
public.zig now aliases it straight through and Agent.conversation() returns
a borrowed *Conversation for in-place surgery. Drops the ConversationData
alias and the pointer-wrapper.

Merged addAssistantMessageWithUsage into addAssistantMessage(blocks, ?usage)
on the real type (separate method deleted), so the alias has the intended
one-method shape; all call sites updated.

Only Agent and Stream remain true facades -- they have genuinely-internal
fields plus API-shaping renames (Stream.phase-&gt;state, Phase-&gt;State) an alias
can't express.
</content>
</entry>
<entry>
<title>R2: redesign session store with wire-format identity</title>
<updated>2026-06-07T17:35:49Z</updated>
<author>
<name>t</name>
<email>t@tjp.lol</email>
</author>
<published>2026-06-07T17:35:49Z</published>
<link rel='alternate' type='text/html' href='https://code.tjp.lol/pantograph.git/commit/?id=b14859b9726185ab873356390068e887b7f486d3'/>
<id>urn:sha1:b14859b9726185ab873356390068e887b7f486d3</id>
<content type='text'>
Replace the single-session SessionManager seam with a directory-backed
catalog. session_manager.zig -&gt; file_system_jsonl_store.zig; the old
machinery becomes internal SessionFile, and a new FileSystemJSONLStore
implements the redesigned SessionStore vtable (create/list/resolve/latest/
load/appendMessages) minting Session/SessionInfo handles.

Session logs now record wire-format provider identity
({api_style, base_url, model, reasoning}) instead of a single provider
string or CLI aliases; no api_key material is ever stored. Disk* content
types renamed Stored*; the rich audit-oriented write record is
PersistentMessage (in-memory Message + WireIdentity + provenance).

Agent.init now takes a Session; persist_provider/persist_model display
strings deleted (banner stays alias-based, resume picks default model).
Message.metadata round-trips. Dangling-prompt recovery dropped. CLI
migrated to the catalog store for run/resume/list. Clean break, no version
bump (old logs wiped).
</content>
</entry>
</feed>
