summaryrefslogtreecommitdiff
path: root/libpanto/src/conversation.zig
diff options
context:
space:
mode:
authort <t@tjp.lol>2026-06-07 14:57:58 -0600
committert <t@tjp.lol>2026-06-07 14:57:58 -0600
commit17a985cb41727b8a1bca4d95f334106c09386040 (patch)
tree237a7f1e0d45dafb61ace13f5112ecd31170df4c /libpanto/src/conversation.zig
parent1eddee33902757f7e06993825a3ad1011e7ec346 (diff)
Alias Conversation instead of facading it; merge addAssistantMessage
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->state, Phase->State) an alias can't express.
Diffstat (limited to 'libpanto/src/conversation.zig')
-rw-r--r--libpanto/src/conversation.zig22
1 files changed, 9 insertions, 13 deletions
diff --git a/libpanto/src/conversation.zig b/libpanto/src/conversation.zig
index 1fc5016..a436378 100644
--- a/libpanto/src/conversation.zig
+++ b/libpanto/src/conversation.zig
@@ -292,15 +292,11 @@ pub const Conversation = struct {
});
}
- /// Append an assistant message. Ownership of the blocks is transferred
- /// to the conversation; the caller must not deinit them after this call.
- pub fn addAssistantMessage(self: *Conversation, blocks: []const ContentBlock) !void {
- return self.addAssistantMessageWithUsage(blocks, null);
- }
-
- /// Append an assistant message tagged with its provider-reported
- /// `usage`. Ownership of the blocks is transferred to the conversation.
- pub fn addAssistantMessageWithUsage(
+ /// Append an assistant message, optionally tagged with its
+ /// provider-reported `usage` (pass `null` for none). Ownership of the
+ /// blocks is transferred to the conversation; the caller must not
+ /// deinit them after this call.
+ pub fn addAssistantMessage(
self: *Conversation,
blocks: []const ContentBlock,
usage: ?Usage,
@@ -415,7 +411,7 @@ test "Conversation - add messages and verify content" {
try conv.addUserMessage("Hello!");
try conv.addAssistantMessage(&.{
.{ .Text = try textualBlockFromSlice(allocator, "Hi there!") },
- });
+ }, null);
try std.testing.expectEqual(@as(usize, 3), conv.messages.items.len);
@@ -455,7 +451,7 @@ test "Conversation - deinit frees without leaks" {
try conv.addUserMessage("user message");
try conv.addAssistantMessage(&.{
.{ .Text = try textualBlockFromSlice(allocator, "response") },
- });
+ }, null);
conv.deinit();
}
@@ -468,7 +464,7 @@ test "ContentBlock - Thinking variant" {
try conv.addAssistantMessage(&.{
.{ .Thinking = .{ .text = try textualBlockFromSlice(allocator, "hmm...") } },
.{ .Text = try textualBlockFromSlice(allocator, "answer") },
- });
+ }, null);
try std.testing.expectEqual(@as(usize, 2), conv.messages.items[0].content.items.len);
try std.testing.expectEqualStrings("hmm...", conv.messages.items[0].content.items[0].Thinking.text.items);
@@ -574,7 +570,7 @@ test "latestCompactionIndex - null when never compacted" {
try conv.addUserMessage("hi");
try conv.addAssistantMessage(&.{
.{ .Text = try textualBlockFromSlice(allocator, "hello") },
- });
+ }, null);
try std.testing.expect(latestCompactionIndex(conv.messages.items) == null);
}