@kojinx/github 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { Component, Input } from '@angular/core';
1
+ import { Component, Input, signal } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "../../services/github-auth.service";
@@ -6,6 +6,13 @@ export class GithubIntegrationCardComponent {
6
6
  constructor(githubAuth) {
7
7
  this.githubAuth = githubAuth;
8
8
  this.isConnected = false;
9
+ this.showModal = signal(false);
10
+ }
11
+ openModal() {
12
+ this.showModal.set(true);
13
+ }
14
+ closeModal(event) {
15
+ this.showModal.set(false);
9
16
  }
10
17
  link() {
11
18
  this.githubAuth.linkGithub();
@@ -15,34 +22,97 @@ export class GithubIntegrationCardComponent {
15
22
  }
16
23
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GithubIntegrationCardComponent, deps: [{ token: i1.GithubAuthService }], target: i0.ɵɵFactoryTarget.Component }); }
17
24
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: GithubIntegrationCardComponent, isStandalone: true, selector: "github-integration-card", inputs: { isConnected: "isConnected" }, ngImport: i0, template: `
18
- <div class="bg-black/30 border border-white/5 rounded-xl p-6 hover:border-white/10 transition-colors">
19
- <div class="flex items-start justify-between">
25
+ <!-- The Card -->
26
+ <div (click)="openModal()" class="group cursor-pointer relative p-6 rounded-xl bg-kojinx-panel border border-kojinx-border hover:border-white/30 transition-colors">
27
+ <div class="flex items-center justify-between">
20
28
  <div class="flex items-center gap-4">
21
- <div class="w-12 h-12 rounded-xl bg-[#24292e] flex items-center justify-center">
22
- <svg class="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
29
+ <div class="w-12 h-12 rounded-xl bg-white/10 flex items-center justify-center border border-white/20">
30
+ <svg class="w-7 h-7 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
23
31
  <path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd" />
24
32
  </svg>
25
33
  </div>
26
34
  <div>
27
- <h3 class="text-white font-medium">GitHub</h3>
28
- <p class="text-white/60 text-sm mt-1">Connect your repositories and manage PRs directly from Kojinx.</p>
35
+ <p class="text-base font-semibold text-white group-hover:text-gray-300 transition-colors">GitHub</p>
36
+ <p class="text-sm text-kojinx-text-muted mt-0.5">Log in to automatically pull profile data and projects.</p>
29
37
  </div>
30
38
  </div>
31
- @if (isConnected) {
32
- <div class="flex flex-col items-end gap-2">
33
- <span class="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium bg-emerald-500/10 text-emerald-400 border border-emerald-500/20">
34
- <span class="w-1.5 h-1.5 rounded-full bg-emerald-400"></span>
39
+ <div class="pr-6">
40
+ @if (isConnected) {
41
+ <span class="inline-flex items-center gap-1.5 px-4 py-2 rounded-lg bg-green-500/10 border border-green-500/30 text-green-400 text-sm font-bold font-mono">
42
+ <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
43
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M5 13l4 4L19 7"/>
44
+ </svg>
35
45
  Connected
36
46
  </span>
37
- <button (click)="unlink()" class="text-xs text-red-400 hover:text-red-300 transition-colors">Disconnect</button>
38
- </div>
39
- } @else {
40
- <button (click)="link()" class="px-4 py-2 bg-white/5 hover:bg-white/10 border border-white/10 rounded-lg text-sm text-white font-medium transition-all focus:outline-none focus:border-kojinx-purple">
41
- Connect
42
- </button>
43
- }
47
+ } @else {
48
+ <span class="inline-flex items-center gap-1.5 px-4 py-2 rounded-lg bg-white/5 border border-white/10 text-white text-sm font-bold font-mono group-hover:bg-white/10 transition-colors">
49
+ Connect
50
+ </span>
51
+ }
52
+ </div>
44
53
  </div>
45
54
  </div>
55
+
56
+ <!-- The Modal -->
57
+ @if (showModal()) {
58
+ <div class="fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm animate-fade-in" (click)="closeModal($event)">
59
+ <div class="bg-kojinx-panel border border-kojinx-border rounded-2xl w-full max-w-lg shadow-2xl overflow-hidden flex flex-col" (click)="$event.stopPropagation()">
60
+
61
+ <div class="p-6 border-b border-white/5 flex items-center justify-between">
62
+ <h2 class="text-xl font-bold text-white flex items-center gap-3">
63
+ <svg class="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
64
+ <path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd" />
65
+ </svg>
66
+ GitHub Integration
67
+ </h2>
68
+ <button (click)="showModal.set(false)" class="text-white/40 hover:text-white transition-colors p-1 rounded-lg hover:bg-white/5">
69
+ <svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
70
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
71
+ </svg>
72
+ </button>
73
+ </div>
74
+
75
+ <div class="p-6 space-y-6">
76
+
77
+ <div class="bg-kojinx-blue/10 border border-kojinx-blue/30 rounded-xl p-4 text-sm text-slate-300">
78
+ <p>Log in to automatically pull your profile data and discover your projects.</p>
79
+ <p class="mt-2 text-kojinx-blue font-medium">Note: Kojinx uses fine-grained GitHub App permissions (Metadata only). It does not have access to read or modify your source code.</p>
80
+ </div>
81
+
82
+ <div class="flex items-start gap-3.5 p-4 bg-black/20 border border-white/5 rounded-xl">
83
+ <div class="p-2 rounded-lg bg-green-500/10 border border-green-500/20 text-green-400 shrink-0 mt-0.5">
84
+ <svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
85
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/>
86
+ </svg>
87
+ </div>
88
+ <div>
89
+ <p class="text-sm font-semibold text-white">Fine-Grained Security Model</p>
90
+ <p class="text-xs text-kojinx-text-muted mt-1 leading-relaxed">
91
+ Your repositories are listed via GitHub App tokens with strictly <span class="text-slate-200 font-mono">metadata:read</span>. Source code and commit access are cryptographically blocked by the GitHub API.
92
+ </p>
93
+ </div>
94
+ </div>
95
+
96
+ </div>
97
+
98
+ <div class="p-6 border-t border-white/5 flex items-center justify-between bg-black/20">
99
+ @if (isConnected) {
100
+ <button (click)="unlink(); showModal.set(false)" class="px-4 py-2 rounded-lg text-sm font-medium bg-red-500/10 text-red-400 hover:bg-red-500/20 border border-red-500/20 transition-colors">
101
+ Disconnect GitHub
102
+ </button>
103
+ <button (click)="showModal.set(false)" class="px-6 py-2 rounded-lg text-sm font-medium bg-white/5 text-white hover:bg-white/10 border border-white/10 transition-colors ml-auto">
104
+ Done
105
+ </button>
106
+ } @else {
107
+ <button (click)="link(); showModal.set(false)" class="px-6 py-2 rounded-lg text-sm font-medium bg-white text-black hover:bg-gray-200 transition-colors ml-auto">
108
+ Connect GitHub
109
+ </button>
110
+ }
111
+ </div>
112
+
113
+ </div>
114
+ </div>
115
+ }
46
116
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
47
117
  }
48
118
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GithubIntegrationCardComponent, decorators: [{
@@ -52,37 +122,100 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
52
122
  standalone: true,
53
123
  imports: [CommonModule],
54
124
  template: `
55
- <div class="bg-black/30 border border-white/5 rounded-xl p-6 hover:border-white/10 transition-colors">
56
- <div class="flex items-start justify-between">
125
+ <!-- The Card -->
126
+ <div (click)="openModal()" class="group cursor-pointer relative p-6 rounded-xl bg-kojinx-panel border border-kojinx-border hover:border-white/30 transition-colors">
127
+ <div class="flex items-center justify-between">
57
128
  <div class="flex items-center gap-4">
58
- <div class="w-12 h-12 rounded-xl bg-[#24292e] flex items-center justify-center">
59
- <svg class="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
129
+ <div class="w-12 h-12 rounded-xl bg-white/10 flex items-center justify-center border border-white/20">
130
+ <svg class="w-7 h-7 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
60
131
  <path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd" />
61
132
  </svg>
62
133
  </div>
63
134
  <div>
64
- <h3 class="text-white font-medium">GitHub</h3>
65
- <p class="text-white/60 text-sm mt-1">Connect your repositories and manage PRs directly from Kojinx.</p>
135
+ <p class="text-base font-semibold text-white group-hover:text-gray-300 transition-colors">GitHub</p>
136
+ <p class="text-sm text-kojinx-text-muted mt-0.5">Log in to automatically pull profile data and projects.</p>
66
137
  </div>
67
138
  </div>
68
- @if (isConnected) {
69
- <div class="flex flex-col items-end gap-2">
70
- <span class="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium bg-emerald-500/10 text-emerald-400 border border-emerald-500/20">
71
- <span class="w-1.5 h-1.5 rounded-full bg-emerald-400"></span>
139
+ <div class="pr-6">
140
+ @if (isConnected) {
141
+ <span class="inline-flex items-center gap-1.5 px-4 py-2 rounded-lg bg-green-500/10 border border-green-500/30 text-green-400 text-sm font-bold font-mono">
142
+ <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
143
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M5 13l4 4L19 7"/>
144
+ </svg>
72
145
  Connected
73
146
  </span>
74
- <button (click)="unlink()" class="text-xs text-red-400 hover:text-red-300 transition-colors">Disconnect</button>
75
- </div>
76
- } @else {
77
- <button (click)="link()" class="px-4 py-2 bg-white/5 hover:bg-white/10 border border-white/10 rounded-lg text-sm text-white font-medium transition-all focus:outline-none focus:border-kojinx-purple">
78
- Connect
79
- </button>
80
- }
147
+ } @else {
148
+ <span class="inline-flex items-center gap-1.5 px-4 py-2 rounded-lg bg-white/5 border border-white/10 text-white text-sm font-bold font-mono group-hover:bg-white/10 transition-colors">
149
+ Connect
150
+ </span>
151
+ }
152
+ </div>
81
153
  </div>
82
154
  </div>
155
+
156
+ <!-- The Modal -->
157
+ @if (showModal()) {
158
+ <div class="fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm animate-fade-in" (click)="closeModal($event)">
159
+ <div class="bg-kojinx-panel border border-kojinx-border rounded-2xl w-full max-w-lg shadow-2xl overflow-hidden flex flex-col" (click)="$event.stopPropagation()">
160
+
161
+ <div class="p-6 border-b border-white/5 flex items-center justify-between">
162
+ <h2 class="text-xl font-bold text-white flex items-center gap-3">
163
+ <svg class="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
164
+ <path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd" />
165
+ </svg>
166
+ GitHub Integration
167
+ </h2>
168
+ <button (click)="showModal.set(false)" class="text-white/40 hover:text-white transition-colors p-1 rounded-lg hover:bg-white/5">
169
+ <svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
170
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
171
+ </svg>
172
+ </button>
173
+ </div>
174
+
175
+ <div class="p-6 space-y-6">
176
+
177
+ <div class="bg-kojinx-blue/10 border border-kojinx-blue/30 rounded-xl p-4 text-sm text-slate-300">
178
+ <p>Log in to automatically pull your profile data and discover your projects.</p>
179
+ <p class="mt-2 text-kojinx-blue font-medium">Note: Kojinx uses fine-grained GitHub App permissions (Metadata only). It does not have access to read or modify your source code.</p>
180
+ </div>
181
+
182
+ <div class="flex items-start gap-3.5 p-4 bg-black/20 border border-white/5 rounded-xl">
183
+ <div class="p-2 rounded-lg bg-green-500/10 border border-green-500/20 text-green-400 shrink-0 mt-0.5">
184
+ <svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
185
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/>
186
+ </svg>
187
+ </div>
188
+ <div>
189
+ <p class="text-sm font-semibold text-white">Fine-Grained Security Model</p>
190
+ <p class="text-xs text-kojinx-text-muted mt-1 leading-relaxed">
191
+ Your repositories are listed via GitHub App tokens with strictly <span class="text-slate-200 font-mono">metadata:read</span>. Source code and commit access are cryptographically blocked by the GitHub API.
192
+ </p>
193
+ </div>
194
+ </div>
195
+
196
+ </div>
197
+
198
+ <div class="p-6 border-t border-white/5 flex items-center justify-between bg-black/20">
199
+ @if (isConnected) {
200
+ <button (click)="unlink(); showModal.set(false)" class="px-4 py-2 rounded-lg text-sm font-medium bg-red-500/10 text-red-400 hover:bg-red-500/20 border border-red-500/20 transition-colors">
201
+ Disconnect GitHub
202
+ </button>
203
+ <button (click)="showModal.set(false)" class="px-6 py-2 rounded-lg text-sm font-medium bg-white/5 text-white hover:bg-white/10 border border-white/10 transition-colors ml-auto">
204
+ Done
205
+ </button>
206
+ } @else {
207
+ <button (click)="link(); showModal.set(false)" class="px-6 py-2 rounded-lg text-sm font-medium bg-white text-black hover:bg-gray-200 transition-colors ml-auto">
208
+ Connect GitHub
209
+ </button>
210
+ }
211
+ </div>
212
+
213
+ </div>
214
+ </div>
215
+ }
83
216
  `
84
217
  }]
85
218
  }], ctorParameters: () => [{ type: i1.GithubAuthService }], propDecorators: { isConnected: [{
86
219
  type: Input
87
220
  }] } });
88
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWludGVncmF0aW9uLWNhcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva29qaW54L2dpdGh1Yi9zcmMvbGliL2NvbXBvbmVudHMvZ2l0aHViLWludGVncmF0aW9uLWNhcmQvZ2l0aHViLWludGVncmF0aW9uLWNhcmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7O0FBc0MvQyxNQUFNLE9BQU8sOEJBQThCO0lBRXpDLFlBQW9CLFVBQTZCO1FBQTdCLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBRHhDLGdCQUFXLEdBQVksS0FBSyxDQUFDO0lBQ2MsQ0FBQztJQUVyRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDakMsQ0FBQzsrR0FWVSw4QkFBOEI7bUdBQTlCLDhCQUE4QiwySEEvQi9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCVCwyREE5QlMsWUFBWTs7NEZBZ0NYLDhCQUE4QjtrQkFuQzFDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHlCQUF5QjtvQkFDbkMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCVDtpQkFDRjtzRkFFVSxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEdpdGh1YkF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZ2l0aHViLWF1dGguc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2dpdGh1Yi1pbnRlZ3JhdGlvbi1jYXJkJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImJnLWJsYWNrLzMwIGJvcmRlciBib3JkZXItd2hpdGUvNSByb3VuZGVkLXhsIHAtNiBob3Zlcjpib3JkZXItd2hpdGUvMTAgdHJhbnNpdGlvbi1jb2xvcnNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLXN0YXJ0IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMiBoLTEyIHJvdW5kZWQteGwgYmctWyMyNDI5MmVdIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwidy02IGgtNiB0ZXh0LXdoaXRlXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMTIgMkM2LjQ3NyAyIDIgNi40ODQgMiAxMi4wMTdjMCA0LjQyNSAyLjg2NSA4LjE4IDYuODM5IDkuNTA0LjUuMDkyLjY4Mi0uMjE3LjY4Mi0uNDgzIDAtLjIzNy0uMDA4LS44NjgtLjAxMy0xLjcwMy0yLjc4Mi42MDUtMy4zNjktMS4zNDMtMy4zNjktMS4zNDMtLjQ1NC0xLjE1OC0xLjExLTEuNDY2LTEuMTEtMS40NjYtLjkwOC0uNjIuMDY5LS42MDguMDY5LS42MDggMS4wMDMuMDcgMS41MzEgMS4wMzIgMS41MzEgMS4wMzIuODkyIDEuNTMgMi4zNDEgMS4wODggMi45MS44MzIuMDkyLS42NDcuMzUtMS4wODguNjM2LTEuMzM4LTIuMjItLjI1My00LjU1NS0xLjExMy00LjU1NS00Ljk1MSAwLTEuMDkzLjM5LTEuOTg4IDEuMDI5LTIuNjg4LS4xMDMtLjI1My0uNDQ2LTEuMjcyLjA5OC0yLjY1IDAgMCAuODQtLjI3IDIuNzUgMS4wMjZBOS41NjQgOS41NjQgMCAwMTEyIDYuODQ0Yy44NS4wMDQgMS43MDUuMTE1IDIuNTA0LjMzNyAxLjkwOS0xLjI5NiAyLjc0Ny0xLjAyNyAyLjc0Ny0xLjAyNy41NDYgMS4zNzkuMjAyIDIuMzk4LjEgMi42NTEuNjQuNyAxLjAyOCAxLjU5NSAxLjAyOCAyLjY4OCAwIDMuODQ4LTIuMzM5IDQuNjk1LTQuNTY2IDQuOTQzLjM1OS4zMDkuNjc4LjkyLjY3OCAxLjg1NSAwIDEuMzM4LS4wMTIgMi40MTktLjAxMiAyLjc0NyAwIC4yNjguMTguNTguNjg4LjQ4MkExMC4wMTkgMTAuMDE5IDAgMDAyMiAxMi4wMTdDMjIgNi40ODQgMTcuNTIyIDIgMTIgMnpcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8aDMgY2xhc3M9XCJ0ZXh0LXdoaXRlIGZvbnQtbWVkaXVtXCI+R2l0SHViPC9oMz5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC13aGl0ZS82MCB0ZXh0LXNtIG10LTFcIj5Db25uZWN0IHlvdXIgcmVwb3NpdG9yaWVzIGFuZCBtYW5hZ2UgUFJzIGRpcmVjdGx5IGZyb20gS29qaW54LjwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZiAoaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1lbmQgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgcHgtMi41IHB5LTEgcm91bmRlZC1mdWxsIHRleHQteHMgZm9udC1tZWRpdW0gYmctZW1lcmFsZC01MDAvMTAgdGV4dC1lbWVyYWxkLTQwMCBib3JkZXIgYm9yZGVyLWVtZXJhbGQtNTAwLzIwXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidy0xLjUgaC0xLjUgcm91bmRlZC1mdWxsIGJnLWVtZXJhbGQtNDAwXCI+PC9zcGFuPlxuICAgICAgICAgICAgICBDb25uZWN0ZWRcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInVubGluaygpXCIgY2xhc3M9XCJ0ZXh0LXhzIHRleHQtcmVkLTQwMCBob3Zlcjp0ZXh0LXJlZC0zMDAgdHJhbnNpdGlvbi1jb2xvcnNcIj5EaXNjb25uZWN0PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImxpbmsoKVwiIGNsYXNzPVwicHgtNCBweS0yIGJnLXdoaXRlLzUgaG92ZXI6Ymctd2hpdGUvMTAgYm9yZGVyIGJvcmRlci13aGl0ZS8xMCByb3VuZGVkLWxnIHRleHQtc20gdGV4dC13aGl0ZSBmb250LW1lZGl1bSB0cmFuc2l0aW9uLWFsbCBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLWtvamlueC1wdXJwbGVcIj5cbiAgICAgICAgICAgIENvbm5lY3RcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgR2l0aHViSW50ZWdyYXRpb25DYXJkQ29tcG9uZW50IHtcbiAgQElucHV0KCkgaXNDb25uZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBnaXRodWJBdXRoOiBHaXRodWJBdXRoU2VydmljZSkge31cbiAgXG4gIGxpbmsoKSB7XG4gICAgdGhpcy5naXRodWJBdXRoLmxpbmtHaXRodWIoKTtcbiAgfVxuXG4gIHVubGluaygpIHtcbiAgICB0aGlzLmdpdGh1YkF1dGgudW5saW5rR2l0aHViKCk7XG4gIH1cbn1cbiJdfQ==
221
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWludGVncmF0aW9uLWNhcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva29qaW54L2dpdGh1Yi9zcmMvbGliL2NvbXBvbmVudHMvZ2l0aHViLWludGVncmF0aW9uLWNhcmQvZ2l0aHViLWludGVncmF0aW9uLWNhcmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUFxRy9DLE1BQU0sT0FBTyw4QkFBOEI7SUFLekMsWUFBb0IsVUFBNkI7UUFBN0IsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFKeEMsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFFN0IsY0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVpQixDQUFDO0lBRXJELFNBQVM7UUFDUCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQWlCO1FBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDakMsQ0FBQzsrR0FyQlUsOEJBQThCO21HQUE5Qiw4QkFBOEIsMkhBOUYvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0RlQsMkRBN0ZTLFlBQVk7OzRGQStGWCw4QkFBOEI7a0JBbEcxQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx5QkFBeUI7b0JBQ25DLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQ3ZCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0RlQ7aUJBQ0Y7c0ZBRVUsV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIHNpZ25hbCwgT25Jbml0LCBlZmZlY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBHaXRodWJBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2dpdGh1Yi1hdXRoLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdnaXRodWItaW50ZWdyYXRpb24tY2FyZCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDwhLS0gVGhlIENhcmQgLS0+XG4gICAgPGRpdiAoY2xpY2spPVwib3Blbk1vZGFsKClcIiBjbGFzcz1cImdyb3VwIGN1cnNvci1wb2ludGVyIHJlbGF0aXZlIHAtNiByb3VuZGVkLXhsIGJnLWtvamlueC1wYW5lbCBib3JkZXIgYm9yZGVyLWtvamlueC1ib3JkZXIgaG92ZXI6Ym9yZGVyLXdoaXRlLzMwIHRyYW5zaXRpb24tY29sb3JzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEyIGgtMTIgcm91bmRlZC14bCBiZy13aGl0ZS8xMCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBib3JkZXIgYm9yZGVyLXdoaXRlLzIwXCI+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwidy03IGgtNyB0ZXh0LXdoaXRlXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMTIgMkM2LjQ3NyAyIDIgNi40ODQgMiAxMi4wMTdjMCA0LjQyNSAyLjg2NSA4LjE4IDYuODM5IDkuNTA0LjUuMDkyLjY4Mi0uMjE3LjY4Mi0uNDgzIDAtLjIzNy0uMDA4LS44NjgtLjAxMy0xLjcwMy0yLjc4Mi42MDUtMy4zNjktMS4zNDMtMy4zNjktMS4zNDMtLjQ1NC0xLjE1OC0xLjExLTEuNDY2LTEuMTEtMS40NjYtLjkwOC0uNjIuMDY5LS42MDguMDY5LS42MDggMS4wMDMuMDcgMS41MzEgMS4wMzIgMS41MzEgMS4wMzIuODkyIDEuNTMgMi4zNDEgMS4wODggMi45MS44MzIuMDkyLS42NDcuMzUtMS4wODguNjM2LTEuMzM4LTIuMjItLjI1My00LjU1NS0xLjExMy00LjU1NS00Ljk1MSAwLTEuMDkzLjM5LTEuOTg4IDEuMDI5LTIuNjg4LS4xMDMtLjI1My0uNDQ2LTEuMjcyLjA5OC0yLjY1IDAgMCAuODQtLjI3IDIuNzUgMS4wMjZBOS41NjQgOS41NjQgMCAwMTEyIDYuODQ0Yy44NS4wMDQgMS43MDUuMTE1IDIuNTA0LjMzNyAxLjkwOS0xLjI5NiAyLjc0Ny0xLjAyNyAyLjc0Ny0xLjAyNy41NDYgMS4zNzkuMjAyIDIuMzk4LjEgMi42NTEuNjQuNyAxLjAyOCAxLjU5NSAxLjAyOCAyLjY4OCAwIDMuODQ4LTIuMzM5IDQuNjk1LTQuNTY2IDQuOTQzLjM1OS4zMDkuNjc4LjkyLjY3OCAxLjg1NSAwIDEuMzM4LS4wMTIgMi40MTktLjAxMiAyLjc0NyAwIC4yNjguMTguNTguNjg4LjQ4MkExMC4wMTkgMTAuMDE5IDAgMDAyMiAxMi4wMTdDMjIgNi40ODQgMTcuNTIyIDIgMTIgMnpcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtYmFzZSBmb250LXNlbWlib2xkIHRleHQtd2hpdGUgZ3JvdXAtaG92ZXI6dGV4dC1ncmF5LTMwMCB0cmFuc2l0aW9uLWNvbG9yc1wiPkdpdEh1YjwvcD5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSB0ZXh0LWtvamlueC10ZXh0LW11dGVkIG10LTAuNVwiPkxvZyBpbiB0byBhdXRvbWF0aWNhbGx5IHB1bGwgcHJvZmlsZSBkYXRhIGFuZCBwcm9qZWN0cy48L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHItNlwiPlxuICAgICAgICAgIEBpZiAoaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgcHgtNCBweS0yIHJvdW5kZWQtbGcgYmctZ3JlZW4tNTAwLzEwIGJvcmRlciBib3JkZXItZ3JlZW4tNTAwLzMwIHRleHQtZ3JlZW4tNDAwIHRleHQtc20gZm9udC1ib2xkIGZvbnQtbW9ub1wiPlxuICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwidy00IGgtNFwiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS13aWR0aD1cIjIuNVwiIGQ9XCJNNSAxM2w0IDRMMTkgN1wiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIENvbm5lY3RlZFxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEuNSBweC00IHB5LTIgcm91bmRlZC1sZyBiZy13aGl0ZS81IGJvcmRlciBib3JkZXItd2hpdGUvMTAgdGV4dC13aGl0ZSB0ZXh0LXNtIGZvbnQtYm9sZCBmb250LW1vbm8gZ3JvdXAtaG92ZXI6Ymctd2hpdGUvMTAgdHJhbnNpdGlvbi1jb2xvcnNcIj5cbiAgICAgICAgICAgICAgQ29ubmVjdFxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVGhlIE1vZGFsIC0tPlxuICAgIEBpZiAoc2hvd01vZGFsKCkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJmaXhlZCBpbnNldC0wIHotNTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYmctYmxhY2svNjAgYmFja2Ryb3AtYmx1ci1zbSBhbmltYXRlLWZhZGUtaW5cIiAoY2xpY2spPVwiY2xvc2VNb2RhbCgkZXZlbnQpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJiZy1rb2ppbngtcGFuZWwgYm9yZGVyIGJvcmRlci1rb2ppbngtYm9yZGVyIHJvdW5kZWQtMnhsIHctZnVsbCBtYXgtdy1sZyBzaGFkb3ctMnhsIG92ZXJmbG93LWhpZGRlbiBmbGV4IGZsZXgtY29sXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgIFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTYgYm9yZGVyLWIgYm9yZGVyLXdoaXRlLzUgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICA8aDIgY2xhc3M9XCJ0ZXh0LXhsIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIGZsZXggaXRlbXMtY2VudGVyIGdhcC0zXCI+XG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJ3LTYgaC02IHRleHQtd2hpdGVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTEyIDJDNi40NzcgMiAyIDYuNDg0IDIgMTIuMDE3YzAgNC40MjUgMi44NjUgOC4xOCA2LjgzOSA5LjUwNC41LjA5Mi42ODItLjIxNy42ODItLjQ4MyAwLS4yMzctLjAwOC0uODY4LS4wMTMtMS43MDMtMi43ODIuNjA1LTMuMzY5LTEuMzQzLTMuMzY5LTEuMzQzLS40NTQtMS4xNTgtMS4xMS0xLjQ2Ni0xLjExLTEuNDY2LS45MDgtLjYyLjA2OS0uNjA4LjA2OS0uNjA4IDEuMDAzLjA3IDEuNTMxIDEuMDMyIDEuNTMxIDEuMDMyLjg5MiAxLjUzIDIuMzQxIDEuMDg4IDIuOTEuODMyLjA5Mi0uNjQ3LjM1LTEuMDg4LjYzNi0xLjMzOC0yLjIyLS4yNTMtNC41NTUtMS4xMTMtNC41NTUtNC45NTEgMC0xLjA5My4zOS0xLjk4OCAxLjAyOS0yLjY4OC0uMTAzLS4yNTMtLjQ0Ni0xLjI3Mi4wOTgtMi42NSAwIDAgLjg0LS4yNyAyLjc1IDEuMDI2QTkuNTY0IDkuNTY0IDAgMDExMiA2Ljg0NGMuODUuMDA0IDEuNzA1LjExNSAyLjUwNC4zMzcgMS45MDktMS4yOTYgMi43NDctMS4wMjcgMi43NDctMS4wMjcuNTQ2IDEuMzc5LjIwMiAyLjM5OC4xIDIuNjUxLjY0LjcgMS4wMjggMS41OTUgMS4wMjggMi42ODggMCAzLjg0OC0yLjMzOSA0LjY5NS00LjU2NiA0Ljk0My4zNTkuMzA5LjY3OC45Mi42NzggMS44NTUgMCAxLjMzOC0uMDEyIDIuNDE5LS4wMTIgMi43NDcgMCAuMjY4LjE4LjU4LjY4OC40ODJBMTAuMDE5IDEwLjAxOSAwIDAwMjIgMTIuMDE3QzIyIDYuNDg0IDE3LjUyMiAyIDEyIDJ6XCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICBHaXRIdWIgSW50ZWdyYXRpb25cbiAgICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJzaG93TW9kYWwuc2V0KGZhbHNlKVwiIGNsYXNzPVwidGV4dC13aGl0ZS80MCBob3Zlcjp0ZXh0LXdoaXRlIHRyYW5zaXRpb24tY29sb3JzIHAtMSByb3VuZGVkLWxnIGhvdmVyOmJnLXdoaXRlLzVcIj5cbiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInctNSBoLTVcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2Utd2lkdGg9XCIyXCIgZD1cIk02IDE4TDE4IDZNNiA2bDEyIDEyXCIgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTYgc3BhY2UteS02XCI+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZy1rb2ppbngtYmx1ZS8xMCBib3JkZXIgYm9yZGVyLWtvamlueC1ibHVlLzMwIHJvdW5kZWQteGwgcC00IHRleHQtc20gdGV4dC1zbGF0ZS0zMDBcIj5cbiAgICAgICAgICAgICAgPHA+TG9nIGluIHRvIGF1dG9tYXRpY2FsbHkgcHVsbCB5b3VyIHByb2ZpbGUgZGF0YSBhbmQgZGlzY292ZXIgeW91ciBwcm9qZWN0cy48L3A+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwibXQtMiB0ZXh0LWtvamlueC1ibHVlIGZvbnQtbWVkaXVtXCI+Tm90ZTogS29qaW54IHVzZXMgZmluZS1ncmFpbmVkIEdpdEh1YiBBcHAgcGVybWlzc2lvbnMgKE1ldGFkYXRhIG9ubHkpLiBJdCBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byByZWFkIG9yIG1vZGlmeSB5b3VyIHNvdXJjZSBjb2RlLjwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1zdGFydCBnYXAtMy41IHAtNCBiZy1ibGFjay8yMCBib3JkZXIgYm9yZGVyLXdoaXRlLzUgcm91bmRlZC14bFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0yIHJvdW5kZWQtbGcgYmctZ3JlZW4tNTAwLzEwIGJvcmRlciBib3JkZXItZ3JlZW4tNTAwLzIwIHRleHQtZ3JlZW4tNDAwIHNocmluay0wIG10LTAuNVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJ3LTUgaC01XCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCI+XG4gICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2Utd2lkdGg9XCIyXCIgZD1cIk05IDEybDIgMiA0LTRtNS42MTgtNC4wMTZBMTEuOTU1IDExLjk1NSAwIDAxMTIgMi45NDRhMTEuOTU1IDExLjk1NSAwIDAxLTguNjE4IDMuMDRBMTIuMDIgMTIuMDIgMCAwMDMgOWMwIDUuNTkxIDMuODI0IDEwLjI5IDkgMTEuNjIyIDUuMTc2LTEuMzMyIDktNi4wMyA5LTExLjYyMiAwLTEuMDQyLS4xMzMtMi4wNTItLjM4Mi0zLjAxNnpcIi8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtd2hpdGVcIj5GaW5lLUdyYWluZWQgU2VjdXJpdHkgTW9kZWw8L3A+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXhzIHRleHQta29qaW54LXRleHQtbXV0ZWQgbXQtMSBsZWFkaW5nLXJlbGF4ZWRcIj5cbiAgICAgICAgICAgICAgICAgIFlvdXIgcmVwb3NpdG9yaWVzIGFyZSBsaXN0ZWQgdmlhIEdpdEh1YiBBcHAgdG9rZW5zIHdpdGggc3RyaWN0bHkgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNsYXRlLTIwMCBmb250LW1vbm9cIj5tZXRhZGF0YTpyZWFkPC9zcGFuPi4gU291cmNlIGNvZGUgYW5kIGNvbW1pdCBhY2Nlc3MgYXJlIGNyeXB0b2dyYXBoaWNhbGx5IGJsb2NrZWQgYnkgdGhlIEdpdEh1YiBBUEkuXG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicC02IGJvcmRlci10IGJvcmRlci13aGl0ZS81IGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBiZy1ibGFjay8yMFwiPlxuICAgICAgICAgICAgQGlmIChpc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ1bmxpbmsoKTsgc2hvd01vZGFsLnNldChmYWxzZSlcIiBjbGFzcz1cInB4LTQgcHktMiByb3VuZGVkLWxnIHRleHQtc20gZm9udC1tZWRpdW0gYmctcmVkLTUwMC8xMCB0ZXh0LXJlZC00MDAgaG92ZXI6YmctcmVkLTUwMC8yMCBib3JkZXIgYm9yZGVyLXJlZC01MDAvMjAgdHJhbnNpdGlvbi1jb2xvcnNcIj5cbiAgICAgICAgICAgICAgICBEaXNjb25uZWN0IEdpdEh1YlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwic2hvd01vZGFsLnNldChmYWxzZSlcIiBjbGFzcz1cInB4LTYgcHktMiByb3VuZGVkLWxnIHRleHQtc20gZm9udC1tZWRpdW0gYmctd2hpdGUvNSB0ZXh0LXdoaXRlIGhvdmVyOmJnLXdoaXRlLzEwIGJvcmRlciBib3JkZXItd2hpdGUvMTAgdHJhbnNpdGlvbi1jb2xvcnMgbWwtYXV0b1wiPlxuICAgICAgICAgICAgICAgIERvbmVcbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibGluaygpOyBzaG93TW9kYWwuc2V0KGZhbHNlKVwiIGNsYXNzPVwicHgtNiBweS0yIHJvdW5kZWQtbGcgdGV4dC1zbSBmb250LW1lZGl1bSBiZy13aGl0ZSB0ZXh0LWJsYWNrIGhvdmVyOmJnLWdyYXktMjAwIHRyYW5zaXRpb24tY29sb3JzIG1sLWF1dG9cIj5cbiAgICAgICAgICAgICAgICBDb25uZWN0IEdpdEh1YlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBHaXRodWJJbnRlZ3JhdGlvbkNhcmRDb21wb25lbnQge1xuICBASW5wdXQoKSBpc0Nvbm5lY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgcmVhZG9ubHkgc2hvd01vZGFsID0gc2lnbmFsKGZhbHNlKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGdpdGh1YkF1dGg6IEdpdGh1YkF1dGhTZXJ2aWNlKSB7fVxuXG4gIG9wZW5Nb2RhbCgpIHtcbiAgICB0aGlzLnNob3dNb2RhbC5zZXQodHJ1ZSk7XG4gIH1cbiAgXG4gIGNsb3NlTW9kYWwoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLnNob3dNb2RhbC5zZXQoZmFsc2UpO1xuICB9XG5cbiAgbGluaygpIHtcbiAgICB0aGlzLmdpdGh1YkF1dGgubGlua0dpdGh1YigpO1xuICB9XG5cbiAgdW5saW5rKCkge1xuICAgIHRoaXMuZ2l0aHViQXV0aC51bmxpbmtHaXRodWIoKTtcbiAgfVxufVxuIl19
@@ -11,7 +11,7 @@ export class GithubAuthService {
11
11
  this.unlinkLocal = unlinkLocal;
12
12
  this.setupTauriListener();
13
13
  }
14
- async linkGithub() {
14
+ async linkGithub(mapRepos = true) {
15
15
  const url = `${this.getApiUrl()}/api/auth/link-github`;
16
16
  const token = await this.getToken();
17
17
  const res = await fetch(url, { headers: { 'Authorization': `Bearer ${token}` } });
@@ -21,6 +21,16 @@ export class GithubAuthService {
21
21
  await this.openExternal(data.url);
22
22
  }
23
23
  }
24
+ async checkRepoScope() {
25
+ const url = `${this.getApiUrl()}/api/github/debug-token`;
26
+ const token = await this.getToken();
27
+ const res = await fetch(url, { headers: { 'Authorization': `Bearer ${token}` } });
28
+ if (res.ok) {
29
+ const data = await res.json();
30
+ return data.hasRepoScope === true || data.apiCallSuccess === true;
31
+ }
32
+ return false;
33
+ }
24
34
  async unlinkGithub() {
25
35
  const url = `${this.getApiUrl()}/api/auth/unlink-github`;
26
36
  const token = await this.getToken();
@@ -66,4 +76,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
66
76
  type: Inject,
67
77
  args: [KOJINX_UNLINK_LOCAL_CALLBACK]
68
78
  }] }] });
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWF1dGguc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tvamlueC9naXRodWIvc3JjL2xpYi9zZXJ2aWNlcy9naXRodWItYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSw0QkFBNEIsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLFdBQVcsQ0FBQzs7QUFHckosTUFBTSxPQUFPLGlCQUFpQjtJQUM1QixZQUNVLElBQVksRUFDaUIsU0FBdUIsRUFDekIsUUFBc0MsRUFDbkMsWUFBNEMsRUFDcEMsV0FBNkMsRUFDN0MsV0FBZ0M7UUFMdEUsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNpQixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3pCLGFBQVEsR0FBUixRQUFRLENBQThCO1FBQ25DLGlCQUFZLEdBQVosWUFBWSxDQUFnQztRQUNwQyxnQkFBVyxHQUFYLFdBQVcsQ0FBa0M7UUFDN0MsZ0JBQVcsR0FBWCxXQUFXLENBQXFCO1FBRTlFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVTtRQUNkLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSx1QkFBdUIsQ0FBQztRQUN2RCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNwQyxNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxlQUFlLEVBQUUsVUFBVSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsRixJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxHQUFHLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzlCLElBQUksSUFBSSxDQUFDLEdBQUc7Z0JBQUUsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZO1FBQ2hCLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSx5QkFBeUIsQ0FBQztRQUN6RCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNwQyxNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFLGVBQWUsRUFBRSxVQUFVLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xHLElBQUksR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLGtCQUFrQixDQUFDO1FBQ2xELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVPLEtBQUssQ0FBQyxrQkFBa0I7UUFDOUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDekQsTUFBTSxNQUFNLENBQWtCLGVBQWUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7b0JBQ2pCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEMsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFNLENBQUMsRUFBRSxDQUFDLENBQUEsQ0FBQztJQUNmLENBQUM7K0dBN0NVLGlCQUFpQix3Q0FHbEIsbUJBQW1CLGFBQ25CLGlCQUFpQixhQUNqQixvQkFBb0IsYUFDcEIsNEJBQTRCLGFBQzVCLDRCQUE0QjttSEFQM0IsaUJBQWlCLGNBREosTUFBTTs7NEZBQ25CLGlCQUFpQjtrQkFEN0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQUk3QixNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQzFCLE1BQU07MkJBQUMsaUJBQWlCOzswQkFDeEIsTUFBTTsyQkFBQyxvQkFBb0I7OzBCQUMzQixNQUFNOzJCQUFDLDRCQUE0Qjs7MEJBQ25DLE1BQU07MkJBQUMsNEJBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEtPSklOWF9BUElfQkFTRV9VUkwsIEtPSklOWF9BVVRIX1RPS0VOLCBLT0pJTlhfT1BFTl9FWFRFUk5BTCwgS09KSU5YX0FVVEhfU1VDQ0VTU19DQUxMQkFDSywgS09KSU5YX1VOTElOS19MT0NBTF9DQUxMQkFDSyB9IGZyb20gJy4uL3Rva2Vucyc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgR2l0aHViQXV0aFNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHpvbmU6IE5nWm9uZSxcbiAgICBASW5qZWN0KEtPSklOWF9BUElfQkFTRV9VUkwpIHByaXZhdGUgZ2V0QXBpVXJsOiAoKSA9PiBzdHJpbmcsXG4gICAgQEluamVjdChLT0pJTlhfQVVUSF9UT0tFTikgcHJpdmF0ZSBnZXRUb2tlbjogKCkgPT4gUHJvbWlzZTxzdHJpbmcgfCBudWxsPixcbiAgICBASW5qZWN0KEtPSklOWF9PUEVOX0VYVEVSTkFMKSBwcml2YXRlIG9wZW5FeHRlcm5hbDogKHVybDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIEBJbmplY3QoS09KSU5YX0FVVEhfU1VDQ0VTU19DQUxMQkFDSykgcHJpdmF0ZSBhdXRoU3VjY2VzczogKHRva2VuOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD4sXG4gICAgQEluamVjdChLT0pJTlhfVU5MSU5LX0xPQ0FMX0NBTExCQUNLKSBwcml2YXRlIHVubGlua0xvY2FsOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gICkge1xuICAgIHRoaXMuc2V0dXBUYXVyaUxpc3RlbmVyKCk7XG4gIH1cblxuICBhc3luYyBsaW5rR2l0aHViKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZ2V0QXBpVXJsKCl9L2FwaS9hdXRoL2xpbmstZ2l0aHViYDtcbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuZ2V0VG9rZW4oKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVyczogeyAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gIH0gfSk7XG4gICAgaWYgKHJlcy5vaykge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS51cmwpIGF3YWl0IHRoaXMub3BlbkV4dGVybmFsKGRhdGEudXJsKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB1bmxpbmtHaXRodWIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRBcGlVcmwoKX0vYXBpL2F1dGgvdW5saW5rLWdpdGh1YmA7XG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLmdldFRva2VuKCk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7IG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3Rva2VufWAgfSB9KTtcbiAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgYXdhaXQgdGhpcy51bmxpbmtMb2NhbCgpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRpYXRlT0F1dGgoKTogdm9pZCB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRBcGlVcmwoKX0vYXBpL2F1dGgvZ2l0aHViYDtcbiAgICB0aGlzLm9wZW5FeHRlcm5hbCh1cmwpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cFRhdXJpTGlzdGVuZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgbGlzdGVuIH0gPSBhd2FpdCBpbXBvcnQoJ0B0YXVyaS1hcHBzL2FwaS9ldmVudCcpO1xuICAgICAgYXdhaXQgbGlzdGVuPHt0b2tlbjogc3RyaW5nfT4oJ29hdXRoLXN1Y2Nlc3MnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hdXRoU3VjY2VzcyhldmVudC5wYXlsb2FkLnRva2VuKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoKGUpIHt9XG4gIH1cbn1cbiJdfQ==
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWF1dGguc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tvamlueC9naXRodWIvc3JjL2xpYi9zZXJ2aWNlcy9naXRodWItYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSw0QkFBNEIsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLFdBQVcsQ0FBQzs7QUFHckosTUFBTSxPQUFPLGlCQUFpQjtJQUM1QixZQUNVLElBQVksRUFDaUIsU0FBdUIsRUFDekIsUUFBc0MsRUFDbkMsWUFBNEMsRUFDcEMsV0FBNkMsRUFDN0MsV0FBZ0M7UUFMdEUsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNpQixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3pCLGFBQVEsR0FBUixRQUFRLENBQThCO1FBQ25DLGlCQUFZLEdBQVosWUFBWSxDQUFnQztRQUNwQyxnQkFBVyxHQUFYLFdBQVcsQ0FBa0M7UUFDN0MsZ0JBQVcsR0FBWCxXQUFXLENBQXFCO1FBRTlFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLFdBQW9CLElBQUk7UUFDdkMsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLHVCQUF1QixDQUFDO1FBQ3ZELE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLGVBQWUsRUFBRSxVQUFVLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLElBQUksR0FBRyxD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bGFyL2NvcmUnO1xuaW1wb3J0IHsgS09KSU5YX0FQSV9CQVNFX1VSTCwgS09KSU5YX0FVVEhfVE9LRU4sIEtPSklOWF9PUEVOX0VYVEVSTkFMLCBLT0pJTlhfQVVUSF9TVUNDRVNTX0NBTExCQUNLLCBLT0pJTlhfVU5MSU5LX0xPQ0FMX0NBTExCQUNLIH0gZnJvbSAnLi4vdG9rZW5zJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBHaXRodWJBdXRoU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgem9uZTogTmdab25lLFxuICAgIEBJbmplY3QoS09KSU5YX0FQSV9CQVNFX1VSTCkgcHJpdmF0ZSBnZXRBcGlVcmw6ICgpID0+IHN0cmluZyxcbiAgICBASW5qZWN0KEtPSklOWF9BVVRIX1RPS0VOKSBwcml2YXRlIGdldFRva2VuOiAoKSA9PiBQcm9taXNlPHN0cmluZyB8IG51bGw+LFxuICAgIEBJbmplY3QoS09KSU5YX09QRU5fRVhURVJOQUwpIHByaXZhdGUgb3BlbkV4dGVybmFsOiAodXJsOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD4sXG4gICAgQEluamVjdChLT0pJTlhfQVVUSF9TVUNDRVNTX0NBTExCQUNLKSBwcml2YXRlIGF1dGhTdWNjZXNzOiAodG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBASW5qZWN0KEtPSklOWF9VTkxJTktfTE9DQUxfQ0FMTEJBQ0spIHByaXZhdGUgdW5saW5rTG9jYWw6ICgpID0+IFByb21pc2U8dm9pZD5cbiAgKSB7XG4gICAgdGhpcy5zZXR1cFRhdXJpTGlzdGVuZXIoKTtcbiAgfVxuXG4gIGFzeW5jIGxpbmtHaXRodWIobWFwUmVwb3M6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRBcGlVcmwoKX0vYXBpL2F1dGgvbGluay1naXRodWJgO1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5nZXRUb2tlbigpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeyBoZWFkZXJzOiB7ICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3Rva2VufWAgfSB9KTtcbiAgICBpZiAocmVzLm9rKSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnVybCkgYXdhaXQgdGhpcy5vcGVuRXh0ZXJuYWwoZGF0YS51cmwpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNoZWNrUmVwb1Njb3BlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZ2V0QXBpVXJsKCl9L2FwaS9naXRodWIvZGVidWctdG9rZW5gO1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5nZXRUb2tlbigpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeyBoZWFkZXJzOiB7ICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3Rva2VufWAgfSB9KTtcbiAgICBpZiAocmVzLm9rKSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIHJldHVybiBkYXRhLmhhc1JlcG9TY29wZSA9PT0gdHJ1ZSB8fCBkYXRhLmFwaUNhbGxTdWNjZXNzID09PSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhc3luYyB1bmxpbmtHaXRodWIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRBcGlVcmwoKX0vYXBpL2F1dGgvdW5saW5rLWdpdGh1YmA7XG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLmdldFRva2VuKCk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7IG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3Rva2VufWAgfSB9KTtcbiAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgYXdhaXQgdGhpcy51bmxpbmtMb2NhbCgpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRpYXRlT0F1dGgoKTogdm9pZCB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRBcGlVcmwoKX0vYXBpL2F1dGgvZ2l0aHViYDtcbiAgICB0aGlzLm9wZW5FeHRlcm5hbCh1cmwpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cFRhdXJpTGlzdGVuZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgbGlzdGVuIH0gPSBhd2FpdCBpbXBvcnQoJ0B0YXVyaS1hcHBzL2FwaS9ldmVudCcpO1xuICAgICAgYXdhaXQgbGlzdGVuPHt0b2tlbjogc3RyaW5nfT4oJ29hdXRoLXN1Y2Nlc3MnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hdXRoU3VjY2VzcyhldmVudC5wYXlsb2FkLnRva2VuKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoKGUpIHt9XG4gIH1cbn1cbiJdfQ==
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, Inject, Injectable, Input, Component } from '@angular/core';
2
+ import { InjectionToken, Inject, Injectable, Input, Component, signal } from '@angular/core';
3
3
  import { CommonModule } from '@angular/common';
4
4
 
5
5
  const KOJINX_API_BASE_URL = new InjectionToken('KOJINX_API_BASE_URL');
@@ -18,7 +18,7 @@ class GithubAuthService {
18
18
  this.unlinkLocal = unlinkLocal;
19
19
  this.setupTauriListener();
20
20
  }
21
- async linkGithub() {
21
+ async linkGithub(mapRepos = true) {
22
22
  const url = `${this.getApiUrl()}/api/auth/link-github`;
23
23
  const token = await this.getToken();
24
24
  const res = await fetch(url, { headers: { 'Authorization': `Bearer ${token}` } });
@@ -28,6 +28,16 @@ class GithubAuthService {
28
28
  await this.openExternal(data.url);
29
29
  }
30
30
  }
31
+ async checkRepoScope() {
32
+ const url = `${this.getApiUrl()}/api/github/debug-token`;
33
+ const token = await this.getToken();
34
+ const res = await fetch(url, { headers: { 'Authorization': `Bearer ${token}` } });
35
+ if (res.ok) {
36
+ const data = await res.json();
37
+ return data.hasRepoScope === true || data.apiCallSuccess === true;
38
+ }
39
+ return false;
40
+ }
31
41
  async unlinkGithub() {
32
42
  const url = `${this.getApiUrl()}/api/auth/unlink-github`;
33
43
  const token = await this.getToken();
@@ -117,6 +127,13 @@ class GithubIntegrationCardComponent {
117
127
  constructor(githubAuth) {
118
128
  this.githubAuth = githubAuth;
119
129
  this.isConnected = false;
130
+ this.showModal = signal(false);
131
+ }
132
+ openModal() {
133
+ this.showModal.set(true);
134
+ }
135
+ closeModal(event) {
136
+ this.showModal.set(false);
120
137
  }
121
138
  link() {
122
139
  this.githubAuth.linkGithub();
@@ -126,34 +143,97 @@ class GithubIntegrationCardComponent {
126
143
  }
127
144
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GithubIntegrationCardComponent, deps: [{ token: GithubAuthService }], target: i0.ɵɵFactoryTarget.Component }); }
128
145
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: GithubIntegrationCardComponent, isStandalone: true, selector: "github-integration-card", inputs: { isConnected: "isConnected" }, ngImport: i0, template: `
129
- <div class="bg-black/30 border border-white/5 rounded-xl p-6 hover:border-white/10 transition-colors">
130
- <div class="flex items-start justify-between">
146
+ <!-- The Card -->
147
+ <div (click)="openModal()" class="group cursor-pointer relative p-6 rounded-xl bg-kojinx-panel border border-kojinx-border hover:border-white/30 transition-colors">
148
+ <div class="flex items-center justify-between">
131
149
  <div class="flex items-center gap-4">
132
- <div class="w-12 h-12 rounded-xl bg-[#24292e] flex items-center justify-center">
133
- <svg class="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
150
+ <div class="w-12 h-12 rounded-xl bg-white/10 flex items-center justify-center border border-white/20">
151
+ <svg class="w-7 h-7 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
134
152
  <path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd" />
135
153
  </svg>
136
154
  </div>
137
155
  <div>
138
- <h3 class="text-white font-medium">GitHub</h3>
139
- <p class="text-white/60 text-sm mt-1">Connect your repositories and manage PRs directly from Kojinx.</p>
156
+ <p class="text-base font-semibold text-white group-hover:text-gray-300 transition-colors">GitHub</p>
157
+ <p class="text-sm text-kojinx-text-muted mt-0.5">Log in to automatically pull profile data and projects.</p>
140
158
  </div>
141
159
  </div>
142
- @if (isConnected) {
143
- <div class="flex flex-col items-end gap-2">
144
- <span class="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium bg-emerald-500/10 text-emerald-400 border border-emerald-500/20">
145
- <span class="w-1.5 h-1.5 rounded-full bg-emerald-400"></span>
160
+ <div class="pr-6">
161
+ @if (isConnected) {
162
+ <span class="inline-flex items-center gap-1.5 px-4 py-2 rounded-lg bg-green-500/10 border border-green-500/30 text-green-400 text-sm font-bold font-mono">
163
+ <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
164
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M5 13l4 4L19 7"/>
165
+ </svg>
146
166
  Connected
147
167
  </span>
148
- <button (click)="unlink()" class="text-xs text-red-400 hover:text-red-300 transition-colors">Disconnect</button>
149
- </div>
150
- } @else {
151
- <button (click)="link()" class="px-4 py-2 bg-white/5 hover:bg-white/10 border border-white/10 rounded-lg text-sm text-white font-medium transition-all focus:outline-none focus:border-kojinx-purple">
152
- Connect
153
- </button>
154
- }
168
+ } @else {
169
+ <span class="inline-flex items-center gap-1.5 px-4 py-2 rounded-lg bg-white/5 border border-white/10 text-white text-sm font-bold font-mono group-hover:bg-white/10 transition-colors">
170
+ Connect
171
+ </span>
172
+ }
173
+ </div>
155
174
  </div>
156
175
  </div>
176
+
177
+ <!-- The Modal -->
178
+ @if (showModal()) {
179
+ <div class="fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm animate-fade-in" (click)="closeModal($event)">
180
+ <div class="bg-kojinx-panel border border-kojinx-border rounded-2xl w-full max-w-lg shadow-2xl overflow-hidden flex flex-col" (click)="$event.stopPropagation()">
181
+
182
+ <div class="p-6 border-b border-white/5 flex items-center justify-between">
183
+ <h2 class="text-xl font-bold text-white flex items-center gap-3">
184
+ <svg class="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
185
+ <path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd" />
186
+ </svg>
187
+ GitHub Integration
188
+ </h2>
189
+ <button (click)="showModal.set(false)" class="text-white/40 hover:text-white transition-colors p-1 rounded-lg hover:bg-white/5">
190
+ <svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
191
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
192
+ </svg>
193
+ </button>
194
+ </div>
195
+
196
+ <div class="p-6 space-y-6">
197
+
198
+ <div class="bg-kojinx-blue/10 border border-kojinx-blue/30 rounded-xl p-4 text-sm text-slate-300">
199
+ <p>Log in to automatically pull your profile data and discover your projects.</p>
200
+ <p class="mt-2 text-kojinx-blue font-medium">Note: Kojinx uses fine-grained GitHub App permissions (Metadata only). It does not have access to read or modify your source code.</p>
201
+ </div>
202
+
203
+ <div class="flex items-start gap-3.5 p-4 bg-black/20 border border-white/5 rounded-xl">
204
+ <div class="p-2 rounded-lg bg-green-500/10 border border-green-500/20 text-green-400 shrink-0 mt-0.5">
205
+ <svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
206
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/>
207
+ </svg>
208
+ </div>
209
+ <div>
210
+ <p class="text-sm font-semibold text-white">Fine-Grained Security Model</p>
211
+ <p class="text-xs text-kojinx-text-muted mt-1 leading-relaxed">
212
+ Your repositories are listed via GitHub App tokens with strictly <span class="text-slate-200 font-mono">metadata:read</span>. Source code and commit access are cryptographically blocked by the GitHub API.
213
+ </p>
214
+ </div>
215
+ </div>
216
+
217
+ </div>
218
+
219
+ <div class="p-6 border-t border-white/5 flex items-center justify-between bg-black/20">
220
+ @if (isConnected) {
221
+ <button (click)="unlink(); showModal.set(false)" class="px-4 py-2 rounded-lg text-sm font-medium bg-red-500/10 text-red-400 hover:bg-red-500/20 border border-red-500/20 transition-colors">
222
+ Disconnect GitHub
223
+ </button>
224
+ <button (click)="showModal.set(false)" class="px-6 py-2 rounded-lg text-sm font-medium bg-white/5 text-white hover:bg-white/10 border border-white/10 transition-colors ml-auto">
225
+ Done
226
+ </button>
227
+ } @else {
228
+ <button (click)="link(); showModal.set(false)" class="px-6 py-2 rounded-lg text-sm font-medium bg-white text-black hover:bg-gray-200 transition-colors ml-auto">
229
+ Connect GitHub
230
+ </button>
231
+ }
232
+ </div>
233
+
234
+ </div>
235
+ </div>
236
+ }
157
237
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
158
238
  }
159
239
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GithubIntegrationCardComponent, decorators: [{
@@ -163,34 +243,97 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
163
243
  standalone: true,
164
244
  imports: [CommonModule],
165
245
  template: `
166
- <div class="bg-black/30 border border-white/5 rounded-xl p-6 hover:border-white/10 transition-colors">
167
- <div class="flex items-start justify-between">
246
+ <!-- The Card -->
247
+ <div (click)="openModal()" class="group cursor-pointer relative p-6 rounded-xl bg-kojinx-panel border border-kojinx-border hover:border-white/30 transition-colors">
248
+ <div class="flex items-center justify-between">
168
249
  <div class="flex items-center gap-4">
169
- <div class="w-12 h-12 rounded-xl bg-[#24292e] flex items-center justify-center">
170
- <svg class="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
250
+ <div class="w-12 h-12 rounded-xl bg-white/10 flex items-center justify-center border border-white/20">
251
+ <svg class="w-7 h-7 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
171
252
  <path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd" />
172
253
  </svg>
173
254
  </div>
174
255
  <div>
175
- <h3 class="text-white font-medium">GitHub</h3>
176
- <p class="text-white/60 text-sm mt-1">Connect your repositories and manage PRs directly from Kojinx.</p>
256
+ <p class="text-base font-semibold text-white group-hover:text-gray-300 transition-colors">GitHub</p>
257
+ <p class="text-sm text-kojinx-text-muted mt-0.5">Log in to automatically pull profile data and projects.</p>
177
258
  </div>
178
259
  </div>
179
- @if (isConnected) {
180
- <div class="flex flex-col items-end gap-2">
181
- <span class="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium bg-emerald-500/10 text-emerald-400 border border-emerald-500/20">
182
- <span class="w-1.5 h-1.5 rounded-full bg-emerald-400"></span>
260
+ <div class="pr-6">
261
+ @if (isConnected) {
262
+ <span class="inline-flex items-center gap-1.5 px-4 py-2 rounded-lg bg-green-500/10 border border-green-500/30 text-green-400 text-sm font-bold font-mono">
263
+ <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
264
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M5 13l4 4L19 7"/>
265
+ </svg>
183
266
  Connected
184
267
  </span>
185
- <button (click)="unlink()" class="text-xs text-red-400 hover:text-red-300 transition-colors">Disconnect</button>
186
- </div>
187
- } @else {
188
- <button (click)="link()" class="px-4 py-2 bg-white/5 hover:bg-white/10 border border-white/10 rounded-lg text-sm text-white font-medium transition-all focus:outline-none focus:border-kojinx-purple">
189
- Connect
190
- </button>
191
- }
268
+ } @else {
269
+ <span class="inline-flex items-center gap-1.5 px-4 py-2 rounded-lg bg-white/5 border border-white/10 text-white text-sm font-bold font-mono group-hover:bg-white/10 transition-colors">
270
+ Connect
271
+ </span>
272
+ }
273
+ </div>
192
274
  </div>
193
275
  </div>
276
+
277
+ <!-- The Modal -->
278
+ @if (showModal()) {
279
+ <div class="fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm animate-fade-in" (click)="closeModal($event)">
280
+ <div class="bg-kojinx-panel border border-kojinx-border rounded-2xl w-full max-w-lg shadow-2xl overflow-hidden flex flex-col" (click)="$event.stopPropagation()">
281
+
282
+ <div class="p-6 border-b border-white/5 flex items-center justify-between">
283
+ <h2 class="text-xl font-bold text-white flex items-center gap-3">
284
+ <svg class="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
285
+ <path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd" />
286
+ </svg>
287
+ GitHub Integration
288
+ </h2>
289
+ <button (click)="showModal.set(false)" class="text-white/40 hover:text-white transition-colors p-1 rounded-lg hover:bg-white/5">
290
+ <svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
291
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
292
+ </svg>
293
+ </button>
294
+ </div>
295
+
296
+ <div class="p-6 space-y-6">
297
+
298
+ <div class="bg-kojinx-blue/10 border border-kojinx-blue/30 rounded-xl p-4 text-sm text-slate-300">
299
+ <p>Log in to automatically pull your profile data and discover your projects.</p>
300
+ <p class="mt-2 text-kojinx-blue font-medium">Note: Kojinx uses fine-grained GitHub App permissions (Metadata only). It does not have access to read or modify your source code.</p>
301
+ </div>
302
+
303
+ <div class="flex items-start gap-3.5 p-4 bg-black/20 border border-white/5 rounded-xl">
304
+ <div class="p-2 rounded-lg bg-green-500/10 border border-green-500/20 text-green-400 shrink-0 mt-0.5">
305
+ <svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
306
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/>
307
+ </svg>
308
+ </div>
309
+ <div>
310
+ <p class="text-sm font-semibold text-white">Fine-Grained Security Model</p>
311
+ <p class="text-xs text-kojinx-text-muted mt-1 leading-relaxed">
312
+ Your repositories are listed via GitHub App tokens with strictly <span class="text-slate-200 font-mono">metadata:read</span>. Source code and commit access are cryptographically blocked by the GitHub API.
313
+ </p>
314
+ </div>
315
+ </div>
316
+
317
+ </div>
318
+
319
+ <div class="p-6 border-t border-white/5 flex items-center justify-between bg-black/20">
320
+ @if (isConnected) {
321
+ <button (click)="unlink(); showModal.set(false)" class="px-4 py-2 rounded-lg text-sm font-medium bg-red-500/10 text-red-400 hover:bg-red-500/20 border border-red-500/20 transition-colors">
322
+ Disconnect GitHub
323
+ </button>
324
+ <button (click)="showModal.set(false)" class="px-6 py-2 rounded-lg text-sm font-medium bg-white/5 text-white hover:bg-white/10 border border-white/10 transition-colors ml-auto">
325
+ Done
326
+ </button>
327
+ } @else {
328
+ <button (click)="link(); showModal.set(false)" class="px-6 py-2 rounded-lg text-sm font-medium bg-white text-black hover:bg-gray-200 transition-colors ml-auto">
329
+ Connect GitHub
330
+ </button>
331
+ }
332
+ </div>
333
+
334
+ </div>
335
+ </div>
336
+ }
194
337
  `
195
338
  }]
196
339
  }], ctorParameters: () => [{ type: GithubAuthService }], propDecorators: { isConnected: [{
@@ -1 +1 @@
1
- {"version":3,"file":"kojinx-github.mjs","sources":["../../../../projects/kojinx/github/src/lib/tokens.ts","../../../../projects/kojinx/github/src/lib/services/github-auth.service.ts","../../../../projects/kojinx/github/src/lib/components/github-login-button/github-login-button.component.ts","../../../../projects/kojinx/github/src/lib/components/github-integration-card/github-integration-card.component.ts","../../../../projects/kojinx/github/src/kojinx-github.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const KOJINX_API_BASE_URL = new InjectionToken<() => string>('KOJINX_API_BASE_URL');\nexport const KOJINX_AUTH_TOKEN = new InjectionToken<() => Promise<string | null>>('KOJINX_AUTH_TOKEN');\nexport const KOJINX_OPEN_EXTERNAL = new InjectionToken<(url: string) => Promise<void>>('KOJINX_OPEN_EXTERNAL');\nexport const KOJINX_AUTH_SUCCESS_CALLBACK = new InjectionToken<(token: string) => Promise<void>>('KOJINX_AUTH_SUCCESS_CALLBACK');\nexport const KOJINX_UNLINK_LOCAL_CALLBACK = new InjectionToken<() => Promise<void>>('KOJINX_UNLINK_LOCAL_CALLBACK');\n","import { Injectable, Inject, NgZone } from '@angular/core';\nimport { KOJINX_API_BASE_URL, KOJINX_AUTH_TOKEN, KOJINX_OPEN_EXTERNAL, KOJINX_AUTH_SUCCESS_CALLBACK, KOJINX_UNLINK_LOCAL_CALLBACK } from '../tokens';\n\n@Injectable({ providedIn: 'root' })\nexport class GithubAuthService {\n constructor(\n private zone: NgZone,\n @Inject(KOJINX_API_BASE_URL) private getApiUrl: () => string,\n @Inject(KOJINX_AUTH_TOKEN) private getToken: () => Promise<string | null>,\n @Inject(KOJINX_OPEN_EXTERNAL) private openExternal: (url: string) => Promise<void>,\n @Inject(KOJINX_AUTH_SUCCESS_CALLBACK) private authSuccess: (token: string) => Promise<void>,\n @Inject(KOJINX_UNLINK_LOCAL_CALLBACK) private unlinkLocal: () => Promise<void>\n ) {\n this.setupTauriListener();\n }\n\n async linkGithub(): Promise<void> {\n const url = `${this.getApiUrl()}/api/auth/link-github`;\n const token = await this.getToken();\n const res = await fetch(url, { headers: { 'Authorization': `Bearer ${token}` } });\n if (res.ok) {\n const data = await res.json();\n if (data.url) await this.openExternal(data.url);\n }\n }\n\n async unlinkGithub(): Promise<void> {\n const url = `${this.getApiUrl()}/api/auth/unlink-github`;\n const token = await this.getToken();\n const res = await fetch(url, { method: 'POST', headers: { 'Authorization': `Bearer ${token}` } });\n if (res.ok) {\n await this.unlinkLocal();\n }\n }\n\n initiateOAuth(): void {\n const url = `${this.getApiUrl()}/api/auth/github`;\n this.openExternal(url);\n }\n\n private async setupTauriListener(): Promise<void> {\n try {\n const { listen } = await import('@tauri-apps/api/event');\n await listen<{token: string}>('oauth-success', (event) => {\n this.zone.run(() => {\n this.authSuccess(event.payload.token);\n });\n });\n } catch(e) {}\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { GithubAuthService } from '../../services/github-auth.service';\n\n@Component({\n selector: 'github-login-button',\n standalone: true,\n template: `\n <button (click)=\"login()\" [disabled]=\"isLoading\" class=\"w-full flex justify-center items-center gap-3 bg-white/5 hover:bg-white/10 text-white font-medium py-3 px-4 rounded-xl transition-all border border-white/10 focus:outline-none focus:ring-2 focus:ring-white/20\">\n <svg class=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\" clip-rule=\"evenodd\" />\n </svg>\n {{ text }}\n </button>\n `\n})\nexport class GithubLoginButtonComponent {\n @Input() text: string = 'Continue with GitHub';\n @Input() isLoading: boolean = false;\n constructor(private githubAuth: GithubAuthService) {}\n login() {\n this.githubAuth.initiateOAuth();\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { GithubAuthService } from '../../services/github-auth.service';\n\n@Component({\n selector: 'github-integration-card',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"bg-black/30 border border-white/5 rounded-xl p-6 hover:border-white/10 transition-colors\">\n <div class=\"flex items-start justify-between\">\n <div class=\"flex items-center gap-4\">\n <div class=\"w-12 h-12 rounded-xl bg-[#24292e] flex items-center justify-center\">\n <svg class=\"w-6 h-6 text-white\" fill=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div>\n <h3 class=\"text-white font-medium\">GitHub</h3>\n <p class=\"text-white/60 text-sm mt-1\">Connect your repositories and manage PRs directly from Kojinx.</p>\n </div>\n </div>\n @if (isConnected) {\n <div class=\"flex flex-col items-end gap-2\">\n <span class=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium bg-emerald-500/10 text-emerald-400 border border-emerald-500/20\">\n <span class=\"w-1.5 h-1.5 rounded-full bg-emerald-400\"></span>\n Connected\n </span>\n <button (click)=\"unlink()\" class=\"text-xs text-red-400 hover:text-red-300 transition-colors\">Disconnect</button>\n </div>\n } @else {\n <button (click)=\"link()\" class=\"px-4 py-2 bg-white/5 hover:bg-white/10 border border-white/10 rounded-lg text-sm text-white font-medium transition-all focus:outline-none focus:border-kojinx-purple\">\n Connect\n </button>\n }\n </div>\n </div>\n `\n})\nexport class GithubIntegrationCardComponent {\n @Input() isConnected: boolean = false;\n constructor(private githubAuth: GithubAuthService) {}\n \n link() {\n this.githubAuth.linkGithub();\n }\n\n unlink() {\n this.githubAuth.unlinkGithub();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.GithubAuthService"],"mappings":"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"}
1
+ {"version":3,"file":"kojinx-github.mjs","sources":["../../../../projects/kojinx/github/src/lib/tokens.ts","../../../../projects/kojinx/github/src/lib/services/github-auth.service.ts","../../../../projects/kojinx/github/src/lib/components/github-login-button/github-login-button.component.ts","../../../../projects/kojinx/github/src/lib/components/github-integration-card/github-integration-card.component.ts","../../../../projects/kojinx/github/src/kojinx-github.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const KOJINX_API_BASE_URL = new InjectionToken<() => string>('KOJINX_API_BASE_URL');\nexport const KOJINX_AUTH_TOKEN = new InjectionToken<() => Promise<string | null>>('KOJINX_AUTH_TOKEN');\nexport const KOJINX_OPEN_EXTERNAL = new InjectionToken<(url: string) => Promise<void>>('KOJINX_OPEN_EXTERNAL');\nexport const KOJINX_AUTH_SUCCESS_CALLBACK = new InjectionToken<(token: string) => Promise<void>>('KOJINX_AUTH_SUCCESS_CALLBACK');\nexport const KOJINX_UNLINK_LOCAL_CALLBACK = new InjectionToken<() => Promise<void>>('KOJINX_UNLINK_LOCAL_CALLBACK');\n","import { Injectable, Inject, NgZone } from '@angular/core';\nimport { KOJINX_API_BASE_URL, KOJINX_AUTH_TOKEN, KOJINX_OPEN_EXTERNAL, KOJINX_AUTH_SUCCESS_CALLBACK, KOJINX_UNLINK_LOCAL_CALLBACK } from '../tokens';\n\n@Injectable({ providedIn: 'root' })\nexport class GithubAuthService {\n constructor(\n private zone: NgZone,\n @Inject(KOJINX_API_BASE_URL) private getApiUrl: () => string,\n @Inject(KOJINX_AUTH_TOKEN) private getToken: () => Promise<string | null>,\n @Inject(KOJINX_OPEN_EXTERNAL) private openExternal: (url: string) => Promise<void>,\n @Inject(KOJINX_AUTH_SUCCESS_CALLBACK) private authSuccess: (token: string) => Promise<void>,\n @Inject(KOJINX_UNLINK_LOCAL_CALLBACK) private unlinkLocal: () => Promise<void>\n ) {\n this.setupTauriListener();\n }\n\n async linkGithub(mapRepos: boolean = true): Promise<void> {\n const url = `${this.getApiUrl()}/api/auth/link-github`;\n const token = await this.getToken();\n const res = await fetch(url, { headers: { 'Authorization': `Bearer ${token}` } });\n if (res.ok) {\n const data = await res.json();\n if (data.url) await this.openExternal(data.url);\n }\n }\n\n async checkRepoScope(): Promise<boolean> {\n const url = `${this.getApiUrl()}/api/github/debug-token`;\n const token = await this.getToken();\n const res = await fetch(url, { headers: { 'Authorization': `Bearer ${token}` } });\n if (res.ok) {\n const data = await res.json();\n return data.hasRepoScope === true || data.apiCallSuccess === true;\n }\n return false;\n }\n\n async unlinkGithub(): Promise<void> {\n const url = `${this.getApiUrl()}/api/auth/unlink-github`;\n const token = await this.getToken();\n const res = await fetch(url, { method: 'POST', headers: { 'Authorization': `Bearer ${token}` } });\n if (res.ok) {\n await this.unlinkLocal();\n }\n }\n\n initiateOAuth(): void {\n const url = `${this.getApiUrl()}/api/auth/github`;\n this.openExternal(url);\n }\n\n private async setupTauriListener(): Promise<void> {\n try {\n const { listen } = await import('@tauri-apps/api/event');\n await listen<{token: string}>('oauth-success', (event) => {\n this.zone.run(() => {\n this.authSuccess(event.payload.token);\n });\n });\n } catch(e) {}\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { GithubAuthService } from '../../services/github-auth.service';\n\n@Component({\n selector: 'github-login-button',\n standalone: true,\n template: `\n <button (click)=\"login()\" [disabled]=\"isLoading\" class=\"w-full flex justify-center items-center gap-3 bg-white/5 hover:bg-white/10 text-white font-medium py-3 px-4 rounded-xl transition-all border border-white/10 focus:outline-none focus:ring-2 focus:ring-white/20\">\n <svg class=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\" clip-rule=\"evenodd\" />\n </svg>\n {{ text }}\n </button>\n `\n})\nexport class GithubLoginButtonComponent {\n @Input() text: string = 'Continue with GitHub';\n @Input() isLoading: boolean = false;\n constructor(private githubAuth: GithubAuthService) {}\n login() {\n this.githubAuth.initiateOAuth();\n }\n}\n","import { Component, Input, signal, OnInit, effect } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { GithubAuthService } from '../../services/github-auth.service';\n\n@Component({\n selector: 'github-integration-card',\n standalone: true,\n imports: [CommonModule],\n template: `\n <!-- The Card -->\n <div (click)=\"openModal()\" class=\"group cursor-pointer relative p-6 rounded-xl bg-kojinx-panel border border-kojinx-border hover:border-white/30 transition-colors\">\n <div class=\"flex items-center justify-between\">\n <div class=\"flex items-center gap-4\">\n <div class=\"w-12 h-12 rounded-xl bg-white/10 flex items-center justify-center border border-white/20\">\n <svg class=\"w-7 h-7 text-white\" fill=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div>\n <p class=\"text-base font-semibold text-white group-hover:text-gray-300 transition-colors\">GitHub</p>\n <p class=\"text-sm text-kojinx-text-muted mt-0.5\">Log in to automatically pull profile data and projects.</p>\n </div>\n </div>\n <div class=\"pr-6\">\n @if (isConnected) {\n <span class=\"inline-flex items-center gap-1.5 px-4 py-2 rounded-lg bg-green-500/10 border border-green-500/30 text-green-400 text-sm font-bold font-mono\">\n <svg class=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" d=\"M5 13l4 4L19 7\"/>\n </svg>\n Connected\n </span>\n } @else {\n <span class=\"inline-flex items-center gap-1.5 px-4 py-2 rounded-lg bg-white/5 border border-white/10 text-white text-sm font-bold font-mono group-hover:bg-white/10 transition-colors\">\n Connect\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- The Modal -->\n @if (showModal()) {\n <div class=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm animate-fade-in\" (click)=\"closeModal($event)\">\n <div class=\"bg-kojinx-panel border border-kojinx-border rounded-2xl w-full max-w-lg shadow-2xl overflow-hidden flex flex-col\" (click)=\"$event.stopPropagation()\">\n \n <div class=\"p-6 border-b border-white/5 flex items-center justify-between\">\n <h2 class=\"text-xl font-bold text-white flex items-center gap-3\">\n <svg class=\"w-6 h-6 text-white\" fill=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\" clip-rule=\"evenodd\" />\n </svg>\n GitHub Integration\n </h2>\n <button (click)=\"showModal.set(false)\" class=\"text-white/40 hover:text-white transition-colors p-1 rounded-lg hover:bg-white/5\">\n <svg class=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <div class=\"p-6 space-y-6\">\n \n <div class=\"bg-kojinx-blue/10 border border-kojinx-blue/30 rounded-xl p-4 text-sm text-slate-300\">\n <p>Log in to automatically pull your profile data and discover your projects.</p>\n <p class=\"mt-2 text-kojinx-blue font-medium\">Note: Kojinx uses fine-grained GitHub App permissions (Metadata only). It does not have access to read or modify your source code.</p>\n </div>\n\n <div class=\"flex items-start gap-3.5 p-4 bg-black/20 border border-white/5 rounded-xl\">\n <div class=\"p-2 rounded-lg bg-green-500/10 border border-green-500/20 text-green-400 shrink-0 mt-0.5\">\n <svg class=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z\"/>\n </svg>\n </div>\n <div>\n <p class=\"text-sm font-semibold text-white\">Fine-Grained Security Model</p>\n <p class=\"text-xs text-kojinx-text-muted mt-1 leading-relaxed\">\n Your repositories are listed via GitHub App tokens with strictly <span class=\"text-slate-200 font-mono\">metadata:read</span>. Source code and commit access are cryptographically blocked by the GitHub API.\n </p>\n </div>\n </div>\n\n </div>\n\n <div class=\"p-6 border-t border-white/5 flex items-center justify-between bg-black/20\">\n @if (isConnected) {\n <button (click)=\"unlink(); showModal.set(false)\" class=\"px-4 py-2 rounded-lg text-sm font-medium bg-red-500/10 text-red-400 hover:bg-red-500/20 border border-red-500/20 transition-colors\">\n Disconnect GitHub\n </button>\n <button (click)=\"showModal.set(false)\" class=\"px-6 py-2 rounded-lg text-sm font-medium bg-white/5 text-white hover:bg-white/10 border border-white/10 transition-colors ml-auto\">\n Done\n </button>\n } @else {\n <button (click)=\"link(); showModal.set(false)\" class=\"px-6 py-2 rounded-lg text-sm font-medium bg-white text-black hover:bg-gray-200 transition-colors ml-auto\">\n Connect GitHub\n </button>\n }\n </div>\n\n </div>\n </div>\n }\n `\n})\nexport class GithubIntegrationCardComponent {\n @Input() isConnected: boolean = false;\n \n readonly showModal = signal(false);\n\n constructor(private githubAuth: GithubAuthService) {}\n\n openModal() {\n this.showModal.set(true);\n }\n \n closeModal(event: MouseEvent) {\n this.showModal.set(false);\n }\n\n link() {\n this.githubAuth.linkGithub();\n }\n\n unlink() {\n this.githubAuth.unlinkGithub();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.GithubAuthService"],"mappings":"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"}
@@ -3,7 +3,10 @@ import * as i0 from "@angular/core";
3
3
  export declare class GithubIntegrationCardComponent {
4
4
  private githubAuth;
5
5
  isConnected: boolean;
6
+ readonly showModal: import("@angular/core").WritableSignal<boolean>;
6
7
  constructor(githubAuth: GithubAuthService);
8
+ openModal(): void;
9
+ closeModal(event: MouseEvent): void;
7
10
  link(): void;
8
11
  unlink(): void;
9
12
  static ɵfac: i0.ɵɵFactoryDeclaration<GithubIntegrationCardComponent, never>;
@@ -8,7 +8,8 @@ export declare class GithubAuthService {
8
8
  private authSuccess;
9
9
  private unlinkLocal;
10
10
  constructor(zone: NgZone, getApiUrl: () => string, getToken: () => Promise<string | null>, openExternal: (url: string) => Promise<void>, authSuccess: (token: string) => Promise<void>, unlinkLocal: () => Promise<void>);
11
- linkGithub(): Promise<void>;
11
+ linkGithub(mapRepos?: boolean): Promise<void>;
12
+ checkRepoScope(): Promise<boolean>;
12
13
  unlinkGithub(): Promise<void>;
13
14
  initiateOAuth(): void;
14
15
  private setupTauriListener;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kojinx/github",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^17.3.0",
6
6
  "@angular/core": "^17.3.0"