v0.2.0 49ac5fd

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

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