Explorar o código

chore: update stainless defs

adamdotdevin hai 7 meses
pai
achega
6b98acb7be

+ 3 - 0
packages/opencode/src/session/message-v2.ts

@@ -88,7 +88,10 @@ export namespace MessageV2 {
   export const SnapshotPart = PartBase.extend({
     type: z.literal("snapshot"),
     snapshot: z.string(),
+  }).openapi({
+    ref: "SnapshotPart",
   })
+  export type SnapshotPart = z.infer<typeof SnapshotPart>
 
   export const TextPart = PartBase.extend({
     type: z.literal("text"),

+ 3 - 3
packages/tui/sdk/.stats.yml

@@ -1,4 +1,4 @@
 configured_endpoints: 22
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/opencode%2Fopencode-05150c78e0e6e97b0ce97ed685ebcf1cb01dc839beccb99e9d3ead5b783cfd47.yml
-openapi_spec_hash: 833a5b6d53d98dc2beac2c4c394b20d5
-config_hash: 3695cfc829cfaae14490850b4a1ed282
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/opencode%2Fopencode-7270b9e4859010d6680bcc92afcd6f7c679d80a2645f65d7097d19ce2e8cdc5a.yml
+openapi_spec_hash: 5fcbfaedebfea62c17c74437a9728b04
+config_hash: 38041c37df28a1c4383718e6d148dd0a

+ 12 - 15
packages/tui/sdk/README.md

@@ -49,14 +49,11 @@ import (
 
 func main() {
 	client := opencode.NewClient()
-	stream := client.Event.ListStreaming(context.TODO())
-	for stream.Next() {
-		fmt.Printf("%+v\n", stream.Current())
-	}
-	err := stream.Err()
+	sessions, err := client.Session.List(context.TODO())
 	if err != nil {
 		panic(err.Error())
 	}
+	fmt.Printf("%+v\n", sessions)
 }
 
 ```
@@ -145,7 +142,7 @@ client := opencode.NewClient(
 	option.WithHeader("X-Some-Header", "custom_header_info"),
 )
 
-client.Event.List(context.TODO(), ...,
+client.Session.List(context.TODO(), ...,
 	// Override the header
 	option.WithHeader("X-Some-Header", "some_other_custom_header_info"),
 	// Add an undocumented field to the request body, using sjson syntax
@@ -174,14 +171,14 @@ When the API returns a non-success status code, we return an error with type
 To handle errors, we recommend that you use the `errors.As` pattern:
 
 ```go
-stream := client.Event.ListStreaming(context.TODO())
-if stream.Err() != nil {
+_, err := client.Session.List(context.TODO())
+if err != nil {
 	var apierr *opencode.Error
-	if errors.As(stream.Err(), &apierr) {
+	if errors.As(err, &apierr) {
 		println(string(apierr.DumpRequest(true)))  // Prints the serialized HTTP request
 		println(string(apierr.DumpResponse(true))) // Prints the serialized HTTP response
 	}
-	panic(stream.Err().Error()) // GET "/event": 400 Bad Request { ... }
+	panic(err.Error()) // GET "/session": 400 Bad Request { ... }
 }
 ```
 
@@ -199,7 +196,7 @@ To set a per-retry timeout, use `option.WithRequestTimeout()`.
 // This sets the timeout for the request, including all the retries.
 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
 defer cancel()
-client.Event.ListStreaming(
+client.Session.List(
 	ctx,
 	// This sets the per-retry timeout
 	option.WithRequestTimeout(20*time.Second),
@@ -234,7 +231,7 @@ client := opencode.NewClient(
 )
 
 // Override per-request:
-client.Event.ListStreaming(context.TODO(), option.WithMaxRetries(5))
+client.Session.List(context.TODO(), option.WithMaxRetries(5))
 ```
 
 ### Accessing raw response data (e.g. response headers)
@@ -245,11 +242,11 @@ you need to examine response headers, status codes, or other details.
 ```go
 // Create a variable to store the HTTP response
 var response *http.Response
-stream := client.Event.ListStreaming(context.TODO(), option.WithResponseInto(&response))
-if stream.Err() != nil {
+sessions, err := client.Session.List(context.TODO(), option.WithResponseInto(&response))
+if err != nil {
 	// handle error
 }
-fmt.Printf("%+v\n", events)
+fmt.Printf("%+v\n", sessions)
 
 fmt.Printf("Status Code: %d\n", response.StatusCode)
 fmt.Printf("Headers: %+#v\n", response.Header)

+ 1 - 0
packages/tui/sdk/api.md

@@ -85,6 +85,7 @@ Response Types:
 - <a href="https://pkg.go.dev/github.com/sst/opencode-sdk-go">opencode</a>.<a href="https://pkg.go.dev/github.com/sst/opencode-sdk-go#Message">Message</a>
 - <a href="https://pkg.go.dev/github.com/sst/opencode-sdk-go">opencode</a>.<a href="https://pkg.go.dev/github.com/sst/opencode-sdk-go#Part">Part</a>
 - <a href="https://pkg.go.dev/github.com/sst/opencode-sdk-go">opencode</a>.<a href="https://pkg.go.dev/github.com/sst/opencode-sdk-go#Session">Session</a>
+- <a href="https://pkg.go.dev/github.com/sst/opencode-sdk-go">opencode</a>.<a href="https://pkg.go.dev/github.com/sst/opencode-sdk-go#SnapshotPart">SnapshotPart</a>
 - <a href="https://pkg.go.dev/github.com/sst/opencode-sdk-go">opencode</a>.<a href="https://pkg.go.dev/github.com/sst/opencode-sdk-go#StepFinishPart">StepFinishPart</a>
 - <a href="https://pkg.go.dev/github.com/sst/opencode-sdk-go">opencode</a>.<a href="https://pkg.go.dev/github.com/sst/opencode-sdk-go#StepStartPart">StepStartPart</a>
 - <a href="https://pkg.go.dev/github.com/sst/opencode-sdk-go">opencode</a>.<a href="https://pkg.go.dev/github.com/sst/opencode-sdk-go#TextPart">TextPart</a>

+ 8 - 36
packages/tui/sdk/client_test.go

@@ -38,7 +38,7 @@ func TestUserAgentHeader(t *testing.T) {
 			},
 		}),
 	)
-	client.Event.ListStreaming(context.Background())
+	client.Session.List(context.Background())
 	if userAgent != fmt.Sprintf("Opencode/Go %s", internal.PackageVersion) {
 		t.Errorf("Expected User-Agent to be correct, but got: %#v", userAgent)
 	}
@@ -61,11 +61,7 @@ func TestRetryAfter(t *testing.T) {
 			},
 		}),
 	)
-	stream := client.Event.ListStreaming(context.Background())
-	for stream.Next() {
-		// ...
-	}
-	err := stream.Err()
+	_, err := client.Session.List(context.Background())
 	if err == nil {
 		t.Error("Expected there to be a cancel error")
 	}
@@ -99,11 +95,7 @@ func TestDeleteRetryCountHeader(t *testing.T) {
 		}),
 		option.WithHeaderDel("X-Stainless-Retry-Count"),
 	)
-	stream := client.Event.ListStreaming(context.Background())
-	for stream.Next() {
-		// ...
-	}
-	err := stream.Err()
+	_, err := client.Session.List(context.Background())
 	if err == nil {
 		t.Error("Expected there to be a cancel error")
 	}
@@ -132,11 +124,7 @@ func TestOverwriteRetryCountHeader(t *testing.T) {
 		}),
 		option.WithHeader("X-Stainless-Retry-Count", "42"),
 	)
-	stream := client.Event.ListStreaming(context.Background())
-	for stream.Next() {
-		// ...
-	}
-	err := stream.Err()
+	_, err := client.Session.List(context.Background())
 	if err == nil {
 		t.Error("Expected there to be a cancel error")
 	}
@@ -164,11 +152,7 @@ func TestRetryAfterMs(t *testing.T) {
 			},
 		}),
 	)
-	stream := client.Event.ListStreaming(context.Background())
-	for stream.Next() {
-		// ...
-	}
-	err := stream.Err()
+	_, err := client.Session.List(context.Background())
 	if err == nil {
 		t.Error("Expected there to be a cancel error")
 	}
@@ -190,11 +174,7 @@ func TestContextCancel(t *testing.T) {
 	)
 	cancelCtx, cancel := context.WithCancel(context.Background())
 	cancel()
-	stream := client.Event.ListStreaming(cancelCtx)
-	for stream.Next() {
-		// ...
-	}
-	err := stream.Err()
+	_, err := client.Session.List(cancelCtx)
 	if err == nil {
 		t.Error("Expected there to be a cancel error")
 	}
@@ -213,11 +193,7 @@ func TestContextCancelDelay(t *testing.T) {
 	)
 	cancelCtx, cancel := context.WithTimeout(context.Background(), 2*time.Millisecond)
 	defer cancel()
-	stream := client.Event.ListStreaming(cancelCtx)
-	for stream.Next() {
-		// ...
-	}
-	err := stream.Err()
+	_, err := client.Session.List(cancelCtx)
 	if err == nil {
 		t.Error("expected there to be a cancel error")
 	}
@@ -242,11 +218,7 @@ func TestContextDeadline(t *testing.T) {
 				},
 			}),
 		)
-		stream := client.Event.ListStreaming(deadlineCtx)
-		for stream.Next() {
-			// ...
-		}
-		err := stream.Err()
+		_, err := client.Session.List(deadlineCtx)
 		if err == nil {
 			t.Error("expected there to be a deadline error")
 		}

+ 65 - 59
packages/tui/sdk/session.go

@@ -659,13 +659,13 @@ func (r *Part) UnmarshalJSON(data []byte) (err error) {
 // for more type safety.
 //
 // Possible runtime types of the union are [TextPart], [FilePart], [ToolPart],
-// [StepStartPart], [StepFinishPart], [PartObject].
+// [StepStartPart], [StepFinishPart], [SnapshotPart].
 func (r Part) AsUnion() PartUnion {
 	return r.union
 }
 
 // Union satisfied by [TextPart], [FilePart], [ToolPart], [StepStartPart],
-// [StepFinishPart] or [PartObject].
+// [StepFinishPart] or [SnapshotPart].
 type PartUnion interface {
 	implementsPart()
 }
@@ -673,78 +673,40 @@ type PartUnion interface {
 func init() {
 	apijson.RegisterUnion(
 		reflect.TypeOf((*PartUnion)(nil)).Elem(),
-		"",
+		"type",
 		apijson.UnionVariant{
-			TypeFilter: gjson.JSON,
-			Type:       reflect.TypeOf(TextPart{}),
+			TypeFilter:         gjson.JSON,
+			Type:               reflect.TypeOf(TextPart{}),
+			DiscriminatorValue: "text",
 		},
 		apijson.UnionVariant{
-			TypeFilter: gjson.JSON,
-			Type:       reflect.TypeOf(FilePart{}),
+			TypeFilter:         gjson.JSON,
+			Type:               reflect.TypeOf(FilePart{}),
+			DiscriminatorValue: "file",
 		},
 		apijson.UnionVariant{
-			TypeFilter: gjson.JSON,
-			Type:       reflect.TypeOf(ToolPart{}),
+			TypeFilter:         gjson.JSON,
+			Type:               reflect.TypeOf(ToolPart{}),
+			DiscriminatorValue: "tool",
 		},
 		apijson.UnionVariant{
-			TypeFilter: gjson.JSON,
-			Type:       reflect.TypeOf(StepStartPart{}),
+			TypeFilter:         gjson.JSON,
+			Type:               reflect.TypeOf(StepStartPart{}),
+			DiscriminatorValue: "step-start",
 		},
 		apijson.UnionVariant{
-			TypeFilter: gjson.JSON,
-			Type:       reflect.TypeOf(StepFinishPart{}),
+			TypeFilter:         gjson.JSON,
+			Type:               reflect.TypeOf(StepFinishPart{}),
+			DiscriminatorValue: "step-finish",
 		},
 		apijson.UnionVariant{
-			TypeFilter: gjson.JSON,
-			Type:       reflect.TypeOf(PartObject{}),
+			TypeFilter:         gjson.JSON,
+			Type:               reflect.TypeOf(SnapshotPart{}),
+			DiscriminatorValue: "snapshot",
 		},
 	)
 }
 
-type PartObject struct {
-	ID        string         `json:"id,required"`
-	MessageID string         `json:"messageID,required"`
-	SessionID string         `json:"sessionID,required"`
-	Snapshot  string         `json:"snapshot,required"`
-	Type      PartObjectType `json:"type,required"`
-	JSON      partObjectJSON `json:"-"`
-}
-
-// partObjectJSON contains the JSON metadata for the struct [PartObject]
-type partObjectJSON struct {
-	ID          apijson.Field
-	MessageID   apijson.Field
-	SessionID   apijson.Field
-	Snapshot    apijson.Field
-	Type        apijson.Field
-	raw         string
-	ExtraFields map[string]apijson.Field
-}
-
-func (r *PartObject) UnmarshalJSON(data []byte) (err error) {
-	return apijson.UnmarshalRoot(data, r)
-}
-
-func (r partObjectJSON) RawJSON() string {
-	return r.raw
-}
-
-func (r PartObject) implementsPart() {}
-
-type PartObjectType string
-
-const (
-	PartObjectTypeSnapshot PartObjectType = "snapshot"
-)
-
-func (r PartObjectType) IsKnown() bool {
-	switch r {
-	case PartObjectTypeSnapshot:
-		return true
-	}
-	return false
-}
-
 type PartType string
 
 const (
@@ -862,6 +824,50 @@ func (r sessionShareJSON) RawJSON() string {
 	return r.raw
 }
 
+type SnapshotPart struct {
+	ID        string           `json:"id,required"`
+	MessageID string           `json:"messageID,required"`
+	SessionID string           `json:"sessionID,required"`
+	Snapshot  string           `json:"snapshot,required"`
+	Type      SnapshotPartType `json:"type,required"`
+	JSON      snapshotPartJSON `json:"-"`
+}
+
+// snapshotPartJSON contains the JSON metadata for the struct [SnapshotPart]
+type snapshotPartJSON struct {
+	ID          apijson.Field
+	MessageID   apijson.Field
+	SessionID   apijson.Field
+	Snapshot    apijson.Field
+	Type        apijson.Field
+	raw         string
+	ExtraFields map[string]apijson.Field
+}
+
+func (r *SnapshotPart) UnmarshalJSON(data []byte) (err error) {
+	return apijson.UnmarshalRoot(data, r)
+}
+
+func (r snapshotPartJSON) RawJSON() string {
+	return r.raw
+}
+
+func (r SnapshotPart) implementsPart() {}
+
+type SnapshotPartType string
+
+const (
+	SnapshotPartTypeSnapshot SnapshotPartType = "snapshot"
+)
+
+func (r SnapshotPartType) IsKnown() bool {
+	switch r {
+	case SnapshotPartTypeSnapshot:
+		return true
+	}
+	return false
+}
+
 type StepFinishPart struct {
 	ID        string               `json:"id,required"`
 	Cost      float64              `json:"cost,required"`

+ 2 - 5
packages/tui/sdk/usage_test.go

@@ -23,13 +23,10 @@ func TestUsage(t *testing.T) {
 	client := opencode.NewClient(
 		option.WithBaseURL(baseURL),
 	)
-	stream := client.Event.ListStreaming(context.TODO())
-	for stream.Next() {
-		t.Logf("%+v\n", stream.Current())
-	}
-	err := stream.Err()
+	sessions, err := client.Session.List(context.TODO())
 	if err != nil {
 		t.Error(err)
 		return
 	}
+	t.Logf("%+v\n", sessions)
 }

+ 7 - 3
stainless.yml

@@ -78,6 +78,7 @@ resources:
       keybinds: KeybindsConfig
       mcpLocal: McpLocalConfig
       mcpRemote: McpRemoteConfig
+      mode: ModeConfig
       provider: Provider
       model: Model
     methods:
@@ -94,10 +95,9 @@ resources:
       toolPart: ToolPart
       stepStartPart: StepStartPart
       stepFinishPart: StepFinishPart
+      snapshotPart: SnapshotPart
       assistantMessage: AssistantMessage
-      assistantMessagePart: AssistantMessagePart
       userMessage: UserMessage
-      userMessagePart: UserMessagePart
       toolStatePending: ToolStatePending
       toolStateRunning: ToolStateRunning
       toolStateCompleted: ToolStateCompleted
@@ -126,9 +126,13 @@ readme:
   example_requests:
     default:
       type: request
-      endpoint: get /event
+      endpoint: get /session
       params: {}
     headline:
+      type: request
+      endpoint: get /session
+      params: {}
+    streaming:
       type: request
       endpoint: get /event
       params: {}