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

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