Skip to content

Commit ad4b79f

Browse files
authored
fix license (#63)
1 parent a3048ca commit ad4b79f

File tree

521 files changed

+2166
-8198
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

521 files changed

+2166
-8198
lines changed

CLAUDE.md

Lines changed: 120 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -4,109 +4,138 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
44

55
## Build Commands
66

7-
### Build the server binary
87
```bash
9-
make build
10-
# Or directly:
11-
go build -o bin/snmcp cmd/streamnative-mcp-server/main.go
12-
```
13-
14-
### Run tests
15-
```bash
16-
go test -race ./...
17-
# Run a specific test:
18-
go test -race ./pkg/mcp/builders/...
19-
```
20-
21-
### Docker operations
22-
```bash
23-
make docker-build # Build local Docker image
8+
make build # Build server binary to bin/snmcp
9+
go test -race ./... # Run all tests with race detection
10+
go test -race ./pkg/mcp/builders/... # Run specific package tests
11+
go test -v -run TestName ./pkg/... # Run a single test
12+
make license-check # Check license headers
13+
make license-fix # Fix license headers
14+
make docker-build # Build local Docker image
2415
make docker-build-push # Build and push multi-platform image
2516
```
2617

27-
### License checking
28-
```bash
29-
make license-check # Check license headers
30-
make license-fix # Fix license headers
31-
```
32-
3318
## Architecture Overview
3419

35-
The StreamNative MCP Server implements the Model Context Protocol to enable AI agents to interact with Apache Kafka, Apache Pulsar, and StreamNative Cloud resources.
36-
37-
### Core Components
38-
39-
1. **Session Management** (`pkg/config/`, `pkg/kafka/`, `pkg/pulsar/`)
40-
- Three types of sessions: SNCloudSession, KafkaSession, PulsarSession
41-
- Sessions manage client connections and authentication
42-
- Sessions are created and configured based on command-line flags
43-
44-
2. **MCP Server** (`pkg/mcp/`)
45-
- Central server implementation using `mark3labs/mcp-go` library
46-
- Handles tool registration and request routing
47-
- Features can be enabled/disabled via `--features` flag
48-
49-
3. **Tool Builders** (`pkg/mcp/builders/`)
50-
- Registry pattern for registering MCP tools
51-
- Separate builders for Kafka and Pulsar operations
52-
- Each builder creates tools with specific operations (admin, client, etc.)
20+
The StreamNative MCP Server implements the Model Context Protocol using the `mark3labs/mcp-go` library to enable AI agents to interact with Apache Kafka, Apache Pulsar, and StreamNative Cloud resources.
5321

54-
4. **PFTools** (`pkg/mcp/pftools/`)
55-
- Abstraction layer for Pulsar Functions as MCP tools
56-
- Dynamic tool generation from deployed Pulsar Functions
57-
- Circuit breaker pattern for resilience
58-
- Schema handling for input/output validation
22+
### Request Flow
5923

60-
### Key Design Patterns
61-
62-
1. **Builder Pattern**: Tool builders (`pkg/mcp/builders/`) register tools dynamically based on enabled features
63-
2. **Session Pattern**: Separate sessions for different services (Kafka, Pulsar, SNCloud) with lazy initialization
64-
3. **Registry Pattern**: Central registry (`pkg/mcp/builders/registry.go`) manages all tool builders
65-
4. **Circuit Breaker**: Used in PFTools for handling function invocation failures
66-
67-
## Development Guidelines
68-
69-
### Adding New Tools
70-
71-
1. Create a new builder in `pkg/mcp/builders/kafka/` or `pkg/mcp/builders/pulsar/`
72-
2. Implement the `Builder` interface with `Build()` method
73-
3. Register the builder in the appropriate tools file (e.g., `kafka_admin_*_tools.go`)
74-
4. Add feature flag support in `pkg/mcp/features.go`
75-
76-
### Session Context
77-
78-
The server maintains session context that gets passed to tools via the context:
79-
- Pulsar admin client retrieval: Use `session.GetAdminClient()` or `session.GetAdminV3Client()`
80-
- Kafka client retrieval: Use `session.GetKafkaSession()` methods
81-
- Always check for nil sessions before use
82-
83-
### Error Handling
84-
85-
- Use wrapped errors with context: `fmt.Errorf("failed to X: %w", err)`
86-
- Check session availability before operations
87-
- Return meaningful error messages for AI agent consumption
24+
```
25+
Client Request → MCP Server (pkg/mcp/server.go)
26+
27+
Tool Handler (from builders)
28+
29+
Session Context (pkg/mcp/ctx.go)
30+
31+
Service Client (Kafka/Pulsar/SNCloud)
32+
```
8833

89-
## Testing
34+
### Core Components
9035

91-
Tests follow standard Go testing patterns:
92-
- Unit tests alongside source files (`*_test.go`)
93-
- Use `testify` for assertions
94-
- Mock external dependencies where appropriate
36+
1. **Server & Sessions** (`pkg/mcp/server.go`)
37+
- `Server` struct holds `MCPServer`, `KafkaSession`, `PulsarSession`, and `SNCloudSession`
38+
- Sessions provide lazy-initialized clients for each service
39+
- Context functions (`pkg/mcp/ctx.go`) inject/retrieve sessions from request context
9540

96-
## Important Files
41+
2. **Tool Builders** (`pkg/mcp/builders/`)
42+
- `ToolBuilder` interface: `GetName()`, `GetRequiredFeatures()`, `BuildTools()`, `Validate()`
43+
- `BaseToolBuilder` provides common feature validation logic
44+
- Each builder creates `[]server.ServerTool` with tool definitions and handlers
45+
- Builders in `builders/kafka/` and `builders/pulsar/` implement service-specific tools
9746

98-
- `cmd/streamnative-mcp-server/main.go` - Entry point
99-
- `pkg/cmd/mcp/server.go` - Server setup
100-
- `pkg/mcp/server.go` - MCP server implementation
101-
- `pkg/mcp/builders/registry.go` - Tool registration
102-
- `pkg/mcp/pftools/manager.go` - Pulsar Functions management
103-
- `pkg/config/config.go` - Configuration structures
47+
3. **Tool Registration** (`pkg/mcp/*_tools.go`)
48+
- Each `*_tools.go` file creates a builder, builds tools, and adds them to the server
49+
- Tools are conditionally registered based on `--features` flag
50+
- Feature constants defined in `pkg/mcp/features.go`
10451

105-
## Configuration
52+
4. **PFTools - Functions as Tools** (`pkg/mcp/pftools/`)
53+
- `PulsarFunctionManager` dynamically converts Pulsar Functions to MCP tools
54+
- Polls for function changes and auto-registers/unregisters tools
55+
- Circuit breaker pattern (`circuit_breaker.go`) for fault tolerance
56+
- Schema conversion (`schema.go`) for input/output handling
10657

107-
The server supports three modes:
108-
1. **StreamNative Cloud**: Requires `--organization` and `--key-file`
109-
2. **External Kafka**: Use `--use-external-kafka` with Kafka connection parameters
110-
3. **External Pulsar**: Use `--use-external-pulsar` with Pulsar connection parameters
58+
### Key Design Patterns
11159

112-
When `--pulsar-instance` and `--pulsar-cluster` are provided together, context management tools are disabled as the context is pre-configured.
60+
- **Builder Pattern**: Tool builders create tools based on features and read-only mode
61+
- **Context Injection**: Sessions passed via `context.Context` using typed keys
62+
- **Feature Flags**: Tools enabled/disabled via string feature identifiers
63+
- **Circuit Breaker**: PFTools uses failure thresholds to prevent cascading failures
64+
65+
## Adding New Tools
66+
67+
1. **Create Builder** in `pkg/mcp/builders/kafka/` or `pkg/mcp/builders/pulsar/`:
68+
```go
69+
type MyToolBuilder struct {
70+
*builders.BaseToolBuilder
71+
}
72+
73+
func NewMyToolBuilder() *MyToolBuilder {
74+
metadata := builders.ToolMetadata{
75+
Name: "my_tool",
76+
Description: "Tool description",
77+
Category: "kafka_admin",
78+
}
79+
features := []string{"kafka-admin", "all", "all-kafka"}
80+
return &MyToolBuilder{
81+
BaseToolBuilder: builders.NewBaseToolBuilder(metadata, features),
82+
}
83+
}
84+
85+
func (b *MyToolBuilder) BuildTools(ctx context.Context, config builders.ToolBuildConfig) ([]server.ServerTool, error) {
86+
if !b.HasAnyRequiredFeature(config.Features) {
87+
return nil, nil
88+
}
89+
// Build and return tools
90+
}
91+
```
92+
93+
2. **Add Feature Constant** in `pkg/mcp/features.go` if needed
94+
95+
3. **Create Registration File** `pkg/mcp/my_tools.go`:
96+
```go
97+
func AddMyTools(s *server.MCPServer, readOnly bool, features []string) {
98+
builder := kafkabuilders.NewMyToolBuilder()
99+
config := builders.ToolBuildConfig{ReadOnly: readOnly, Features: features}
100+
tools, _ := builder.BuildTools(context.Background(), config)
101+
for _, tool := range tools {
102+
s.AddTool(tool.Tool, tool.Handler)
103+
}
104+
}
105+
```
106+
107+
4. **Get Session in Handler**:
108+
```go
109+
session := mcpCtx.GetKafkaSession(ctx) // or GetPulsarSession
110+
if session == nil {
111+
return mcp.NewToolResultError("session not found"), nil
112+
}
113+
admin, err := session.GetAdminClient()
114+
```
115+
116+
## Session Context Access
117+
118+
Handlers receive sessions via context (see `pkg/mcp/internal/context/ctx.go`):
119+
- `mcpCtx.GetKafkaSession(ctx)``*kafka.Session`
120+
- `mcpCtx.GetPulsarSession(ctx)``*pulsar.Session`
121+
- `mcpCtx.GetSNCloudSession(ctx)``*config.Session`
122+
123+
From sessions:
124+
- `session.GetAdminClient()` / `session.GetAdminV3Client()` for Pulsar admin
125+
- `session.GetPulsarClient()` for Pulsar messaging
126+
- `session.GetAdminClient()` for Kafka admin (via franz-go/kadm)
127+
128+
## Configuration Modes
129+
130+
1. **StreamNative Cloud**: `--organization` + `--key-file`
131+
2. **External Kafka**: `--use-external-kafka` + Kafka params
132+
3. **External Pulsar**: `--use-external-pulsar` + Pulsar params
133+
134+
Pre-configured context: `--pulsar-instance` + `--pulsar-cluster` disables context management tools.
135+
136+
## Error Handling
137+
138+
- Wrap errors: `fmt.Errorf("failed to X: %w", err)`
139+
- Return tool errors: `mcp.NewToolResultError("message")`
140+
- Check session nil before operations
141+
- For PFTools, use circuit breaker to handle repeated failures

Dockerfile

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1+
# Copyright 2025 StreamNative
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
115
# Multi-stage build for multi-platform support
216
FROM --platform=$BUILDPLATFORM golang:1.24-alpine AS builder
317

Dockerfile.goreleaser

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1+
# Copyright 2025 StreamNative
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
115
# Minimal Alpine image for GoReleaser builds
216
FROM alpine:3.21
317

cmd/streamnative-mcp-server/main.go

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
1-
// Licensed to the Apache Software Foundation (ASF) under one
2-
// or more contributor license agreements. See the NOTICE file
3-
// distributed with this work for additional information
4-
// regarding copyright ownership. The ASF licenses this file
5-
// to you under the Apache License, Version 2.0 (the
6-
// "License"); you may not use this file except in compliance
7-
// with the License. You may obtain a copy of the License at
1+
// Copyright 2025 StreamNative
82
//
9-
// http://www.apache.org/licenses/LICENSE-2.0
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
106
//
11-
// Unless required by applicable law or agreed to in writing,
12-
// software distributed under the License is distributed on an
13-
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14-
// KIND, either express or implied. See the License for the
15-
// specific language governing permissions and limitations
16-
// under the License.
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
1714

1815
package main
1916

go.work.sum

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF
6161
github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0=
6262
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
6363
github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible h1:dvc1KSkIYTVjZgHf/CTC2diTYC8PzhaA5sFISRfNVrE=
64+
github.com/dvsekhvalnov/jose2go v1.6.0 h1:Y9gnSnP4qEI0+/uQkHvFXeD2PLPJeXEL+ySMEA2EjTY=
65+
github.com/dvsekhvalnov/jose2go v1.6.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU=
6466
github.com/envoyproxy/go-control-plane v0.9.4 h1:rEvIZUSZ3fx39WIi3JkQqQBitGwpELBIYWeBVh6wn+E=
6567
github.com/envoyproxy/go-control-plane v0.13.1 h1:vPfJZCkob6yTMEgS+0TwfTUfbHjfy/6vOJ8hUWX/uXE=
6668
github.com/envoyproxy/go-control-plane v0.13.1/go.mod h1:X45hY0mufo6Fd0KW3rqsGvQMw58jvjymeCzBU3mWyHw=
@@ -82,6 +84,8 @@ github.com/go-redis/redis v6.15.6+incompatible h1:H9evprGPLI8+ci7fxQx6WNZHJSb7be
8284
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
8385
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
8486
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
87+
github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk=
88+
github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
8589
github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c=
8690
github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo=
8791
github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
@@ -142,6 +146,8 @@ github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+
142146
github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc=
143147
github.com/mark3labs/mcp-go v0.23.1 h1:RzTzZ5kJ+HxwnutKA4rll8N/pKV6Wh5dhCmiJUu5S9I=
144148
github.com/mark3labs/mcp-go v0.23.1/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4=
149+
github.com/mark3labs/mcp-go v0.34.0 h1:eWy7WBGvhk6EyAAyVzivTCprE52iXJwNtvHV6Cv3bR0=
150+
github.com/mark3labs/mcp-go v0.34.0/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4=
145151
github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
146152
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
147153
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
@@ -194,11 +200,17 @@ go.opentelemetry.io/otel/sdk/metric v1.29.0 h1:K2CfmJohnRgvZ9UAj2/FhIf/okdWcNdBw
194200
go.opentelemetry.io/otel/sdk/metric v1.29.0/go.mod h1:6zZLdCl2fkauYoZIOn/soQIDSWFmNSRcICarHfuhNJQ=
195201
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
196202
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
203+
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
204+
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
197205
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 h1:QE6XYQK6naiK1EPAe1g/ILLxN5RBoH5xkJk3CqlMI/Y=
198206
golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4=
199207
golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k=
200208
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs=
201209
golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
210+
golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM=
211+
golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
212+
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
213+
golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
202214
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA=
203215
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
204216
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
@@ -210,7 +222,13 @@ golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
210222
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
211223
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642 h1:B6caxRw+hozq68X2MY7jEpZh/cr4/aHLv9xU8Kkadrw=
212224
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
225+
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
226+
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
227+
golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y=
228+
golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
213229
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
230+
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
231+
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
214232
golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs=
215233
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44=
216234
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=

pkg/auth/auth.go

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
1-
// Licensed to the Apache Software Foundation (ASF) under one
2-
// or more contributor license agreements. See the NOTICE file
3-
// distributed with this work for additional information
4-
// regarding copyright ownership. The ASF licenses this file
5-
// to you under the Apache License, Version 2.0 (the
6-
// "License"); you may not use this file except in compliance
7-
// with the License. You may obtain a copy of the License at
1+
// Copyright 2025 StreamNative
82
//
9-
// http://www.apache.org/licenses/LICENSE-2.0
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
106
//
11-
// Unless required by applicable law or agreed to in writing,
12-
// software distributed under the License is distributed on an
13-
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14-
// KIND, either express or implied. See the License for the
15-
// specific language governing permissions and limitations
16-
// under the License.
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
1714

1815
package auth
1916

0 commit comments

Comments
 (0)