summaryrefslogtreecommitdiff
path: root/libpanto/src/agent.zig
diff options
context:
space:
mode:
authort <t@tjp.lol>2026-06-13 23:45:59 -0600
committert <t@tjp.lol>2026-06-15 15:08:32 -0600
commit02b4c7a35ac0b714bc045d54fb4bb45d1ce4e490 (patch)
tree134196a82dd6fdd55b735be4c0cf38428c85038d /libpanto/src/agent.zig
parent71643a5d69ffc40882c9fcde3cc8a3bcf02d7396 (diff)
Add Codex Responses support and session debugging
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.
Diffstat (limited to 'libpanto/src/agent.zig')
-rw-r--r--libpanto/src/agent.zig11
1 files changed, 9 insertions, 2 deletions
diff --git a/libpanto/src/agent.zig b/libpanto/src/agent.zig
index 1da0261..0ff231a 100644
--- a/libpanto/src/agent.zig
+++ b/libpanto/src/agent.zig
@@ -78,7 +78,12 @@ fn cloneMessage(alloc: Allocator, msg: conversation.Message) !conversation.Messa
for (msg.content.items) |block| {
content.appendAssumeCapacity(try cloneBlock(alloc, block));
}
- return .{ .role = msg.role, .content = content, .usage = msg.usage };
+ return .{
+ .role = msg.role,
+ .content = content,
+ .usage = msg.usage,
+ .metadata = if (msg.metadata) |m| try alloc.dupe(u8, m) else null,
+ };
}
fn cloneBlock(alloc: Allocator, block: conversation.ContentBlock) !conversation.ContentBlock {
@@ -91,7 +96,9 @@ fn cloneBlock(alloc: Allocator, block: conversation.ContentBlock) !conversation.
mut.deinit(alloc);
}
const sig: ?[]const u8 = if (b.signature) |s| try alloc.dupe(u8, s) else null;
- break :blk .{ .Thinking = .{ .text = tb, .signature = sig } };
+ errdefer if (sig) |s| alloc.free(s);
+ const origin: ?conversation.SignatureOrigin = if (b.signature_origin) |o| try o.dupe(alloc) else null;
+ break :blk .{ .Thinking = .{ .text = tb, .signature = sig, .signature_origin = origin } };
},
.ToolUse => |b| blk: {
const id = try alloc.dupe(u8, b.id);