From a1a41083030a268ff7760ca07af71d61cd2ee97a Mon Sep 17 00:00:00 2001 From: Kaien Date: Mon, 10 Aug 2026 17:40:12 +0300 Subject: [PATCH] feat: forward AgentDelegation on PostMessage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stage 8 Chat SDK support for Mira→Red Queen INVESTIGATE routing metadata. Co-authored-by: Cursor --- client.go | 4 ++++ subscription_test.go | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/client.go b/client.go index a3e3ed7..088518d 100644 --- a/client.go +++ b/client.go @@ -134,6 +134,9 @@ type PostMessageRequest struct { Content string ReplyToMessageID string IdempotencyKey string + // Optional machine-readable delegation metadata (AgentDelegation). + // Nil means no delegation; forwarded as-is to AgentPostMessage. + Delegation *pb.AgentDelegation } func (c *Client) PostMessage(ctx context.Context, req PostMessageRequest) (*pb.PostMessageResponse, error) { @@ -144,6 +147,7 @@ func (c *Client) PostMessage(ctx context.Context, req PostMessageRequest) (*pb.P TopicId: req.TopicID, Content: req.Content, IdempotencyKey: req.IdempotencyKey, + Delegation: req.Delegation, } if req.ReplyToMessageID != "" { replyTo := req.ReplyToMessageID diff --git a/subscription_test.go b/subscription_test.go index 5a16bcf..a6c72ce 100644 --- a/subscription_test.go +++ b/subscription_test.go @@ -289,6 +289,42 @@ func TestPostMessageUsesAgentPostMessageAndPreservesIdempotencyKey(t *testing.T) if len(fake.postReqs) != 1 || fake.postReqs[0].GetIdempotencyKey() != "logical-key" { t.Fatalf("AgentPostMessage reqs = %+v", fake.postReqs) } + if fake.postReqs[0].GetDelegation() != nil { + t.Fatalf("expected nil delegation, got %+v", fake.postReqs[0].GetDelegation()) + } +} + +func TestPostMessageForwardsDelegationMetadata(t *testing.T) { + fake := newFake() + c := newClientForTest(t, fake) + delegation := &pb.AgentDelegation{ + TargetAuthorId: "22222222-2222-2222-2222-222222222222", + Kind: "INVESTIGATE", + } + _, err := c.PostMessage(context.Background(), PostMessageRequest{ + TopicID: "topic", + Content: "please investigate", + IdempotencyKey: "deleg-key", + Delegation: delegation, + }) + if err != nil { + t.Fatal(err) + } + fake.mu.Lock() + defer fake.mu.Unlock() + if fake.genericPosts != 0 { + t.Fatal("generic PostMessage must not be called") + } + if len(fake.postReqs) != 1 { + t.Fatalf("AgentPostMessage reqs = %+v", fake.postReqs) + } + got := fake.postReqs[0].GetDelegation() + if got == nil { + t.Fatal("expected delegation to be forwarded") + } + if got.GetTargetAuthorId() != delegation.TargetAuthorId || got.GetKind() != delegation.Kind { + t.Fatalf("delegation = %+v, want %+v", got, delegation) + } } func TestOrderedCumulativeACKWithSequenceGaps(t *testing.T) {