v0.15.0 e4b332d

token.pb.go RawHistoryFolder

1// SPDX-License-Identifier: MIT
2
3// Code generated by protoc-gen-go. DO NOT EDIT.
4// versions:
5// 	protoc-gen-go v1.36.12
6// 	protoc        (unknown)
7// source: ermite/token.proto
8
9package ermite
10
11import (
12	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
13	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
14	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
15	reflect "reflect"
16	sync "sync"
17	unsafe "unsafe"
18)
19
20const (
21	// Verify that this generated code is sufficiently up-to-date.
22	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
23	// Verify that runtime/protoimpl is sufficiently up-to-date.
24	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
25)
26
27// Scope is a permission carried by a token. The API knows scopes only; any
28// grouping into presets is a client concern.
29type Scope int32
30
31const (
32	// Not set. Rejected in requests, never returned by the server.
33	Scope_SCOPE_UNSPECIFIED Scope = 0
34	// SCOPE_REPO_READ allows reading private repositories (public ones need no
35	// token). Wire name: repo:read.
36	Scope_SCOPE_REPO_READ Scope = 1
37	// SCOPE_REPO_WRITE allows pushing and creating repositories. Wire name:
38	// repo:write.
39	Scope_SCOPE_REPO_WRITE Scope = 2
40	// SCOPE_REPO_ADMIN allows deleting a repository and changing its visibility,
41	// description or default branch. Wire name: repo:admin.
42	Scope_SCOPE_REPO_ADMIN Scope = 3
43	// SCOPE_MR_WRITE allows creating, commenting on and closing merge requests.
44	// Wire name: mr:write.
45	Scope_SCOPE_MR_WRITE Scope = 4
46	// SCOPE_MR_MERGE allows merging merge requests whose checks allow it. Wire name:
47	// mr:merge.
48	Scope_SCOPE_MR_MERGE Scope = 5
49	// SCOPE_CI_WRITE allows re-running or cancelling CI runs. Wire name:
50	// ci:write.
51	Scope_SCOPE_CI_WRITE Scope = 6
52	// SCOPE_SECRETS_WRITE allows managing secrets, variables and environments
53	// (SecretService, VariableService, EnvironmentService), reads included. A
54	// token limited to branches is refused them even with this scope. Wire name:
55	// secrets:write.
56	Scope_SCOPE_SECRETS_WRITE Scope = 7
57	// SCOPE_RUNNER_REGISTER allows registering a CI runner. Wire name:
58	// runner:register.
59	Scope_SCOPE_RUNNER_REGISTER Scope = 8
60	// SCOPE_TOKEN_ADMIN allows creating, listing and revoking tokens. Wire name:
61	// token:admin.
62	Scope_SCOPE_TOKEN_ADMIN Scope = 9
63	// SCOPE_MR_REVIEW allows setting a verdict (approve, changes requested) on
64	// merge request notes. Wire name: mr:review.
65	Scope_SCOPE_MR_REVIEW Scope = 10
66	// SCOPE_ISSUE_WRITE allows creating, commenting on, closing and reopening
67	// issues. Wire name: issue:write.
68	Scope_SCOPE_ISSUE_WRITE Scope = 11
69	// SCOPE_MR_FORCE_MERGE allows merging a merge request whatever its checks
70	// say (MergeMergeRequestRequest.ignore_checks). Wire name: mr:force-merge.
71	Scope_SCOPE_MR_FORCE_MERGE Scope = 12
72)
73
74// Enum value maps for Scope.
75var (
76	Scope_name = map[int32]string{
77		0:  "SCOPE_UNSPECIFIED",
78		1:  "SCOPE_REPO_READ",
79		2:  "SCOPE_REPO_WRITE",
80		3:  "SCOPE_REPO_ADMIN",
81		4:  "SCOPE_MR_WRITE",
82		5:  "SCOPE_MR_MERGE",
83		6:  "SCOPE_CI_WRITE",
84		7:  "SCOPE_SECRETS_WRITE",
85		8:  "SCOPE_RUNNER_REGISTER",
86		9:  "SCOPE_TOKEN_ADMIN",
87		10: "SCOPE_MR_REVIEW",
88		11: "SCOPE_ISSUE_WRITE",
89		12: "SCOPE_MR_FORCE_MERGE",
90	}
91	Scope_value = map[string]int32{
92		"SCOPE_UNSPECIFIED":     0,
93		"SCOPE_REPO_READ":       1,
94		"SCOPE_REPO_WRITE":      2,
95		"SCOPE_REPO_ADMIN":      3,
96		"SCOPE_MR_WRITE":        4,
97		"SCOPE_MR_MERGE":        5,
98		"SCOPE_CI_WRITE":        6,
99		"SCOPE_SECRETS_WRITE":   7,
100		"SCOPE_RUNNER_REGISTER": 8,
101		"SCOPE_TOKEN_ADMIN":     9,
102		"SCOPE_MR_REVIEW":       10,
103		"SCOPE_ISSUE_WRITE":     11,
104		"SCOPE_MR_FORCE_MERGE":  12,
105	}
106)
107
108func (x Scope) Enum() *Scope {
109	p := new(Scope)
110	*p = x
111	return p
112}
113
114func (x Scope) String() string {
115	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
116}
117
118func (Scope) Descriptor() protoreflect.EnumDescriptor {
119	return file_ermite_token_proto_enumTypes[0].Descriptor()
120}
121
122func (Scope) Type() protoreflect.EnumType {
123	return &file_ermite_token_proto_enumTypes[0]
124}
125
126func (x Scope) Number() protoreflect.EnumNumber {
127	return protoreflect.EnumNumber(x)
128}
129
130// Deprecated: Use Scope.Descriptor instead.
131func (Scope) EnumDescriptor() ([]byte, []int) {
132	return file_ermite_token_proto_rawDescGZIP(), []int{0}
133}
134
135// Token describes a stored token. It never contains the secret nor its hash.
136type Token struct {
137	state protoimpl.MessageState `protogen:"open.v1"`
138	// Id identifies the token in ListTokens and RevokeToken. It is not the
139	// secret and cannot be used to authenticate.
140	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
141	// Label is a human-readable name chosen at creation.
142	Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"`
143	// Scopes are the permissions of the token. Never empty.
144	Scopes []Scope `protobuf:"varint,3,rep,packed,name=scopes,proto3,enum=ermite.Scope" json:"scopes,omitempty"`
145	// Repos restricts the token to these repository names. Empty means every
146	// repository.
147	Repos []string `protobuf:"bytes,4,rep,name=repos,proto3" json:"repos,omitempty"`
148	// ExpiresAt is when the token stops working. Unset means it never expires.
149	ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"`
150	// CreatedAt is when the token was created.
151	CreatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
152	// LastUsedAt is when the token last authenticated a request. Unset if never
153	// used. It may lag behind the real time by a short delay.
154	LastUsedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=last_used_at,json=lastUsedAt,proto3" json:"last_used_at,omitempty"`
155	// BranchPrefixes limits the branches the token may write. Each prefix ends
156	// with "/" (for example "agent/claude/"). Empty means every branch. A limited
157	// token can push, force-push and delete only branches under its prefixes; it
158	// cannot push tags or other refs, create repositories, or merge into or
159	// delete a branch outside its prefixes.
160	BranchPrefixes []string `protobuf:"bytes,8,rep,name=branch_prefixes,json=branchPrefixes,proto3" json:"branch_prefixes,omitempty"`
161	unknownFields  protoimpl.UnknownFields
162	sizeCache      protoimpl.SizeCache
163}
164
165func (x *Token) Reset() {
166	*x = Token{}
167	mi := &file_ermite_token_proto_msgTypes[0]
168	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
169	ms.StoreMessageInfo(mi)
170}
171
172func (x *Token) String() string {
173	return protoimpl.X.MessageStringOf(x)
174}
175
176func (*Token) ProtoMessage() {}
177
178func (x *Token) ProtoReflect() protoreflect.Message {
179	mi := &file_ermite_token_proto_msgTypes[0]
180	if x != nil {
181		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
182		if ms.LoadMessageInfo() == nil {
183			ms.StoreMessageInfo(mi)
184		}
185		return ms
186	}
187	return mi.MessageOf(x)
188}
189
190// Deprecated: Use Token.ProtoReflect.Descriptor instead.
191func (*Token) Descriptor() ([]byte, []int) {
192	return file_ermite_token_proto_rawDescGZIP(), []int{0}
193}
194
195func (x *Token) GetId() string {
196	if x != nil {
197		return x.Id
198	}
199	return ""
200}
201
202func (x *Token) GetLabel() string {
203	if x != nil {
204		return x.Label
205	}
206	return ""
207}
208
209func (x *Token) GetScopes() []Scope {
210	if x != nil {
211		return x.Scopes
212	}
213	return nil
214}
215
216func (x *Token) GetRepos() []string {
217	if x != nil {
218		return x.Repos
219	}
220	return nil
221}
222
223func (x *Token) GetExpiresAt() *timestamppb.Timestamp {
224	if x != nil {
225		return x.ExpiresAt
226	}
227	return nil
228}
229
230func (x *Token) GetCreatedAt() *timestamppb.Timestamp {
231	if x != nil {
232		return x.CreatedAt
233	}
234	return nil
235}
236
237func (x *Token) GetLastUsedAt() *timestamppb.Timestamp {
238	if x != nil {
239		return x.LastUsedAt
240	}
241	return nil
242}
243
244func (x *Token) GetBranchPrefixes() []string {
245	if x != nil {
246		return x.BranchPrefixes
247	}
248	return nil
249}
250
251// CreateTokenRequest describes the token to create.
252type CreateTokenRequest struct {
253	state protoimpl.MessageState `protogen:"open.v1"`
254	// Label is a human-readable name, for example "laptop". Not required to be
255	// unique.
256	Label string `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"`
257	// Scopes are the permissions to grant. At least one is required.
258	Scopes []Scope `protobuf:"varint,2,rep,packed,name=scopes,proto3,enum=ermite.Scope" json:"scopes,omitempty"`
259	// Repos restricts the token to these repository names. Empty means every
260	// repository.
261	Repos []string `protobuf:"bytes,3,rep,name=repos,proto3" json:"repos,omitempty"`
262	// ExpiresAt is when the token stops working. Unset means no expiry. It must
263	// be in the future.
264	ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"`
265	// BranchPrefixes limits the branches the token may write, for example
266	// "agent/claude/". Each prefix must end with "/" and be a valid branch name
267	// once the "/" is removed; at most 8 are allowed. Empty means every branch;
268	// a limited token cannot push tags or create repositories. A token that has
269	// prefixes can only create tokens whose prefixes each lie within its own.
270	// Fails with invalid_argument when a prefix is malformed.
271	BranchPrefixes []string `protobuf:"bytes,5,rep,name=branch_prefixes,json=branchPrefixes,proto3" json:"branch_prefixes,omitempty"`
272	unknownFields  protoimpl.UnknownFields
273	sizeCache      protoimpl.SizeCache
274}
275
276func (x *CreateTokenRequest) Reset() {
277	*x = CreateTokenRequest{}
278	mi := &file_ermite_token_proto_msgTypes[1]
279	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
280	ms.StoreMessageInfo(mi)
281}
282
283func (x *CreateTokenRequest) String() string {
284	return protoimpl.X.MessageStringOf(x)
285}
286
287func (*CreateTokenRequest) ProtoMessage() {}
288
289func (x *CreateTokenRequest) ProtoReflect() protoreflect.Message {
290	mi := &file_ermite_token_proto_msgTypes[1]
291	if x != nil {
292		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
293		if ms.LoadMessageInfo() == nil {
294			ms.StoreMessageInfo(mi)
295		}
296		return ms
297	}
298	return mi.MessageOf(x)
299}
300
301// Deprecated: Use CreateTokenRequest.ProtoReflect.Descriptor instead.
302func (*CreateTokenRequest) Descriptor() ([]byte, []int) {
303	return file_ermite_token_proto_rawDescGZIP(), []int{1}
304}
305
306func (x *CreateTokenRequest) GetLabel() string {
307	if x != nil {
308		return x.Label
309	}
310	return ""
311}
312
313func (x *CreateTokenRequest) GetScopes() []Scope {
314	if x != nil {
315		return x.Scopes
316	}
317	return nil
318}
319
320func (x *CreateTokenRequest) GetRepos() []string {
321	if x != nil {
322		return x.Repos
323	}
324	return nil
325}
326
327func (x *CreateTokenRequest) GetExpiresAt() *timestamppb.Timestamp {
328	if x != nil {
329		return x.ExpiresAt
330	}
331	return nil
332}
333
334func (x *CreateTokenRequest) GetBranchPrefixes() []string {
335	if x != nil {
336		return x.BranchPrefixes
337	}
338	return nil
339}
340
341// CreateTokenResponse holds the new token and its secret.
342type CreateTokenResponse struct {
343	state protoimpl.MessageState `protogen:"open.v1"`
344	// Token describes the created token.
345	Token *Token `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"`
346	// Secret is the bearer secret to present as "Authorization: Bearer <secret>".
347	// It is returned once and never stored in clear text by the server.
348	Secret        string `protobuf:"bytes,2,opt,name=secret,proto3" json:"secret,omitempty"`
349	unknownFields protoimpl.UnknownFields
350	sizeCache     protoimpl.SizeCache
351}
352
353func (x *CreateTokenResponse) Reset() {
354	*x = CreateTokenResponse{}
355	mi := &file_ermite_token_proto_msgTypes[2]
356	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
357	ms.StoreMessageInfo(mi)
358}
359
360func (x *CreateTokenResponse) String() string {
361	return protoimpl.X.MessageStringOf(x)
362}
363
364func (*CreateTokenResponse) ProtoMessage() {}
365
366func (x *CreateTokenResponse) ProtoReflect() protoreflect.Message {
367	mi := &file_ermite_token_proto_msgTypes[2]
368	if x != nil {
369		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
370		if ms.LoadMessageInfo() == nil {
371			ms.StoreMessageInfo(mi)
372		}
373		return ms
374	}
375	return mi.MessageOf(x)
376}
377
378// Deprecated: Use CreateTokenResponse.ProtoReflect.Descriptor instead.
379func (*CreateTokenResponse) Descriptor() ([]byte, []int) {
380	return file_ermite_token_proto_rawDescGZIP(), []int{2}
381}
382
383func (x *CreateTokenResponse) GetToken() *Token {
384	if x != nil {
385		return x.Token
386	}
387	return nil
388}
389
390func (x *CreateTokenResponse) GetSecret() string {
391	if x != nil {
392		return x.Secret
393	}
394	return ""
395}
396
397// ListTokensRequest selects a page of tokens.
398type ListTokensRequest struct {
399	state protoimpl.MessageState `protogen:"open.v1"`
400	// PageSize is the maximum number of tokens to return. 0 means the server
401	// default; values above the server maximum are lowered to it.
402	PageSize int32 `protobuf:"varint,1,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
403	// PageToken is the next_page_token of a previous response. Empty for the
404	// first page.
405	PageToken     string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
406	unknownFields protoimpl.UnknownFields
407	sizeCache     protoimpl.SizeCache
408}
409
410func (x *ListTokensRequest) Reset() {
411	*x = ListTokensRequest{}
412	mi := &file_ermite_token_proto_msgTypes[3]
413	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
414	ms.StoreMessageInfo(mi)
415}
416
417func (x *ListTokensRequest) String() string {
418	return protoimpl.X.MessageStringOf(x)
419}
420
421func (*ListTokensRequest) ProtoMessage() {}
422
423func (x *ListTokensRequest) ProtoReflect() protoreflect.Message {
424	mi := &file_ermite_token_proto_msgTypes[3]
425	if x != nil {
426		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
427		if ms.LoadMessageInfo() == nil {
428			ms.StoreMessageInfo(mi)
429		}
430		return ms
431	}
432	return mi.MessageOf(x)
433}
434
435// Deprecated: Use ListTokensRequest.ProtoReflect.Descriptor instead.
436func (*ListTokensRequest) Descriptor() ([]byte, []int) {
437	return file_ermite_token_proto_rawDescGZIP(), []int{3}
438}
439
440func (x *ListTokensRequest) GetPageSize() int32 {
441	if x != nil {
442		return x.PageSize
443	}
444	return 0
445}
446
447func (x *ListTokensRequest) GetPageToken() string {
448	if x != nil {
449		return x.PageToken
450	}
451	return ""
452}
453
454// ListTokensResponse is one page of tokens.
455type ListTokensResponse struct {
456	state protoimpl.MessageState `protogen:"open.v1"`
457	// Tokens are the tokens of this page, newest first.
458	Tokens []*Token `protobuf:"bytes,1,rep,name=tokens,proto3" json:"tokens,omitempty"`
459	// NextPageToken is passed as page_token to get the next page. Empty when
460	// there is no next page.
461	NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
462	unknownFields protoimpl.UnknownFields
463	sizeCache     protoimpl.SizeCache
464}
465
466func (x *ListTokensResponse) Reset() {
467	*x = ListTokensResponse{}
468	mi := &file_ermite_token_proto_msgTypes[4]
469	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
470	ms.StoreMessageInfo(mi)
471}
472
473func (x *ListTokensResponse) String() string {
474	return protoimpl.X.MessageStringOf(x)
475}
476
477func (*ListTokensResponse) ProtoMessage() {}
478
479func (x *ListTokensResponse) ProtoReflect() protoreflect.Message {
480	mi := &file_ermite_token_proto_msgTypes[4]
481	if x != nil {
482		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
483		if ms.LoadMessageInfo() == nil {
484			ms.StoreMessageInfo(mi)
485		}
486		return ms
487	}
488	return mi.MessageOf(x)
489}
490
491// Deprecated: Use ListTokensResponse.ProtoReflect.Descriptor instead.
492func (*ListTokensResponse) Descriptor() ([]byte, []int) {
493	return file_ermite_token_proto_rawDescGZIP(), []int{4}
494}
495
496func (x *ListTokensResponse) GetTokens() []*Token {
497	if x != nil {
498		return x.Tokens
499	}
500	return nil
501}
502
503func (x *ListTokensResponse) GetNextPageToken() string {
504	if x != nil {
505		return x.NextPageToken
506	}
507	return ""
508}
509
510// RevokeTokenRequest names the token to revoke.
511type RevokeTokenRequest struct {
512	state protoimpl.MessageState `protogen:"open.v1"`
513	// Id is the Token.id to revoke.
514	Id            string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
515	unknownFields protoimpl.UnknownFields
516	sizeCache     protoimpl.SizeCache
517}
518
519func (x *RevokeTokenRequest) Reset() {
520	*x = RevokeTokenRequest{}
521	mi := &file_ermite_token_proto_msgTypes[5]
522	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
523	ms.StoreMessageInfo(mi)
524}
525
526func (x *RevokeTokenRequest) String() string {
527	return protoimpl.X.MessageStringOf(x)
528}
529
530func (*RevokeTokenRequest) ProtoMessage() {}
531
532func (x *RevokeTokenRequest) ProtoReflect() protoreflect.Message {
533	mi := &file_ermite_token_proto_msgTypes[5]
534	if x != nil {
535		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
536		if ms.LoadMessageInfo() == nil {
537			ms.StoreMessageInfo(mi)
538		}
539		return ms
540	}
541	return mi.MessageOf(x)
542}
543
544// Deprecated: Use RevokeTokenRequest.ProtoReflect.Descriptor instead.
545func (*RevokeTokenRequest) Descriptor() ([]byte, []int) {
546	return file_ermite_token_proto_rawDescGZIP(), []int{5}
547}
548
549func (x *RevokeTokenRequest) GetId() string {
550	if x != nil {
551		return x.Id
552	}
553	return ""
554}
555
556// RevokeTokenResponse is empty.
557type RevokeTokenResponse struct {
558	state         protoimpl.MessageState `protogen:"open.v1"`
559	unknownFields protoimpl.UnknownFields
560	sizeCache     protoimpl.SizeCache
561}
562
563func (x *RevokeTokenResponse) Reset() {
564	*x = RevokeTokenResponse{}
565	mi := &file_ermite_token_proto_msgTypes[6]
566	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
567	ms.StoreMessageInfo(mi)
568}
569
570func (x *RevokeTokenResponse) String() string {
571	return protoimpl.X.MessageStringOf(x)
572}
573
574func (*RevokeTokenResponse) ProtoMessage() {}
575
576func (x *RevokeTokenResponse) ProtoReflect() protoreflect.Message {
577	mi := &file_ermite_token_proto_msgTypes[6]
578	if x != nil {
579		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
580		if ms.LoadMessageInfo() == nil {
581			ms.StoreMessageInfo(mi)
582		}
583		return ms
584	}
585	return mi.MessageOf(x)
586}
587
588// Deprecated: Use RevokeTokenResponse.ProtoReflect.Descriptor instead.
589func (*RevokeTokenResponse) Descriptor() ([]byte, []int) {
590	return file_ermite_token_proto_rawDescGZIP(), []int{6}
591}
592
593var File_ermite_token_proto protoreflect.FileDescriptor
594
595const file_ermite_token_proto_rawDesc = "" +
596	"\n" +
597	"\x12ermite/token.proto\x12\x06ermite\x1a\x1fgoogle/protobuf/timestamp.proto\"\xc7\x02\n" +
598	"\x05Token\x12\x0e\n" +
599	"\x02id\x18\x01 \x01(\tR\x02id\x12\x14\n" +
600	"\x05label\x18\x02 \x01(\tR\x05label\x12%\n" +
601	"\x06scopes\x18\x03 \x03(\x0e2\r.ermite.ScopeR\x06scopes\x12\x14\n" +
602	"\x05repos\x18\x04 \x03(\tR\x05repos\x129\n" +
603	"\n" +
604	"expires_at\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\texpiresAt\x129\n" +
605	"\n" +
606	"created_at\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x12<\n" +
607	"\flast_used_at\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\n" +
608	"lastUsedAt\x12'\n" +
609	"\x0fbranch_prefixes\x18\b \x03(\tR\x0ebranchPrefixes\"\xcb\x01\n" +
610	"\x12CreateTokenRequest\x12\x14\n" +
611	"\x05label\x18\x01 \x01(\tR\x05label\x12%\n" +
612	"\x06scopes\x18\x02 \x03(\x0e2\r.ermite.ScopeR\x06scopes\x12\x14\n" +
613	"\x05repos\x18\x03 \x03(\tR\x05repos\x129\n" +
614	"\n" +
615	"expires_at\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\texpiresAt\x12'\n" +
616	"\x0fbranch_prefixes\x18\x05 \x03(\tR\x0ebranchPrefixes\"R\n" +
617	"\x13CreateTokenResponse\x12#\n" +
618	"\x05token\x18\x01 \x01(\v2\r.ermite.TokenR\x05token\x12\x16\n" +
619	"\x06secret\x18\x02 \x01(\tR\x06secret\"O\n" +
620	"\x11ListTokensRequest\x12\x1b\n" +
621	"\tpage_size\x18\x01 \x01(\x05R\bpageSize\x12\x1d\n" +
622	"\n" +
623	"page_token\x18\x02 \x01(\tR\tpageToken\"c\n" +
624	"\x12ListTokensResponse\x12%\n" +
625	"\x06tokens\x18\x01 \x03(\v2\r.ermite.TokenR\x06tokens\x12&\n" +
626	"\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\"$\n" +
627	"\x12RevokeTokenRequest\x12\x0e\n" +
628	"\x02id\x18\x01 \x01(\tR\x02id\"\x15\n" +
629	"\x13RevokeTokenResponse*\xac\x02\n" +
630	"\x05Scope\x12\x15\n" +
631	"\x11SCOPE_UNSPECIFIED\x10\x00\x12\x13\n" +
632	"\x0fSCOPE_REPO_READ\x10\x01\x12\x14\n" +
633	"\x10SCOPE_REPO_WRITE\x10\x02\x12\x14\n" +
634	"\x10SCOPE_REPO_ADMIN\x10\x03\x12\x12\n" +
635	"\x0eSCOPE_MR_WRITE\x10\x04\x12\x12\n" +
636	"\x0eSCOPE_MR_MERGE\x10\x05\x12\x12\n" +
637	"\x0eSCOPE_CI_WRITE\x10\x06\x12\x17\n" +
638	"\x13SCOPE_SECRETS_WRITE\x10\a\x12\x19\n" +
639	"\x15SCOPE_RUNNER_REGISTER\x10\b\x12\x15\n" +
640	"\x11SCOPE_TOKEN_ADMIN\x10\t\x12\x13\n" +
641	"\x0fSCOPE_MR_REVIEW\x10\n" +
642	"\x12\x15\n" +
643	"\x11SCOPE_ISSUE_WRITE\x10\v\x12\x18\n" +
644	"\x14SCOPE_MR_FORCE_MERGE\x10\f2\xe3\x01\n" +
645	"\fTokenService\x12F\n" +
646	"\vCreateToken\x12\x1a.ermite.CreateTokenRequest\x1a\x1b.ermite.CreateTokenResponse\x12C\n" +
647	"\n" +
648	"ListTokens\x12\x19.ermite.ListTokensRequest\x1a\x1a.ermite.ListTokensResponse\x12F\n" +
649	"\vRevokeToken\x12\x1a.ermite.RevokeTokenRequest\x1a\x1b.ermite.RevokeTokenResponseBq\n" +
650	"\n" +
651	"com.ermiteB\n" +
652	"TokenProtoP\x01Z\x1fbnema.dev/ermite-api/gen/ermite\xa2\x02\x03EXX\xaa\x02\x06Ermite\xca\x02\x06Ermite\xe2\x02\x12Ermite\\GPBMetadata\xea\x02\x06Ermiteb\x06proto3"
653
654var (
655	file_ermite_token_proto_rawDescOnce sync.Once
656	file_ermite_token_proto_rawDescData []byte
657)
658
659func file_ermite_token_proto_rawDescGZIP() []byte {
660	file_ermite_token_proto_rawDescOnce.Do(func() {
661		file_ermite_token_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_ermite_token_proto_rawDesc), len(file_ermite_token_proto_rawDesc)))
662	})
663	return file_ermite_token_proto_rawDescData
664}
665
666var file_ermite_token_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
667var file_ermite_token_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
668var file_ermite_token_proto_goTypes = []any{
669	(Scope)(0),                    // 0: ermite.Scope
670	(*Token)(nil),                 // 1: ermite.Token
671	(*CreateTokenRequest)(nil),    // 2: ermite.CreateTokenRequest
672	(*CreateTokenResponse)(nil),   // 3: ermite.CreateTokenResponse
673	(*ListTokensRequest)(nil),     // 4: ermite.ListTokensRequest
674	(*ListTokensResponse)(nil),    // 5: ermite.ListTokensResponse
675	(*RevokeTokenRequest)(nil),    // 6: ermite.RevokeTokenRequest
676	(*RevokeTokenResponse)(nil),   // 7: ermite.RevokeTokenResponse
677	(*timestamppb.Timestamp)(nil), // 8: google.protobuf.Timestamp
678}
679var file_ermite_token_proto_depIdxs = []int32{
680	0,  // 0: ermite.Token.scopes:type_name -> ermite.Scope
681	8,  // 1: ermite.Token.expires_at:type_name -> google.protobuf.Timestamp
682	8,  // 2: ermite.Token.created_at:type_name -> google.protobuf.Timestamp
683	8,  // 3: ermite.Token.last_used_at:type_name -> google.protobuf.Timestamp
684	0,  // 4: ermite.CreateTokenRequest.scopes:type_name -> ermite.Scope
685	8,  // 5: ermite.CreateTokenRequest.expires_at:type_name -> google.protobuf.Timestamp
686	1,  // 6: ermite.CreateTokenResponse.token:type_name -> ermite.Token
687	1,  // 7: ermite.ListTokensResponse.tokens:type_name -> ermite.Token
688	2,  // 8: ermite.TokenService.CreateToken:input_type -> ermite.CreateTokenRequest
689	4,  // 9: ermite.TokenService.ListTokens:input_type -> ermite.ListTokensRequest
690	6,  // 10: ermite.TokenService.RevokeToken:input_type -> ermite.RevokeTokenRequest
691	3,  // 11: ermite.TokenService.CreateToken:output_type -> ermite.CreateTokenResponse
692	5,  // 12: ermite.TokenService.ListTokens:output_type -> ermite.ListTokensResponse
693	7,  // 13: ermite.TokenService.RevokeToken:output_type -> ermite.RevokeTokenResponse
694	11, // [11:14] is the sub-list for method output_type
695	8,  // [8:11] is the sub-list for method input_type
696	8,  // [8:8] is the sub-list for extension type_name
697	8,  // [8:8] is the sub-list for extension extendee
698	0,  // [0:8] is the sub-list for field type_name
699}
700
701func init() { file_ermite_token_proto_init() }
702func file_ermite_token_proto_init() {
703	if File_ermite_token_proto != nil {
704		return
705	}
706	type x struct{}
707	out := protoimpl.TypeBuilder{
708		File: protoimpl.DescBuilder{
709			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
710			RawDescriptor: unsafe.Slice(unsafe.StringData(file_ermite_token_proto_rawDesc), len(file_ermite_token_proto_rawDesc)),
711			NumEnums:      1,
712			NumMessages:   7,
713			NumExtensions: 0,
714			NumServices:   1,
715		},
716		GoTypes:           file_ermite_token_proto_goTypes,
717		DependencyIndexes: file_ermite_token_proto_depIdxs,
718		EnumInfos:         file_ermite_token_proto_enumTypes,
719		MessageInfos:      file_ermite_token_proto_msgTypes,
720	}.Build()
721	File_ermite_token_proto = out.File
722	file_ermite_token_proto_goTypes = nil
723	file_ermite_token_proto_depIdxs = nil
724}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 2

Tags 18

↑↓ moveenter openesc close