@kojinx/github 0.0.5 → 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.
@@ -7,14 +7,13 @@ export class GithubIntegrationCardComponent {
7
7
  this.githubAuth = githubAuth;
8
8
  this.isConnected = false;
9
9
  this.showModal = signal(false);
10
- this.mapRepos = signal(true);
10
+ }
11
+ openModal() {
12
+ this.showModal.set(true);
11
13
  }
12
14
  closeModal(event) {
13
15
  this.showModal.set(false);
14
16
  }
15
- toggleMapRepos() {
16
- this.mapRepos.update(v => !v);
17
- }
18
17
  link() {
19
18
  this.githubAuth.linkGithub();
20
19
  }
@@ -24,7 +23,7 @@ export class GithubIntegrationCardComponent {
24
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 }); }
25
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: `
26
25
  <!-- The Card -->
27
- <div (click)="showModal.set(true)" class="group cursor-pointer relative p-6 rounded-xl bg-kojinx-panel border border-kojinx-border hover:border-white/30 transition-colors">
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">
28
27
  <div class="flex items-center justify-between">
29
28
  <div class="flex items-center gap-4">
30
29
  <div class="w-12 h-12 rounded-xl bg-white/10 flex items-center justify-center border border-white/20">
@@ -76,19 +75,22 @@ export class GithubIntegrationCardComponent {
76
75
  <div class="p-6 space-y-6">
77
76
 
78
77
  <div class="bg-kojinx-blue/10 border border-kojinx-blue/30 rounded-xl p-4 text-sm text-slate-300">
79
- <p>Log in to automatically pull your profile data and projects.</p>
80
- <p class="mt-2 text-kojinx-blue font-medium">Note: Kojinx only maps the repositories internally. It does not have access to read or modify your source code.</p>
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>
81
80
  </div>
82
81
 
83
- <div class="flex items-center justify-between p-4 bg-black/20 border border-white/5 rounded-xl">
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>
84
88
  <div>
85
- <p class="font-medium text-white">Repository Mapping</p>
86
- <p class="text-xs text-kojinx-text-muted mt-1">Allow Kojinx to discover and map your repositories</p>
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>
87
93
  </div>
88
- <label class="relative inline-flex items-center cursor-pointer">
89
- <input type="checkbox" class="sr-only peer" [checked]="mapRepos()" (change)="toggleMapRepos()">
90
- <div class="w-11 h-6 bg-black/40 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-slate-400 peer-checked:after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-kojinx-blue border border-white/10"></div>
91
- </label>
92
94
  </div>
93
95
 
94
96
  </div>
@@ -121,7 +123,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
121
123
  imports: [CommonModule],
122
124
  template: `
123
125
  <!-- The Card -->
124
- <div (click)="showModal.set(true)" class="group cursor-pointer relative p-6 rounded-xl bg-kojinx-panel border border-kojinx-border hover:border-white/30 transition-colors">
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">
125
127
  <div class="flex items-center justify-between">
126
128
  <div class="flex items-center gap-4">
127
129
  <div class="w-12 h-12 rounded-xl bg-white/10 flex items-center justify-center border border-white/20">
@@ -173,19 +175,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
173
175
  <div class="p-6 space-y-6">
174
176
 
175
177
  <div class="bg-kojinx-blue/10 border border-kojinx-blue/30 rounded-xl p-4 text-sm text-slate-300">
176
- <p>Log in to automatically pull your profile data and projects.</p>
177
- <p class="mt-2 text-kojinx-blue font-medium">Note: Kojinx only maps the repositories internally. It does not have access to read or modify your source code.</p>
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>
178
180
  </div>
179
181
 
180
- <div class="flex items-center justify-between p-4 bg-black/20 border border-white/5 rounded-xl">
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>
181
188
  <div>
182
- <p class="font-medium text-white">Repository Mapping</p>
183
- <p class="text-xs text-kojinx-text-muted mt-1">Allow Kojinx to discover and map your repositories</p>
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>
184
193
  </div>
185
- <label class="relative inline-flex items-center cursor-pointer">
186
- <input type="checkbox" class="sr-only peer" [checked]="mapRepos()" (change)="toggleMapRepos()">
187
- <div class="w-11 h-6 bg-black/40 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-slate-400 peer-checked:after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-kojinx-blue border border-white/10"></div>
188
- </label>
189
194
  </div>
190
195
 
191
196
  </div>
@@ -213,4 +218,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
213
218
  }], ctorParameters: () => [{ type: i1.GithubAuthService }], propDecorators: { isConnected: [{
214
219
  type: Input
215
220
  }] } });
216
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWludGVncmF0aW9uLWNhcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva29qaW54L2dpdGh1Yi9zcmMvbGliL2NvbXBvbmVudHMvZ2l0aHViLWludGVncmF0aW9uLWNhcmQvZ2l0aHViLWludGVncmF0aW9uLWNhcmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQWtHL0MsTUFBTSxPQUFPLDhCQUE4QjtJQU16QyxZQUFvQixVQUE2QjtRQUE3QixlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUx4QyxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUU3QixjQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLGFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFbUIsQ0FBQztJQUVyRCxVQUFVLENBQUMsS0FBaUI7UUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQUk7UUFDRixJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNqQyxDQUFDOytHQXRCVSw4QkFBOEI7bUdBQTlCLDhCQUE4QiwySEEzRi9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlGVCwyREExRlMsWUFBWTs7NEZBNEZYLDhCQUE4QjtrQkEvRjFDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHlCQUF5QjtvQkFDbkMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlGVDtpQkFDRjtzRkFFVSxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgR2l0aHViQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9naXRodWItYXV0aC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ2l0aHViLWludGVncmF0aW9uLWNhcmQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8IS0tIFRoZSBDYXJkIC0tPlxuICAgIDxkaXYgKGNsaWNrKT1cInNob3dNb2RhbC5zZXQodHJ1ZSlcIiBjbGFzcz1cImdyb3VwIGN1cnNvci1wb2ludGVyIHJlbGF0aXZlIHAtNiByb3VuZGVkLXhsIGJnLWtvamlueC1wYW5lbCBib3JkZXIgYm9yZGVyLWtvamlueC1ib3JkZXIgaG92ZXI6Ym9yZGVyLXdoaXRlLzMwIHRyYW5zaXRpb24tY29sb3JzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEyIGgtMTIgcm91bmRlZC14bCBiZy13aGl0ZS8xMCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBib3JkZXIgYm9yZGVyLXdoaXRlLzIwXCI+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwidy03IGgtNyB0ZXh0LXdoaXRlXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMTIgMkM2LjQ3NyAyIDIgNi40ODQgMiAxMi4wMTdjMCA0LjQyNSAyLjg2NSA4LjE4IDYuODM5IDkuNTA0LjUuMDkyLjY4Mi0uMjE3LjY4Mi0uNDgzIDAtLjIzNy0uMDA4LS44NjgtLjAxMy0xLjcwMy0yLjc4Mi42MDUtMy4zNjktMS4zNDMtMy4zNjktMS4zNDMtLjQ1NC0xLjE1OC0xLjExLTEuNDY2LTEuMTEtMS40NjYtLjkwOC0uNjIuMDY5LS42MDguMDY5LS42MDggMS4wMDMuMDcgMS41MzEgMS4wMzIgMS41MzEgMS4wMzIuODkyIDEuNTMgMi4zNDEgMS4wODggMi45MS44MzIuMDkyLS42NDcuMzUtMS4wODguNjM2LTEuMzM4LTIuMjItLjI1My00LjU1NS0xLjExMy00LjU1NS00Ljk1MSAwLTEuMDkzLjM5LTEuOTg4IDEuMDI5LTIuNjg4LS4xMDMtLjI1My0uNDQ2LTEuMjcyLjA5OC0yLjY1IDAgMCAuODQtLjI3IDIuNzUgMS4wMjZBOS41NjQgOS41NjQgMCAwMTEyIDYuODQ0Yy44NS4wMDQgMS43MDUuMTE1IDIuNTA0LjMzNyAxLjkwOS0xLjI5NiAyLjc0Ny0xLjAyNyAyLjc0Ny0xLjAyNy41NDYgMS4zNzkuMjAyIDIuMzk4LjEgMi42NTEuNjQuNyAxLjAyOCAxLjU5NSAxLjAyOCAyLjY4OCAwIDMuODQ4LTIuMzM5IDQuNjk1LTQuNTY2IDQuOTQzLjM1OS4zMDkuNjc4LjkyLjY3OCAxLjg1NSAwIDEuMzM4LS4wMTIgMi40MTktLjAxMiAyLjc0NyAwIC4yNjguMTguNTguNjg4LjQ4MkExMC4wMTkgMTAuMDE5IDAgMDAyMiAxMi4wMTdDMjIgNi40ODQgMTcuNTIyIDIgMTIgMnpcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtYmFzZSBmb250LXNlbWlib2xkIHRleHQtd2hpdGUgZ3JvdXAtaG92ZXI6dGV4dC1ncmF5LTMwMCB0cmFuc2l0aW9uLWNvbG9yc1wiPkdpdEh1YjwvcD5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSB0ZXh0LWtvamlueC10ZXh0LW11dGVkIG10LTAuNVwiPkxvZyBpbiB0byBhdXRvbWF0aWNhbGx5IHB1bGwgcHJvZmlsZSBkYXRhIGFuZCBwcm9qZWN0cy48L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHItNlwiPlxuICAgICAgICAgIEBpZiAoaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgcHgtNCBweS0yIHJvdW5kZWQtbGcgYmctZ3JlZW4tNTAwLzEwIGJvcmRlciBib3JkZXItZ3JlZW4tNTAwLzMwIHRleHQtZ3JlZW4tNDAwIHRleHQtc20gZm9udC1ib2xkIGZvbnQtbW9ub1wiPlxuICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwidy00IGgtNFwiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS13aWR0aD1cIjIuNVwiIGQ9XCJNNSAxM2w0IDRMMTkgN1wiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIENvbm5lY3RlZFxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEuNSBweC00IHB5LTIgcm91bmRlZC1sZyBiZy13aGl0ZS81IGJvcmRlciBib3JkZXItd2hpdGUvMTAgdGV4dC13aGl0ZSB0ZXh0LXNtIGZvbnQtYm9sZCBmb250LW1vbm8gZ3JvdXAtaG92ZXI6Ymctd2hpdGUvMTAgdHJhbnNpdGlvbi1jb2xvcnNcIj5cbiAgICAgICAgICAgICAgQ29ubmVjdFxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVGhlIE1vZGFsIC0tPlxuICAgIEBpZiAoc2hvd01vZGFsKCkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJmaXhlZCBpbnNldC0wIHotNTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYmctYmxhY2svNjAgYmFja2Ryb3AtYmx1ci1zbSBhbmltYXRlLWZhZGUtaW5cIiAoY2xpY2spPVwiY2xvc2VNb2RhbCgkZXZlbnQpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJiZy1rb2ppbngtcGFuZWwgYm9yZGVyIGJvcmRlci1rb2ppbngtYm9yZGVyIHJvdW5kZWQtMnhsIHctZnVsbCBtYXgtdy1sZyBzaGFkb3ctMnhsIG92ZXJmbG93LWhpZGRlbiBmbGV4IGZsZXgtY29sXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgIFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTYgYm9yZGVyLWIgYm9yZGVyLXdoaXRlLzUgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICA8aDIgY2xhc3M9XCJ0ZXh0LXhsIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIGZsZXggaXRlbXMtY2VudGVyIGdhcC0zXCI+XG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJ3LTYgaC02IHRleHQtd2hpdGVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTEyIDJDNi40NzcgMiAyIDYuNDg0IDIgMTIuMDE3YzAgNC40MjUgMi44NjUgOC4xOCA2LjgzOSA5LjUwNC41LjA5Mi42ODItLjIxNy42ODItLjQ4MyAwLS4yMzctLjAwOC0uODY4LS4wMTMtMS43MDMtMi43ODIuNjA1LTMuMzY5LTEuMzQzLTMuMzY5LTEuMzQzLS40NTQtMS4xNTgtMS4xMS0xLjQ2Ni0xLjExLTEuNDY2LS45MDgtLjYyLjA2OS0uNjA4LjA2OS0uNjA4IDEuMDAzLjA3IDEuNTMxIDEuMDMyIDEuNTMxIDEuMDMyLjg5MiAxLjUzIDIuMzQxIDEuMDg4IDIuOTEuODMyLjA5Mi0uNjQ3LjM1LTEuMDg4LjYzNi0xLjMzOC0yLjIyLS4yNTMtNC41NTUtMS4xMTMtNC41NTUtNC45NTEgMC0xLjA5My4zOS0xLjk4OCAxLjAyOS0yLjY4OC0uMTAzLS4yNTMtLjQ0Ni0xLjI3Mi4wOTgtMi42NSAwIDAgLjg0LS4yNyAyLjc1IDEuMDI2QTkuNTY0IDkuNTY0IDAgMDExMiA2Ljg0NGMuODUuMDA0IDEuNzA1LjExNSAyLjUwNC4zMzcgMS45MDktMS4yOTYgMi43NDctMS4wMjcgMi43NDctMS4wMjcuNTQ2IDEuMzc5LjIwMiAyLjM5OC4xIDIuNjUxLjY0LjcgMS4wMjggMS41OTUgMS4wMjggMi42ODggMCAzLjg0OC0yLjMzOSA0LjY5NS00LjU2NiA0Ljk0My4zNTkuMzA5LjY3OC45Mi42NzggMS44NTUgMCAxLjMzOC0uMDEyIDIuNDE5LS4wMTIgMi43NDcgMCAuMjY4LjE4LjU4LjY4OC40ODJBMTAuMDE5IDEwLjAxOSAwIDAwMjIgMTIuMDE3QzIyIDYuNDg0IDE3LjUyMiAyIDEyIDJ6XCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICBHaXRIdWIgSW50ZWdyYXRpb25cbiAgICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJzaG93TW9kYWwuc2V0KGZhbHNlKVwiIGNsYXNzPVwidGV4dC13aGl0ZS80MCBob3Zlcjp0ZXh0LXdoaXRlIHRyYW5zaXRpb24tY29sb3JzIHAtMSByb3VuZGVkLWxnIGhvdmVyOmJnLXdoaXRlLzVcIj5cbiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInctNSBoLTVcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2Utd2lkdGg9XCIyXCIgZD1cIk02IDE4TDE4IDZNNiA2bDEyIDEyXCIgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTYgc3BhY2UteS02XCI+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZy1rb2ppbngtYmx1ZS8xMCBib3JkZXIgYm9yZGVyLWtvamlueC1ibHVlLzMwIHJvdW5kZWQteGwgcC00IHRleHQtc20gdGV4dC1zbGF0ZS0zMDBcIj5cbiAgICAgICAgICAgICAgPHA+TG9nIGluIHRvIGF1dG9tYXRpY2FsbHkgcHVsbCB5b3VyIHByb2ZpbGUgZGF0YSBhbmQgcHJvamVjdHMuPC9wPlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cIm10LTIgdGV4dC1rb2ppbngtYmx1ZSBmb250LW1lZGl1bVwiPk5vdGU6IEtvamlueCBvbmx5IG1hcHMgdGhlIHJlcG9zaXRvcmllcyBpbnRlcm5hbGx5LiBJdCBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byByZWFkIG9yIG1vZGlmeSB5b3VyIHNvdXJjZSBjb2RlLjwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHAtNCBiZy1ibGFjay8yMCBib3JkZXIgYm9yZGVyLXdoaXRlLzUgcm91bmRlZC14bFwiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZm9udC1tZWRpdW0gdGV4dC13aGl0ZVwiPlJlcG9zaXRvcnkgTWFwcGluZzwvcD5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQteHMgdGV4dC1rb2ppbngtdGV4dC1tdXRlZCBtdC0xXCI+QWxsb3cgS29qaW54IHRvIGRpc2NvdmVyIGFuZCBtYXAgeW91ciByZXBvc2l0b3JpZXM8L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyZWxhdGl2ZSBpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJzci1vbmx5IHBlZXJcIiBbY2hlY2tlZF09XCJtYXBSZXBvcygpXCIgKGNoYW5nZSk9XCJ0b2dnbGVNYXBSZXBvcygpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTEgaC02IGJnLWJsYWNrLzQwIHBlZXItZm9jdXM6b3V0bGluZS1ub25lIHJvdW5kZWQtZnVsbCBwZWVyIHBlZXItY2hlY2tlZDphZnRlcjp0cmFuc2xhdGUteC1mdWxsIHBlZXItY2hlY2tlZDphZnRlcjpib3JkZXItd2hpdGUgYWZ0ZXI6Y29udGVudC1bJyddIGFmdGVyOmFic29sdXRlIGFmdGVyOnRvcC1bMnB4XSBhZnRlcjpsZWZ0LVsycHhdIGFmdGVyOmJnLXNsYXRlLTQwMCBwZWVyLWNoZWNrZWQ6YWZ0ZXI6Ymctd2hpdGUgYWZ0ZXI6cm91bmRlZC1mdWxsIGFmdGVyOmgtNSBhZnRlcjp3LTUgYWZ0ZXI6dHJhbnNpdGlvbi1hbGwgcGVlci1jaGVja2VkOmJnLWtvamlueC1ibHVlIGJvcmRlciBib3JkZXItd2hpdGUvMTBcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicC02IGJvcmRlci10IGJvcmRlci13aGl0ZS81IGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBiZy1ibGFjay8yMFwiPlxuICAgICAgICAgICAgQGlmIChpc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ1bmxpbmsoKTsgc2hvd01vZGFsLnNldChmYWxzZSlcIiBjbGFzcz1cInB4LTQgcHktMiByb3VuZGVkLWxnIHRleHQtc20gZm9udC1tZWRpdW0gYmctcmVkLTUwMC8xMCB0ZXh0LXJlZC00MDAgaG92ZXI6YmctcmVkLTUwMC8yMCBib3JkZXIgYm9yZGVyLXJlZC01MDAvMjAgdHJhbnNpdGlvbi1jb2xvcnNcIj5cbiAgICAgICAgICAgICAgICBEaXNjb25uZWN0IEdpdEh1YlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwic2hvd01vZGFsLnNldChmYWxzZSlcIiBjbGFzcz1cInB4LTYgcHktMiByb3VuZGVkLWxnIHRleHQtc20gZm9udC1tZWRpdW0gYmctd2hpdGUvNSB0ZXh0LXdoaXRlIGhvdmVyOmJnLXdoaXRlLzEwIGJvcmRlciBib3JkZXItd2hpdGUvMTAgdHJhbnNpdGlvbi1jb2xvcnMgbWwtYXV0b1wiPlxuICAgICAgICAgICAgICAgIERvbmVcbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibGluaygpOyBzaG93TW9kYWwuc2V0KGZhbHNlKVwiIGNsYXNzPVwicHgtNiBweS0yIHJvdW5kZWQtbGcgdGV4dC1zbSBmb250LW1lZGl1bSBiZy13aGl0ZSB0ZXh0LWJsYWNrIGhvdmVyOmJnLWdyYXktMjAwIHRyYW5zaXRpb24tY29sb3JzIG1sLWF1dG9cIj5cbiAgICAgICAgICAgICAgICBDb25uZWN0IEdpdEh1YlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBHaXRodWJJbnRlZ3JhdGlvbkNhcmRDb21wb25lbnQge1xuICBASW5wdXQoKSBpc0Nvbm5lY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgcmVhZG9ubHkgc2hvd01vZGFsID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgbWFwUmVwb3MgPSBzaWduYWwodHJ1ZSk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBnaXRodWJBdXRoOiBHaXRodWJBdXRoU2VydmljZSkge31cbiAgXG4gIGNsb3NlTW9kYWwoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLnNob3dNb2RhbC5zZXQoZmFsc2UpO1xuICB9XG5cbiAgdG9nZ2xlTWFwUmVwb3MoKSB7XG4gICAgdGhpcy5tYXBSZXBvcy51cGRhdGUodiA9PiAhdik7XG4gIH1cblxuICBsaW5rKCkge1xuICAgIHRoaXMuZ2l0aHViQXV0aC5saW5rR2l0aHViKCk7XG4gIH1cblxuICB1bmxpbmsoKSB7XG4gICAgdGhpcy5naXRodWJBdXRoLnVubGlua0dpdGh1YigpO1xuICB9XG59XG4iXX0=
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==
@@ -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();
@@ -118,14 +128,13 @@ class GithubIntegrationCardComponent {
118
128
  this.githubAuth = githubAuth;
119
129
  this.isConnected = false;
120
130
  this.showModal = signal(false);
121
- this.mapRepos = signal(true);
131
+ }
132
+ openModal() {
133
+ this.showModal.set(true);
122
134
  }
123
135
  closeModal(event) {
124
136
  this.showModal.set(false);
125
137
  }
126
- toggleMapRepos() {
127
- this.mapRepos.update(v => !v);
128
- }
129
138
  link() {
130
139
  this.githubAuth.linkGithub();
131
140
  }
@@ -135,7 +144,7 @@ class GithubIntegrationCardComponent {
135
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 }); }
136
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: `
137
146
  <!-- The Card -->
138
- <div (click)="showModal.set(true)" class="group cursor-pointer relative p-6 rounded-xl bg-kojinx-panel border border-kojinx-border hover:border-white/30 transition-colors">
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">
139
148
  <div class="flex items-center justify-between">
140
149
  <div class="flex items-center gap-4">
141
150
  <div class="w-12 h-12 rounded-xl bg-white/10 flex items-center justify-center border border-white/20">
@@ -187,19 +196,22 @@ class GithubIntegrationCardComponent {
187
196
  <div class="p-6 space-y-6">
188
197
 
189
198
  <div class="bg-kojinx-blue/10 border border-kojinx-blue/30 rounded-xl p-4 text-sm text-slate-300">
190
- <p>Log in to automatically pull your profile data and projects.</p>
191
- <p class="mt-2 text-kojinx-blue font-medium">Note: Kojinx only maps the repositories internally. It does not have access to read or modify your source code.</p>
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>
192
201
  </div>
193
202
 
194
- <div class="flex items-center justify-between p-4 bg-black/20 border border-white/5 rounded-xl">
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>
195
209
  <div>
196
- <p class="font-medium text-white">Repository Mapping</p>
197
- <p class="text-xs text-kojinx-text-muted mt-1">Allow Kojinx to discover and map your repositories</p>
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>
198
214
  </div>
199
- <label class="relative inline-flex items-center cursor-pointer">
200
- <input type="checkbox" class="sr-only peer" [checked]="mapRepos()" (change)="toggleMapRepos()">
201
- <div class="w-11 h-6 bg-black/40 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-slate-400 peer-checked:after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-kojinx-blue border border-white/10"></div>
202
- </label>
203
215
  </div>
204
216
 
205
217
  </div>
@@ -232,7 +244,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
232
244
  imports: [CommonModule],
233
245
  template: `
234
246
  <!-- The Card -->
235
- <div (click)="showModal.set(true)" class="group cursor-pointer relative p-6 rounded-xl bg-kojinx-panel border border-kojinx-border hover:border-white/30 transition-colors">
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">
236
248
  <div class="flex items-center justify-between">
237
249
  <div class="flex items-center gap-4">
238
250
  <div class="w-12 h-12 rounded-xl bg-white/10 flex items-center justify-center border border-white/20">
@@ -284,19 +296,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
284
296
  <div class="p-6 space-y-6">
285
297
 
286
298
  <div class="bg-kojinx-blue/10 border border-kojinx-blue/30 rounded-xl p-4 text-sm text-slate-300">
287
- <p>Log in to automatically pull your profile data and projects.</p>
288
- <p class="mt-2 text-kojinx-blue font-medium">Note: Kojinx only maps the repositories internally. It does not have access to read or modify your source code.</p>
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>
289
301
  </div>
290
302
 
291
- <div class="flex items-center justify-between p-4 bg-black/20 border border-white/5 rounded-xl">
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>
292
309
  <div>
293
- <p class="font-medium text-white">Repository Mapping</p>
294
- <p class="text-xs text-kojinx-text-muted mt-1">Allow Kojinx to discover and map your repositories</p>
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>
295
314
  </div>
296
- <label class="relative inline-flex items-center cursor-pointer">
297
- <input type="checkbox" class="sr-only peer" [checked]="mapRepos()" (change)="toggleMapRepos()">
298
- <div class="w-11 h-6 bg-black/40 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-slate-400 peer-checked:after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-kojinx-blue border border-white/10"></div>
299
- </label>
300
315
  </div>
301
316
 
302
317
  </div>
@@ -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, signal } 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)=\"showModal.set(true)\" 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 projects.</p>\n <p class=\"mt-2 text-kojinx-blue font-medium\">Note: Kojinx only maps the repositories internally. It does not have access to read or modify your source code.</p>\n </div>\n\n <div class=\"flex items-center justify-between p-4 bg-black/20 border border-white/5 rounded-xl\">\n <div>\n <p class=\"font-medium text-white\">Repository Mapping</p>\n <p class=\"text-xs text-kojinx-text-muted mt-1\">Allow Kojinx to discover and map your repositories</p>\n </div>\n <label class=\"relative inline-flex items-center cursor-pointer\">\n <input type=\"checkbox\" class=\"sr-only peer\" [checked]=\"mapRepos()\" (change)=\"toggleMapRepos()\">\n <div class=\"w-11 h-6 bg-black/40 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-slate-400 peer-checked:after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-kojinx-blue border border-white/10\"></div>\n </label>\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 readonly mapRepos = signal(true);\n\n constructor(private githubAuth: GithubAuthService) {}\n \n closeModal(event: MouseEvent) {\n this.showModal.set(false);\n }\n\n toggleMapRepos() {\n this.mapRepos.update(v => !v);\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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"}
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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"}
@@ -4,10 +4,9 @@ export declare class GithubIntegrationCardComponent {
4
4
  private githubAuth;
5
5
  isConnected: boolean;
6
6
  readonly showModal: import("@angular/core").WritableSignal<boolean>;
7
- readonly mapRepos: import("@angular/core").WritableSignal<boolean>;
8
7
  constructor(githubAuth: GithubAuthService);
8
+ openModal(): void;
9
9
  closeModal(event: MouseEvent): void;
10
- toggleMapRepos(): void;
11
10
  link(): void;
12
11
  unlink(): void;
13
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.5",
3
+ "version": "0.0.6",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^17.3.0",
6
6
  "@angular/core": "^17.3.0"