From a417727810cc6722b3c82e3c9e9b46982ef40a08 Mon Sep 17 00:00:00 2001 From: t Date: Sat, 20 Jun 2026 10:21:13 -0600 Subject: change up libpanto enums go: explicitly wrap C.PANTO_* constants rather than using `iota` and trying to get the order exactly right. --- libpanto-c/include/panto.h | 4 +-- libpanto-go/panto.go | 88 +++++++++++++++++++++++++++------------------- 2 files changed, 53 insertions(+), 39 deletions(-) diff --git a/libpanto-c/include/panto.h b/libpanto-c/include/panto.h index c79e77c..5457715 100644 --- a/libpanto-c/include/panto.h +++ b/libpanto-c/include/panto.h @@ -32,7 +32,7 @@ typedef enum { PANTO_EFFORT_LOW = 0, PANTO_EFFORT_MEDIUM, PANTO_EFFORT_HIGH, PAN typedef enum { PANTO_ROLE_SYSTEM = 0, PANTO_ROLE_USER, PANTO_ROLE_ASSISTANT } PantoMessageRole; typedef enum { PANTO_BLOCK_TEXT = 0, PANTO_BLOCK_THINKING, PANTO_BLOCK_TOOL_USE, PANTO_BLOCK_TOOL_RESULT, PANTO_BLOCK_SYSTEM, PANTO_BLOCK_COMPACTION_SUMMARY } PantoContentBlockTag; typedef enum { PANTO_SYSTEM_APPEND = 0, PANTO_SYSTEM_REPLACE } PantoSystemMode; -typedef enum { PANTO_EVENT_MESSAGE_START = 0, PANTO_EVENT_BLOCK_START, PANTO_EVENT_TOOL_DETAILS, PANTO_EVENT_CONTENT_DELTA, PANTO_EVENT_BLOCK_COMPLETE, PANTO_EVENT_MESSAGE_COMPLETE, PANTO_EVENT_PROVIDER_RETRY, PANTO_EVENT_TOOL_DISPATCH_START, PANTO_EVENT_TOOL_DISPATCH_COMPLETE, PANTO_EVENT_TURN_COMPLETE } PantoEventTag; +typedef enum { PANTO_EVENT_MESSAGE_START = 0, PANTO_EVENT_BLOCK_START, PANTO_EVENT_TOOL_DETAILS, PANTO_EVENT_CONTENT_DELTA, PANTO_EVENT_BLOCK_COMPLETE, PANTO_EVENT_MESSAGE_COMPLETE, PANTO_EVENT_PROVIDER_RETRY, PANTO_EVENT_TOOL_DISPATCH_START, PANTO_EVENT_TOOL_DISPATCH_RESULT, PANTO_EVENT_TOOL_DISPATCH_COMPLETE, PANTO_EVENT_TURN_COMPLETE } PantoEventTag; typedef struct { uint64_t input, output, cache_read, cache_write, reasoning; } PantoUsage; typedef struct { PantoAPIStyle api_style; PantoSlice base_url; PantoSlice model; PantoReasoningEffort reasoning; PantoThinking thinking; PantoEffort effort; bool has_thinking_budget_tokens; uint32_t thinking_budget_tokens; bool thinking_interleaved; } PantoWireIdentity; @@ -60,7 +60,7 @@ typedef struct { size_t attempt, max_attempts; uint64_t delay_ms; PantoSlice err typedef struct { size_t count; } PantoToolDispatchStart; typedef struct { size_t message_index; } PantoToolDispatchComplete; -typedef struct { PantoEventTag tag; union { PantoMessageRole message_start; PantoBlockStart block_start; PantoToolDetails tool_details; PantoContentDelta content_delta; PantoBlockComplete block_complete; PantoMessageComplete message_complete; PantoProviderRetry provider_retry; PantoToolDispatchStart tool_dispatch_start; PantoToolDispatchComplete tool_dispatch_complete; } data; } PantoEvent; +typedef struct { PantoEventTag tag; union { PantoMessageRole message_start; PantoBlockStart block_start; PantoToolDetails tool_details; PantoContentDelta content_delta; PantoBlockComplete block_complete; PantoMessageComplete message_complete; PantoProviderRetry provider_retry; PantoToolDispatchStart tool_dispatch_start; PantoToolDispatchComplete tool_dispatch_result; PantoToolDispatchComplete tool_dispatch_complete; } data; } PantoEvent; /* One content block of a message being appended. A flattened, borrow-only * view: every slice points into the in-memory message and is valid only for diff --git a/libpanto-go/panto.go b/libpanto-go/panto.go index f692b6f..89e4317 100644 --- a/libpanto-go/panto.go +++ b/libpanto-go/panto.go @@ -53,65 +53,70 @@ type ( SystemMode int ) +// These enums mirror libpanto-c's C enums. Each constant wraps its C value +// (rather than a hand-kept iota sequence) so the Go side can never silently +// drift from the ABI: if a variant is inserted in panto.h, the values shift +// with it instead of desyncing. Keep one Go constant per C value. const ( - OpenAIChat APIStyle = iota - AnthropicMessages + OpenAIChat APIStyle = APIStyle(C.PANTO_OPENAI_CHAT) + AnthropicMessages APIStyle = APIStyle(C.PANTO_ANTHROPIC_MESSAGES) ) const ( - ReasoningDefault ReasoningEffort = iota - ReasoningOff - ReasoningMinimal - ReasoningLow - ReasoningMedium - ReasoningHigh + ReasoningDefault ReasoningEffort = ReasoningEffort(C.PANTO_REASONING_DEFAULT) + ReasoningOff ReasoningEffort = ReasoningEffort(C.PANTO_REASONING_OFF) + ReasoningMinimal ReasoningEffort = ReasoningEffort(C.PANTO_REASONING_MINIMAL) + ReasoningLow ReasoningEffort = ReasoningEffort(C.PANTO_REASONING_LOW) + ReasoningMedium ReasoningEffort = ReasoningEffort(C.PANTO_REASONING_MEDIUM) + ReasoningHigh ReasoningEffort = ReasoningEffort(C.PANTO_REASONING_HIGH) ) const ( - ThinkingDisabled Thinking = iota - ThinkingEnabled - ThinkingAdaptive + ThinkingDisabled Thinking = Thinking(C.PANTO_THINKING_DISABLED) + ThinkingEnabled Thinking = Thinking(C.PANTO_THINKING_ENABLED) + ThinkingAdaptive Thinking = Thinking(C.PANTO_THINKING_ADAPTIVE) ) const ( - EffortLow Effort = iota - EffortMedium - EffortHigh - EffortXHigh - EffortMax + EffortLow Effort = Effort(C.PANTO_EFFORT_LOW) + EffortMedium Effort = Effort(C.PANTO_EFFORT_MEDIUM) + EffortHigh Effort = Effort(C.PANTO_EFFORT_HIGH) + EffortXHigh Effort = Effort(C.PANTO_EFFORT_XHIGH) + EffortMax Effort = Effort(C.PANTO_EFFORT_MAX) ) const ( - RoleSystem MessageRole = iota - RoleUser - RoleAssistant + RoleSystem MessageRole = MessageRole(C.PANTO_ROLE_SYSTEM) + RoleUser MessageRole = MessageRole(C.PANTO_ROLE_USER) + RoleAssistant MessageRole = MessageRole(C.PANTO_ROLE_ASSISTANT) ) const ( - BlockText ContentBlockTag = iota - BlockThinking - BlockToolUse - BlockToolResult - BlockSystem - BlockCompactionSummary + BlockText ContentBlockTag = ContentBlockTag(C.PANTO_BLOCK_TEXT) + BlockThinking ContentBlockTag = ContentBlockTag(C.PANTO_BLOCK_THINKING) + BlockToolUse ContentBlockTag = ContentBlockTag(C.PANTO_BLOCK_TOOL_USE) + BlockToolResult ContentBlockTag = ContentBlockTag(C.PANTO_BLOCK_TOOL_RESULT) + BlockSystem ContentBlockTag = ContentBlockTag(C.PANTO_BLOCK_SYSTEM) + BlockCompactionSummary ContentBlockTag = ContentBlockTag(C.PANTO_BLOCK_COMPACTION_SUMMARY) ) const ( - SystemAppend SystemMode = iota - SystemReplace + SystemAppend SystemMode = SystemMode(C.PANTO_SYSTEM_APPEND) + SystemReplace SystemMode = SystemMode(C.PANTO_SYSTEM_REPLACE) ) const ( - EventMessageStart EventTag = iota - EventBlockStart - EventToolDetails - EventContentDelta - EventBlockComplete - EventMessageComplete - EventProviderRetry - EventToolDispatchStart - EventToolDispatchComplete - EventTurnComplete + EventMessageStart EventTag = EventTag(C.PANTO_EVENT_MESSAGE_START) + EventBlockStart EventTag = EventTag(C.PANTO_EVENT_BLOCK_START) + EventToolDetails EventTag = EventTag(C.PANTO_EVENT_TOOL_DETAILS) + EventContentDelta EventTag = EventTag(C.PANTO_EVENT_CONTENT_DELTA) + EventBlockComplete EventTag = EventTag(C.PANTO_EVENT_BLOCK_COMPLETE) + EventMessageComplete EventTag = EventTag(C.PANTO_EVENT_MESSAGE_COMPLETE) + EventProviderRetry EventTag = EventTag(C.PANTO_EVENT_PROVIDER_RETRY) + EventToolDispatchStart EventTag = EventTag(C.PANTO_EVENT_TOOL_DISPATCH_START) + EventToolDispatchResult EventTag = EventTag(C.PANTO_EVENT_TOOL_DISPATCH_RESULT) + EventToolDispatchComplete EventTag = EventTag(C.PANTO_EVENT_TOOL_DISPATCH_COMPLETE) + EventTurnComplete EventTag = EventTag(C.PANTO_EVENT_TURN_COMPLETE) ) type Config struct { @@ -220,6 +225,11 @@ type ProviderRetryEvent struct { // message's tool calls. type ToolDispatchStartEvent struct{ Count uint } +// ToolDispatchResultEvent: a single tool's result became available, before the +// aggregate ToolDispatchCompleteEvent. MessageIndex is the index of the +// ToolResult-carrying message in the conversation. +type ToolDispatchResultEvent struct{ MessageIndex uint } + // ToolDispatchCompleteEvent: the agent appended a user(ToolResult) message. type ToolDispatchCompleteEvent struct{ MessageIndex uint } @@ -235,6 +245,7 @@ func (BlockCompleteEvent) EventType() EventTag { return EventBlockComplet func (MessageCompleteEvent) EventType() EventTag { return EventMessageComplete } func (ProviderRetryEvent) EventType() EventTag { return EventProviderRetry } func (ToolDispatchStartEvent) EventType() EventTag { return EventToolDispatchStart } +func (ToolDispatchResultEvent) EventType() EventTag { return EventToolDispatchResult } func (ToolDispatchCompleteEvent) EventType() EventTag { return EventToolDispatchComplete } func (TurnCompleteEvent) EventType() EventTag { return EventTurnComplete } @@ -1188,6 +1199,9 @@ func marshalEvent(cev *C.PantoEvent) Event { case C.PANTO_EVENT_TOOL_DISPATCH_START: t := (*C.PantoToolDispatchStart)(unsafe.Pointer(&cev.data[0])) return ToolDispatchStartEvent{Count: uint(t.count)} + case C.PANTO_EVENT_TOOL_DISPATCH_RESULT: + t := (*C.PantoToolDispatchComplete)(unsafe.Pointer(&cev.data[0])) + return ToolDispatchResultEvent{MessageIndex: uint(t.message_index)} case C.PANTO_EVENT_TOOL_DISPATCH_COMPLETE: t := (*C.PantoToolDispatchComplete)(unsafe.Pointer(&cev.data[0])) return ToolDispatchCompleteEvent{MessageIndex: uint(t.message_index)} -- cgit v1.3