@raindrop-ai/wizard 0.0.1
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.
- package/LICENSE +47 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +117 -0
- package/dist/bin.js.map +1 -0
- package/dist/src/docs/browser.md +105 -0
- package/dist/src/docs/python.md +618 -0
- package/dist/src/docs/typescript.md +584 -0
- package/dist/src/docs/vercel-ai-sdk.md +304 -0
- package/dist/src/lib/agent-interface.d.ts +46 -0
- package/dist/src/lib/agent-interface.js +292 -0
- package/dist/src/lib/agent-interface.js.map +1 -0
- package/dist/src/lib/agent-prompts.d.ts +10 -0
- package/dist/src/lib/agent-prompts.js +49 -0
- package/dist/src/lib/agent-prompts.js.map +1 -0
- package/dist/src/lib/config.d.ts +39 -0
- package/dist/src/lib/config.js +549 -0
- package/dist/src/lib/config.js.map +1 -0
- package/dist/src/lib/constants.d.ts +27 -0
- package/dist/src/lib/constants.js +165 -0
- package/dist/src/lib/constants.js.map +1 -0
- package/dist/src/lib/handlers.d.ts +68 -0
- package/dist/src/lib/handlers.js +420 -0
- package/dist/src/lib/handlers.js.map +1 -0
- package/dist/src/lib/integration-testing.d.ts +44 -0
- package/dist/src/lib/integration-testing.js +123 -0
- package/dist/src/lib/integration-testing.js.map +1 -0
- package/dist/src/lib/mcp.d.ts +14 -0
- package/dist/src/lib/mcp.js +134 -0
- package/dist/src/lib/mcp.js.map +1 -0
- package/dist/src/lib/sdk-messages.d.ts +17 -0
- package/dist/src/lib/sdk-messages.js +278 -0
- package/dist/src/lib/sdk-messages.js.map +1 -0
- package/dist/src/lib/wizard.d.ts +6 -0
- package/dist/src/lib/wizard.js +131 -0
- package/dist/src/lib/wizard.js.map +1 -0
- package/dist/src/run.d.ts +8 -0
- package/dist/src/run.js +53 -0
- package/dist/src/run.js.map +1 -0
- package/dist/src/ui/App.d.ts +15 -0
- package/dist/src/ui/App.js +27 -0
- package/dist/src/ui/App.js.map +1 -0
- package/dist/src/ui/cancellation.d.ts +14 -0
- package/dist/src/ui/cancellation.js +17 -0
- package/dist/src/ui/cancellation.js.map +1 -0
- package/dist/src/ui/components/ClarifyingQuestionsPrompt.d.ts +17 -0
- package/dist/src/ui/components/ClarifyingQuestionsPrompt.js +359 -0
- package/dist/src/ui/components/ClarifyingQuestionsPrompt.js.map +1 -0
- package/dist/src/ui/components/ContinuePrompt.d.ts +14 -0
- package/dist/src/ui/components/ContinuePrompt.js +23 -0
- package/dist/src/ui/components/ContinuePrompt.js.map +1 -0
- package/dist/src/ui/components/DiffDisplay.d.ts +18 -0
- package/dist/src/ui/components/DiffDisplay.js +110 -0
- package/dist/src/ui/components/DiffDisplay.js.map +1 -0
- package/dist/src/ui/components/FeedbackSelectPrompt.d.ts +20 -0
- package/dist/src/ui/components/FeedbackSelectPrompt.js +132 -0
- package/dist/src/ui/components/FeedbackSelectPrompt.js.map +1 -0
- package/dist/src/ui/components/HistoryItemDisplay.d.ts +14 -0
- package/dist/src/ui/components/HistoryItemDisplay.js +140 -0
- package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -0
- package/dist/src/ui/components/Logo.d.ts +10 -0
- package/dist/src/ui/components/Logo.js +47 -0
- package/dist/src/ui/components/Logo.js.map +1 -0
- package/dist/src/ui/components/OrgInfoBox.d.ts +11 -0
- package/dist/src/ui/components/OrgInfoBox.js +16 -0
- package/dist/src/ui/components/OrgInfoBox.js.map +1 -0
- package/dist/src/ui/components/PendingPrompt.d.ts +18 -0
- package/dist/src/ui/components/PendingPrompt.js +57 -0
- package/dist/src/ui/components/PendingPrompt.js.map +1 -0
- package/dist/src/ui/components/PersistentTextInput.d.ts +21 -0
- package/dist/src/ui/components/PersistentTextInput.js +117 -0
- package/dist/src/ui/components/PersistentTextInput.js.map +1 -0
- package/dist/src/ui/components/PlanApprovalPrompt.d.ts +19 -0
- package/dist/src/ui/components/PlanApprovalPrompt.js +62 -0
- package/dist/src/ui/components/PlanApprovalPrompt.js.map +1 -0
- package/dist/src/ui/components/PromptContainer.d.ts +14 -0
- package/dist/src/ui/components/PromptContainer.js +18 -0
- package/dist/src/ui/components/PromptContainer.js.map +1 -0
- package/dist/src/ui/components/SelectPrompt.d.ts +14 -0
- package/dist/src/ui/components/SelectPrompt.js +62 -0
- package/dist/src/ui/components/SelectPrompt.js.map +1 -0
- package/dist/src/ui/components/SpinnerDisplay.d.ts +13 -0
- package/dist/src/ui/components/SpinnerDisplay.js +11 -0
- package/dist/src/ui/components/SpinnerDisplay.js.map +1 -0
- package/dist/src/ui/components/ToolApprovalPrompt.d.ts +14 -0
- package/dist/src/ui/components/ToolApprovalPrompt.js +142 -0
- package/dist/src/ui/components/ToolApprovalPrompt.js.map +1 -0
- package/dist/src/ui/components/ToolCallDisplay.d.ts +14 -0
- package/dist/src/ui/components/ToolCallDisplay.js +83 -0
- package/dist/src/ui/components/ToolCallDisplay.js.map +1 -0
- package/dist/src/ui/components/WriteKeyDisplay.d.ts +15 -0
- package/dist/src/ui/components/WriteKeyDisplay.js +13 -0
- package/dist/src/ui/components/WriteKeyDisplay.js.map +1 -0
- package/dist/src/ui/contexts/WizardContext.d.ts +210 -0
- package/dist/src/ui/contexts/WizardContext.js +362 -0
- package/dist/src/ui/contexts/WizardContext.js.map +1 -0
- package/dist/src/ui/hooks/useCancellation.d.ts +15 -0
- package/dist/src/ui/hooks/useCancellation.js +25 -0
- package/dist/src/ui/hooks/useCancellation.js.map +1 -0
- package/dist/src/ui/render.d.ts +34 -0
- package/dist/src/ui/render.js +94 -0
- package/dist/src/ui/render.js.map +1 -0
- package/dist/src/ui/types.d.ts +184 -0
- package/dist/src/ui/types.js +6 -0
- package/dist/src/ui/types.js.map +1 -0
- package/dist/src/utils/clack-utils.d.ts +13 -0
- package/dist/src/utils/clack-utils.js +131 -0
- package/dist/src/utils/clack-utils.js.map +1 -0
- package/dist/src/utils/debug.d.ts +13 -0
- package/dist/src/utils/debug.js +47 -0
- package/dist/src/utils/debug.js.map +1 -0
- package/dist/src/utils/environment.d.ts +5 -0
- package/dist/src/utils/environment.js +131 -0
- package/dist/src/utils/environment.js.map +1 -0
- package/dist/src/utils/logging.d.ts +9 -0
- package/dist/src/utils/logging.js +38 -0
- package/dist/src/utils/logging.js.map +1 -0
- package/dist/src/utils/oauth.d.ts +12 -0
- package/dist/src/utils/oauth.js +497 -0
- package/dist/src/utils/oauth.js.map +1 -0
- package/dist/src/utils/package-json-types.d.ts +44 -0
- package/dist/src/utils/package-json-types.js +6 -0
- package/dist/src/utils/package-json-types.js.map +1 -0
- package/dist/src/utils/package-json.d.ts +19 -0
- package/dist/src/utils/package-json.js +22 -0
- package/dist/src/utils/package-json.js.map +1 -0
- package/dist/src/utils/session.d.ts +2 -0
- package/dist/src/utils/session.js +87 -0
- package/dist/src/utils/session.js.map +1 -0
- package/dist/src/utils/types.d.ts +61 -0
- package/dist/src/utils/types.js +2 -0
- package/dist/src/utils/types.js.map +1 -0
- package/dist/src/utils/ui.d.ts +120 -0
- package/dist/src/utils/ui.js +164 -0
- package/dist/src/utils/ui.js.map +1 -0
- package/package.json +140 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface ConsentFlowResult {
|
|
2
|
+
token: string;
|
|
3
|
+
orgId: number;
|
|
4
|
+
orgPublicId: string;
|
|
5
|
+
orgName: string;
|
|
6
|
+
}
|
|
7
|
+
export interface WriteKeyResponse {
|
|
8
|
+
writeKey: string;
|
|
9
|
+
orgId: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function getOrgWriteKey(accessToken: string): Promise<WriteKeyResponse>;
|
|
12
|
+
export declare function performConsentFlow(): Promise<ConsentFlowResult>;
|
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
import * as crypto from 'node:crypto';
|
|
2
|
+
import * as http from 'node:http';
|
|
3
|
+
import Chalk from 'chalk';
|
|
4
|
+
// chalk v2 types don't work well with ESM default imports
|
|
5
|
+
const chalk = Chalk;
|
|
6
|
+
import open from 'open';
|
|
7
|
+
import ui from './ui.js';
|
|
8
|
+
import { WRITE_KEY_ENDPOINT, ISSUES_URL, APP_URL, CALLBACK_PORT, } from '../lib/constants.js';
|
|
9
|
+
import { abort } from './clack-utils.js';
|
|
10
|
+
const OAUTH_CALLBACK_STYLES = `
|
|
11
|
+
<style>
|
|
12
|
+
* {
|
|
13
|
+
margin: 0;
|
|
14
|
+
padding: 0;
|
|
15
|
+
box-sizing: border-box;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
body {
|
|
19
|
+
font-family: 'SF Mono', SFMono-Regular, ui-monospace, Menlo, Monaco, monospace;
|
|
20
|
+
min-height: 100vh;
|
|
21
|
+
display: flex;
|
|
22
|
+
align-items: center;
|
|
23
|
+
justify-content: center;
|
|
24
|
+
background: #FAFAFA;
|
|
25
|
+
overflow: hidden;
|
|
26
|
+
position: relative;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* Animated background grid */
|
|
30
|
+
body::before {
|
|
31
|
+
content: '';
|
|
32
|
+
position: absolute;
|
|
33
|
+
top: 0;
|
|
34
|
+
left: 0;
|
|
35
|
+
right: 0;
|
|
36
|
+
bottom: 0;
|
|
37
|
+
background-image:
|
|
38
|
+
linear-gradient(rgba(71, 85, 105, 0.08) 1px, transparent 1px),
|
|
39
|
+
linear-gradient(90deg, rgba(71, 85, 105, 0.08) 1px, transparent 1px);
|
|
40
|
+
background-size: 50px 50px;
|
|
41
|
+
animation: grid-move 20s linear infinite;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@keyframes grid-move {
|
|
45
|
+
0% { transform: translate(0, 0); }
|
|
46
|
+
100% { transform: translate(50px, 50px); }
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* Floating particles */
|
|
50
|
+
.particles {
|
|
51
|
+
position: absolute;
|
|
52
|
+
top: 0;
|
|
53
|
+
left: 0;
|
|
54
|
+
width: 100%;
|
|
55
|
+
height: 100%;
|
|
56
|
+
overflow: hidden;
|
|
57
|
+
z-index: 0;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.particle {
|
|
61
|
+
position: absolute;
|
|
62
|
+
width: 4px;
|
|
63
|
+
height: 4px;
|
|
64
|
+
background: rgba(71, 85, 105, 0.4);
|
|
65
|
+
border-radius: 50%;
|
|
66
|
+
animation: float-up 8s ease-in-out infinite;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.particle:nth-child(1) { left: 10%; animation-delay: 0s; animation-duration: 8s; }
|
|
70
|
+
.particle:nth-child(2) { left: 20%; animation-delay: 1s; animation-duration: 10s; }
|
|
71
|
+
.particle:nth-child(3) { left: 30%; animation-delay: 2s; animation-duration: 7s; }
|
|
72
|
+
.particle:nth-child(4) { left: 40%; animation-delay: 0.5s; animation-duration: 9s; }
|
|
73
|
+
.particle:nth-child(5) { left: 50%; animation-delay: 1.5s; animation-duration: 11s; }
|
|
74
|
+
.particle:nth-child(6) { left: 60%; animation-delay: 2.5s; animation-duration: 8s; }
|
|
75
|
+
.particle:nth-child(7) { left: 70%; animation-delay: 0.8s; animation-duration: 10s; }
|
|
76
|
+
.particle:nth-child(8) { left: 80%; animation-delay: 1.8s; animation-duration: 7s; }
|
|
77
|
+
.particle:nth-child(9) { left: 90%; animation-delay: 2.2s; animation-duration: 9s; }
|
|
78
|
+
|
|
79
|
+
@keyframes float-up {
|
|
80
|
+
0% { transform: translateY(100vh) scale(0); opacity: 0; }
|
|
81
|
+
10% { opacity: 1; }
|
|
82
|
+
90% { opacity: 1; }
|
|
83
|
+
100% { transform: translateY(-100vh) scale(1); opacity: 0; }
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.container {
|
|
87
|
+
position: relative;
|
|
88
|
+
z-index: 1;
|
|
89
|
+
text-align: center;
|
|
90
|
+
padding: 3rem;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* Raindrop icon */
|
|
94
|
+
.icon-container {
|
|
95
|
+
position: relative;
|
|
96
|
+
display: inline-block;
|
|
97
|
+
margin-bottom: 0.75rem;
|
|
98
|
+
animation: drop-in 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
|
|
99
|
+
opacity: 0;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
@keyframes drop-in {
|
|
103
|
+
0% { transform: translateY(-50px) scale(0.5); opacity: 0; }
|
|
104
|
+
100% { transform: translateY(0) scale(1); opacity: 1; }
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.raindrop-icon {
|
|
108
|
+
width: 100px;
|
|
109
|
+
height: 100px;
|
|
110
|
+
position: relative;
|
|
111
|
+
margin: 0 auto;
|
|
112
|
+
filter: drop-shadow(0 0 20px rgba(100, 116, 139, 0.3));
|
|
113
|
+
animation: glow-pulse 2s ease-in-out infinite;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.raindrop-icon svg {
|
|
117
|
+
width: 100%;
|
|
118
|
+
height: 100%;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
@keyframes glow-pulse {
|
|
122
|
+
0%, 100% { filter: drop-shadow(0 0 20px rgba(100, 116, 139, 0.3)); }
|
|
123
|
+
50% { filter: drop-shadow(0 0 30px rgba(100, 116, 139, 0.5)); }
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/* Success checkmark */
|
|
127
|
+
.checkmark-container {
|
|
128
|
+
position: absolute;
|
|
129
|
+
bottom: -10px;
|
|
130
|
+
right: -10px;
|
|
131
|
+
width: 36px;
|
|
132
|
+
height: 36px;
|
|
133
|
+
background: linear-gradient(135deg, #48bb78 0%, #38a169 100%);
|
|
134
|
+
border-radius: 50%;
|
|
135
|
+
display: flex;
|
|
136
|
+
align-items: center;
|
|
137
|
+
justify-content: center;
|
|
138
|
+
animation: pop-in 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) 0.3s forwards;
|
|
139
|
+
opacity: 0;
|
|
140
|
+
transform: scale(0);
|
|
141
|
+
box-shadow: 0 0 20px rgba(72, 187, 120, 0.5);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
@keyframes pop-in {
|
|
145
|
+
0% { transform: scale(0); opacity: 0; }
|
|
146
|
+
100% { transform: scale(1); opacity: 1; }
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.checkmark {
|
|
150
|
+
width: 18px;
|
|
151
|
+
height: 18px;
|
|
152
|
+
stroke: white;
|
|
153
|
+
stroke-width: 3;
|
|
154
|
+
fill: none;
|
|
155
|
+
stroke-linecap: round;
|
|
156
|
+
stroke-linejoin: round;
|
|
157
|
+
stroke-dasharray: 24;
|
|
158
|
+
stroke-dashoffset: 24;
|
|
159
|
+
animation: draw-check 0.4s ease-out 0.5s forwards;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
@keyframes draw-check {
|
|
163
|
+
100% { stroke-dashoffset: 0; }
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
h1 {
|
|
167
|
+
font-size: 2rem;
|
|
168
|
+
font-weight: 600;
|
|
169
|
+
color: #0f172a;
|
|
170
|
+
margin-bottom: 0.25rem;
|
|
171
|
+
animation: fade-up 0.6s ease-out 0.2s forwards;
|
|
172
|
+
opacity: 0;
|
|
173
|
+
transform: translateY(20px);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
@keyframes fade-up {
|
|
177
|
+
100% { opacity: 1; transform: translateY(0); }
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
p {
|
|
181
|
+
font-size: 1rem;
|
|
182
|
+
color: #475569;
|
|
183
|
+
line-height: 1.5;
|
|
184
|
+
animation: fade-up 0.6s ease-out 0.4s forwards;
|
|
185
|
+
opacity: 0;
|
|
186
|
+
transform: translateY(20px);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.terminal-hint {
|
|
190
|
+
display: inline-flex;
|
|
191
|
+
align-items: center;
|
|
192
|
+
gap: 0.5rem;
|
|
193
|
+
margin-top: 2.5rem;
|
|
194
|
+
padding: 0.75rem 1.25rem;
|
|
195
|
+
background: rgba(255, 255, 255, 0.5);
|
|
196
|
+
border: 1px solid rgba(100, 116, 139, 0.2);
|
|
197
|
+
border-radius: 8px;
|
|
198
|
+
animation: fade-up 0.6s ease-out 0.6s forwards;
|
|
199
|
+
opacity: 0;
|
|
200
|
+
transform: translateY(20px);
|
|
201
|
+
color: #475569;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.terminal-icon {
|
|
205
|
+
font-size: 1.2rem;
|
|
206
|
+
color: #64748b;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
.blink {
|
|
210
|
+
animation: blink-animation 1s steps(2, start) infinite;
|
|
211
|
+
color: #475569;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
@keyframes blink-animation {
|
|
215
|
+
to { opacity: 0; }
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.footer {
|
|
219
|
+
position: absolute;
|
|
220
|
+
bottom: 2rem;
|
|
221
|
+
left: 0;
|
|
222
|
+
right: 0;
|
|
223
|
+
text-align: center;
|
|
224
|
+
animation: fade-up 0.6s ease-out 0.8s forwards;
|
|
225
|
+
opacity: 0;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.footer a {
|
|
229
|
+
font-size: 0.875rem;
|
|
230
|
+
color: #64748b;
|
|
231
|
+
text-decoration: none;
|
|
232
|
+
transition: color 0.2s;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
.footer a:hover {
|
|
236
|
+
color: #334155;
|
|
237
|
+
}
|
|
238
|
+
</style>
|
|
239
|
+
`;
|
|
240
|
+
const OAUTH_CALLBACK_PARTICLES = `
|
|
241
|
+
<div class="particles">
|
|
242
|
+
<div class="particle"></div>
|
|
243
|
+
<div class="particle"></div>
|
|
244
|
+
<div class="particle"></div>
|
|
245
|
+
<div class="particle"></div>
|
|
246
|
+
<div class="particle"></div>
|
|
247
|
+
<div class="particle"></div>
|
|
248
|
+
<div class="particle"></div>
|
|
249
|
+
<div class="particle"></div>
|
|
250
|
+
<div class="particle"></div>
|
|
251
|
+
</div>
|
|
252
|
+
`;
|
|
253
|
+
const RAINDROP_SVG = `<svg viewBox="0 0 465 465" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
254
|
+
<path d="M221.143 36.5547C222.888 36.5532 224.633 36.5533 226.378 36.5605C228.614 36.5719 230.849 36.58 233.085 36.5771C234.846 36.5745 236.607 36.5745 238.368 36.5781C239.216 36.5804 240.064 36.5831 240.911 36.585C246.765 36.5817 252.551 36.7179 258.334 37.71C259.936 38.1823 261.396 38.6945 262.906 39.4043C264.232 40.1727 265.402 40.9839 266.585 41.957C267.634 42.9772 268.564 44.018 269.473 45.1641C270.301 46.3999 270.928 47.5959 271.535 48.9551C272.013 50.6108 272.364 52.2662 272.706 53.9551C273.071 56.2368 273.19 58.4545 273.218 60.7627C273.218 61.6297 273.218 61.6299 273.218 62.4795C273.238 64.3495 273.257 66.2197 273.268 68.0898C273.277 70.0207 273.289 69.9522 273.303 71.8828C273.315 73.1138 273.328 74.3452 273.34 75.5762C273.341 76.1691 273.343 76.7448 273.344 77.3203C273.351 78.1398 273.351 78.1399 273.358 78.9434C273.365 80.3647 273.365 80.3649 273.491 81.6709C273.627 82.1164 273.759 82.549 273.891 82.9814C274.087 83.3669 274.278 83.7411 274.469 84.1152C275.256 84.7788 275.256 84.7792 276.027 85.4297C277.097 86.0433 277.098 86.0434 278.381 86.5605C278.9 86.6675 279.403 86.7712 279.906 86.875C284.027 87.4143 288.098 87.6795 292.252 87.7744C293.754 87.8007 295.257 87.8287 296.759 87.8584C297.87 87.883 297.871 87.8821 298.96 87.9062C301.59 87.9536 304.136 88.1296 306.739 88.5156C309.009 89.082 309.009 89.0821 311.14 89.9824C311.942 90.5689 311.943 90.5697 312.73 91.1445C313.187 91.5807 313.63 92.0044 314.073 92.4277C315.387 93.538 315.388 93.5376 316.519 94.8721C316.872 95.485 317.215 96.0799 317.558 96.6748C318.553 98.9651 319.355 101.248 319.941 103.673C320.069 104.832 320.194 105.994 320.244 107.159C320.256 107.605 320.266 108.038 320.277 108.471C320.486 118.498 320.486 118.498 320.421 128.528C320.418 129.032 320.415 129.52 320.412 130.009C320.408 130.945 320.404 131.883 320.399 132.819C320.385 134.353 320.394 135.876 320.43 137.41C320.596 138.075 320.758 138.721 320.919 139.366C321.22 139.792 321.512 140.206 321.805 140.619C322.335 141.024 322.849 141.418 323.363 141.812C324.502 142.223 324.503 142.223 325.867 142.573C329.534 143.44 329.534 143.44 337.665 144.012C339.125 144.113 340.584 144.22 342.043 144.332C344.197 144.53 346.053 144.798 348.148 145.369C348.965 145.794 348.965 145.795 349.767 146.212C350.519 146.792 350.519 146.791 351.257 147.359C352.62 148.728 353.918 150.098 355.146 151.59C355.904 152.736 355.904 152.736 356.398 153.912C356.658 154.76 356.887 155.618 357.101 156.479C357.881 160.91 358.196 165.294 358.239 169.788C358.242 170.511 358.245 171.213 358.247 171.914C358.277 175.01 358.303 178.106 358.323 181.202C358.339 183.564 358.355 185.926 358.378 188.288C358.385 189.048 358.392 189.786 358.399 190.524C358.402 191.256 358.405 191.967 358.407 192.678C358.414 193.359 358.421 194.02 358.428 194.682C358.439 196.437 358.438 196.437 358.567 198.04C359.019 199.648 359.02 199.648 359.546 200.974C359.795 201.348 360.037 201.711 360.279 202.074C360.695 202.365 361.098 202.647 361.501 202.93C362.166 203.127 362.812 203.318 363.457 203.51C365.966 203.937 365.966 203.937 371.342 204.183C374.278 204.293 377.17 204.465 380.081 204.886C381.792 205.223 381.792 205.223 383.504 205.863C385.006 206.629 386.448 207.456 387.904 208.308V209.286H388.883C389.957 210.571 390.903 211.803 391.816 213.197C392.869 215.039 392.869 215.039 393.38 216.347C393.798 217.61 393.798 217.611 394.065 218.992C394.765 223.56 394.886 228.074 394.868 232.686C394.864 233.575 394.862 234.465 394.861 235.354C394.862 237.235 394.861 239.116 394.856 240.997C394.847 243.411 394.841 245.825 394.841 248.239C394.841 250.138 394.84 252.036 394.837 253.935C394.835 254.848 394.834 255.762 394.832 256.676C394.83 262.27 394.725 267.837 394.382 273.422C394.306 274.598 394.233 275.774 394.163 276.95C393.99 279.896 393.758 282.836 393.474 285.772C392.381 295.758 390.667 305.724 387.904 315.388C385.154 324.671 381.719 333.619 377.407 342.289C373.423 350.116 368.83 357.519 363.595 364.568C362.81 365.619 362.03 366.671 361.271 367.739C359.492 370.259 357.657 372.709 355.634 375.039C351.267 379.735 346.777 384.44 341.749 388.434C340.512 389.397 339.331 390.35 338.172 391.407C334.077 395.366 329.501 398.689 324.83 401.931C316.368 407.676 307.325 412.746 298.013 416.981C289.519 420.711 280.672 423.798 271.662 426.012C261.694 428.303 251.432 429.725 241.221 430.29C231.442 430.634 221.601 430.533 211.884 429.312C203.192 428.161 194.734 426.489 186.36 423.877C185.669 423.658 185.669 423.659 184.991 423.444C182.154 422.561 179.344 421.626 176.568 420.563C165.846 416.281 155.804 411.044 145.967 405.029C145.604 404.807 145.251 404.592 144.898 404.376C141.373 402.244 138.088 399.927 134.844 397.385C134.272 396.935 133.718 396.5 133.163 396.063C132.509 395.562 131.874 395.075 131.238 394.589C130.594 394.093 129.969 393.611 129.344 393.13C128.315 392.34 127.3 391.532 126.318 390.685V389.707H125.34C124.81 389.241 124.81 389.24 124.29 388.783C123.849 388.343 123.42 387.916 122.991 387.488C122.502 387.001 122.027 386.528 121.553 386.056C120.78 385.276 120.78 385.276 120.023 384.512C116.338 380.808 112.736 377.092 109.403 373.065C109.003 372.573 108.615 372.094 108.227 371.616C104.887 367.672 101.751 363.586 98.7178 359.402C93.3339 351.864 88.579 343.826 84.5616 335.479C81.8572 329.674 79.4821 323.792 77.7627 317.616C77.6474 317.191 77.5359 316.778 77.4239 316.365C77.2968 315.897 77.1732 315.442 77.0499 314.987C74.3695 304.905 72.8362 294.771 71.9024 284.388C71.8367 283.623 71.7728 282.881 71.709 282.139C70.7175 270.64 70.5085 259.13 70.5118 247.594C70.5149 245.414 70.5173 243.234 70.5147 241.054C70.5127 239.599 70.5114 238.144 70.5118 236.689C70.5123 235.981 70.5123 235.293 70.5127 234.604C70.5063 230.366 70.6099 226.214 71.0674 221.998C71.3926 219.55 71.8625 217.207 72.5948 214.848C72.9065 214.287 73.2092 213.742 73.5118 213.197C74.0911 212.427 74.6942 211.674 75.3145 210.936C76.5772 209.588 77.7805 208.524 79.2569 207.392L81.335 206.353C82.6945 205.848 84.0248 205.475 85.4395 205.154C87.5774 204.828 89.6876 204.711 91.8477 204.61C94.0002 204.52 96.143 204.428 98.2891 204.238C99.6906 204.048 101.003 203.816 102.359 203.418C102.962 203.086 103.547 202.763 104.132 202.44C104.527 201.942 104.91 201.458 105.293 200.974C105.48 200.232 105.661 199.513 105.843 198.793C106.26 196.49 106.405 194.242 106.444 191.904C106.449 191.389 106.452 190.889 106.456 190.389C106.482 188.722 106.508 187.056 106.527 185.39C106.619 177.222 106.62 169.028 107.249 160.88C107.499 159.183 107.784 157.564 108.227 155.908C108.73 154.482 109.306 153.193 110.03 151.865C110.784 150.683 110.784 150.683 111.649 149.635C112.519 148.739 112.519 148.739 113.483 147.984C115.527 146.675 115.526 146.675 117.658 145.677C118.975 145.139 118.975 145.14 120.45 144.745C122.328 144.496 124.186 144.371 126.077 144.273C130.048 144.119 134.018 144.09 137.919 143.297C139.52 142.789 139.52 142.789 141.354 142.056C141.894 141.64 142.418 141.236 142.942 140.833C143.303 140.137 143.654 139.462 144.004 138.786C144.502 137.458 144.503 137.457 144.898 135.943C145.092 134.102 145.142 132.298 145.156 130.446C145.15 129.395 145.151 129.395 145.145 128.365C145.159 126.123 145.172 123.881 145.174 121.639C145.173 119.328 145.175 117.016 145.18 114.705C145.188 113.228 145.197 111.751 145.205 110.274C145.194 107.74 145.187 105.223 145.387 102.695C145.674 101.211 145.675 101.211 146.086 99.8672C146.782 97.8795 146.781 97.8792 147.591 96.3623C148.44 95.1567 149.296 94.0183 150.276 92.916C151.286 91.9959 151.286 91.9958 152.385 91.2354C153.384 90.5439 153.384 90.5439 154.677 89.9824C156.313 89.4265 157.891 88.9185 159.566 88.5156C160.816 88.3545 162.042 88.2747 163.3 88.2256C163.746 88.2145 164.179 88.2041 164.612 88.1934C166.045 88.1396 167.479 88.0862 168.912 88.041C170.384 87.9963 171.856 87.9497 173.327 87.9004C174.273 87.8656 175.219 87.8305 176.164 87.7959C177.813 87.7514 179.432 87.663 181.08 87.5381C183.228 87.0961 183.229 87.0963 184.991 86.5605C185.917 86.0513 185.918 86.0509 186.825 85.5518C187.366 85.0634 187.89 84.5892 188.414 84.1152C188.777 83.4841 189.13 82.8714 189.482 82.2588C189.98 81.0767 189.98 81.0764 190.37 79.7148C190.547 78.0048 190.577 76.3411 190.565 74.6221C190.551 73.9952 190.537 73.3868 190.523 72.7783C190.499 69.7468 190.45 68.7257 190.246 65.7002C190.059 63.2781 189.88 60.8955 189.889 58.4648C190.033 56.1443 190.175 53.8501 190.628 51.5664C191.079 50.0536 191.746 48.6552 192.431 47.2363C193.136 45.9319 193.873 44.7579 194.771 43.5771C195.768 42.5612 195.769 42.5611 196.879 41.6826C198.283 40.6904 199.672 39.8818 201.189 39.0547C202.478 38.5363 203.747 38.1529 205.093 37.8008C209.259 36.8932 213.227 36.5582 217.487 36.541C218.706 36.5479 219.924 36.5543 221.143 36.5547ZM314.703 250.225C308.944 250.225 304.342 253.225 304.342 261.677C304.342 294.364 280.346 337.209 235.628 337.209C226.902 337.209 224.176 341.45 224.176 347.109V380.562C224.176 391.744 231.739 391.744 239.829 391.744C302.384 391.744 358.876 330.936 360.217 259.922H360.202C360.511 254.065 355.605 249.135 349.789 249.135L314.703 250.225Z" fill="#0f172a"/>
|
|
255
|
+
</svg>`;
|
|
256
|
+
function generateRandomState() {
|
|
257
|
+
return crypto.randomBytes(16).toString('hex');
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Decode the payload of a JWT without verifying the signature.
|
|
261
|
+
* We only need the claims for display purposes; the backend already verified.
|
|
262
|
+
*/
|
|
263
|
+
function decodeJWTPayload(token) {
|
|
264
|
+
const parts = token.split('.');
|
|
265
|
+
if (parts.length !== 3) {
|
|
266
|
+
throw new Error('Invalid JWT format');
|
|
267
|
+
}
|
|
268
|
+
const payload = Buffer.from(parts[1], 'base64url').toString('utf-8');
|
|
269
|
+
return JSON.parse(payload);
|
|
270
|
+
}
|
|
271
|
+
async function startCallbackServer(expectedState) {
|
|
272
|
+
return new Promise((resolve, reject) => {
|
|
273
|
+
let callbackResolve;
|
|
274
|
+
let callbackReject;
|
|
275
|
+
const waitForCallback = () => new Promise((res, rej) => {
|
|
276
|
+
callbackResolve = res;
|
|
277
|
+
callbackReject = rej;
|
|
278
|
+
});
|
|
279
|
+
const server = http.createServer((req, res) => {
|
|
280
|
+
// Disable keep-alive to ensure connections close after each response
|
|
281
|
+
res.setHeader('Connection', 'close');
|
|
282
|
+
if (!req.url) {
|
|
283
|
+
res.writeHead(400);
|
|
284
|
+
res.end();
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
const url = new URL(req.url, `http://localhost:${CALLBACK_PORT}`);
|
|
288
|
+
if (url.pathname !== '/callback') {
|
|
289
|
+
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
290
|
+
res.end('Not found');
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
const token = url.searchParams.get('token');
|
|
294
|
+
const state = url.searchParams.get('state');
|
|
295
|
+
const error = url.searchParams.get('error');
|
|
296
|
+
if (error) {
|
|
297
|
+
const isAccessDenied = error === 'access_denied';
|
|
298
|
+
res.writeHead(isAccessDenied ? 200 : 400, {
|
|
299
|
+
'Content-Type': 'text/html; charset=utf-8',
|
|
300
|
+
});
|
|
301
|
+
res.end(`
|
|
302
|
+
<html>
|
|
303
|
+
<head>
|
|
304
|
+
<meta charset="UTF-8">
|
|
305
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
306
|
+
<title>Raindrop wizard - Authorization ${isAccessDenied ? 'cancelled' : 'failed'}</title>
|
|
307
|
+
${OAUTH_CALLBACK_STYLES}
|
|
308
|
+
</head>
|
|
309
|
+
<body>
|
|
310
|
+
${OAUTH_CALLBACK_PARTICLES}
|
|
311
|
+
<div class="container">
|
|
312
|
+
<div class="icon-container">
|
|
313
|
+
<div class="raindrop-icon" style="opacity: 0.5;">
|
|
314
|
+
${RAINDROP_SVG}
|
|
315
|
+
</div>
|
|
316
|
+
</div>
|
|
317
|
+
<h1 style="color: ${isAccessDenied ? '#64748b' : '#dc2626'};">
|
|
318
|
+
${isAccessDenied ? 'Cancelled' : 'Authorization Failed'}
|
|
319
|
+
</h1>
|
|
320
|
+
<p>${isAccessDenied ? 'No worries! You can try again anytime.' : 'Something went wrong during authorization.'}</p>
|
|
321
|
+
<div class="terminal-hint">
|
|
322
|
+
<span class="terminal-icon">></span>
|
|
323
|
+
<span>Return to terminal<span class="blink">_</span></span>
|
|
324
|
+
</div>
|
|
325
|
+
</div>
|
|
326
|
+
</body>
|
|
327
|
+
</html>
|
|
328
|
+
`);
|
|
329
|
+
callbackReject(new Error(`OAuth error: ${error}`));
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
if (token) {
|
|
333
|
+
if (state !== expectedState) {
|
|
334
|
+
res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
335
|
+
res.end(`
|
|
336
|
+
<html>
|
|
337
|
+
<head>
|
|
338
|
+
<meta charset="UTF-8">
|
|
339
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
340
|
+
<title>Raindrop wizard - Invalid state</title>
|
|
341
|
+
${OAUTH_CALLBACK_STYLES}
|
|
342
|
+
</head>
|
|
343
|
+
<body>
|
|
344
|
+
${OAUTH_CALLBACK_PARTICLES}
|
|
345
|
+
<div class="container">
|
|
346
|
+
<div class="icon-container">
|
|
347
|
+
<div class="raindrop-icon" style="filter: grayscale(0.5) opacity(0.7);"></div>
|
|
348
|
+
</div>
|
|
349
|
+
<h1 style="color: #dc2626;">Security Error</h1>
|
|
350
|
+
<p>Invalid state parameter. Please try again.</p>
|
|
351
|
+
<div class="terminal-hint">
|
|
352
|
+
<span class="terminal-icon">></span>
|
|
353
|
+
<span>Close this window<span class="blink">_</span></span>
|
|
354
|
+
</div>
|
|
355
|
+
</div>
|
|
356
|
+
</body>
|
|
357
|
+
</html>
|
|
358
|
+
`);
|
|
359
|
+
callbackReject(new Error('Invalid state parameter'));
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
363
|
+
res.end(`
|
|
364
|
+
<html>
|
|
365
|
+
<head>
|
|
366
|
+
<meta charset="UTF-8">
|
|
367
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
368
|
+
<title>Raindrop wizard is ready</title>
|
|
369
|
+
${OAUTH_CALLBACK_STYLES}
|
|
370
|
+
</head>
|
|
371
|
+
<body>
|
|
372
|
+
${OAUTH_CALLBACK_PARTICLES}
|
|
373
|
+
<div class="container">
|
|
374
|
+
<div class="icon-container">
|
|
375
|
+
<div class="raindrop-icon">
|
|
376
|
+
${RAINDROP_SVG}
|
|
377
|
+
</div>
|
|
378
|
+
<div class="checkmark-container">
|
|
379
|
+
<svg class="checkmark" viewBox="0 0 24 24">
|
|
380
|
+
<polyline points="4,12 10,18 20,6"></polyline>
|
|
381
|
+
</svg>
|
|
382
|
+
</div>
|
|
383
|
+
</div>
|
|
384
|
+
<h1>Login Complete</h1>
|
|
385
|
+
<p>You're all set! Return to your terminal.</p>
|
|
386
|
+
<div class="terminal-hint">
|
|
387
|
+
<span class="terminal-icon">></span>
|
|
388
|
+
<span>Raindrop wizard is working<span class="blink">_</span></span>
|
|
389
|
+
</div>
|
|
390
|
+
</div>
|
|
391
|
+
<div class="footer">
|
|
392
|
+
<a href="https://raindrop.ai/docs" target="_blank">Need help? Check out our docs</a>
|
|
393
|
+
</div>
|
|
394
|
+
</body>
|
|
395
|
+
</html>
|
|
396
|
+
`);
|
|
397
|
+
callbackResolve(token);
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
// Handle any other requests (like favicon.ico) so connections close properly
|
|
401
|
+
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
402
|
+
res.end('Not found');
|
|
403
|
+
});
|
|
404
|
+
server.listen(CALLBACK_PORT, () => {
|
|
405
|
+
resolve({ server, waitForCallback });
|
|
406
|
+
});
|
|
407
|
+
server.on('error', reject);
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
export async function getOrgWriteKey(accessToken) {
|
|
411
|
+
const response = await fetch(WRITE_KEY_ENDPOINT, {
|
|
412
|
+
headers: {
|
|
413
|
+
Authorization: `Bearer ${accessToken}`,
|
|
414
|
+
},
|
|
415
|
+
});
|
|
416
|
+
if (!response.ok) {
|
|
417
|
+
let errorDetails = '';
|
|
418
|
+
try {
|
|
419
|
+
const errorBody = await response.text();
|
|
420
|
+
errorDetails = errorBody ? ` - ${errorBody}` : '';
|
|
421
|
+
}
|
|
422
|
+
catch (e) {
|
|
423
|
+
// Ignore errors reading response body
|
|
424
|
+
}
|
|
425
|
+
throw new Error(`Failed to get org write key: ${response.status} ${response.statusText}${errorDetails}`);
|
|
426
|
+
}
|
|
427
|
+
const data = (await response.json());
|
|
428
|
+
return { writeKey: data.api_key, orgId: data.org_id };
|
|
429
|
+
}
|
|
430
|
+
export async function performConsentFlow() {
|
|
431
|
+
const state = generateRandomState();
|
|
432
|
+
const redirectUri = `http://localhost:${CALLBACK_PORT}/callback`;
|
|
433
|
+
const { server, waitForCallback } = await startCallbackServer(state);
|
|
434
|
+
const consentUrl = `${APP_URL}/cli/authorize?state=${encodeURIComponent(state)}&redirect_uri=${encodeURIComponent(redirectUri)}`;
|
|
435
|
+
const continueResult = await ui.continuePrompt({
|
|
436
|
+
message: 'Sign in to Raindrop',
|
|
437
|
+
buttonLabel: 'Enter',
|
|
438
|
+
});
|
|
439
|
+
if (ui.isCancel(continueResult)) {
|
|
440
|
+
abort();
|
|
441
|
+
throw new Error('User cancelled sign in');
|
|
442
|
+
}
|
|
443
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
444
|
+
open(consentUrl, { wait: false }).catch(() => {
|
|
445
|
+
// open throws in environments without a browser
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
ui.addItem({
|
|
449
|
+
type: 'response',
|
|
450
|
+
text: `${chalk.bold("If the browser window didn't open automatically, please open the following link:")}\n\n${chalk.cyan(consentUrl)}`,
|
|
451
|
+
});
|
|
452
|
+
const loginSpinner = ui.spinner();
|
|
453
|
+
loginSpinner.start('Waiting for authorization...');
|
|
454
|
+
try {
|
|
455
|
+
const token = await Promise.race([
|
|
456
|
+
waitForCallback(),
|
|
457
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Authorization timed out')), 120_000)),
|
|
458
|
+
]);
|
|
459
|
+
// Stop spinner immediately and close server in background
|
|
460
|
+
loginSpinner.stop();
|
|
461
|
+
server.close();
|
|
462
|
+
// Decode JWT to extract org info
|
|
463
|
+
const payload = decodeJWTPayload(token);
|
|
464
|
+
return {
|
|
465
|
+
token,
|
|
466
|
+
orgId: payload.orgId,
|
|
467
|
+
orgPublicId: payload.orgPublicId,
|
|
468
|
+
orgName: payload.orgName,
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
catch (e) {
|
|
472
|
+
loginSpinner.stop('Authorization failed.');
|
|
473
|
+
server.close();
|
|
474
|
+
const error = e instanceof Error ? e : new Error('Unknown error');
|
|
475
|
+
if (error.message.includes('timeout')) {
|
|
476
|
+
ui.addItem({
|
|
477
|
+
type: 'error',
|
|
478
|
+
text: 'Authorization timed out. Please try again.',
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
else if (error.message.includes('access_denied')) {
|
|
482
|
+
ui.addItem({
|
|
483
|
+
type: 'response',
|
|
484
|
+
text: `${chalk.yellow('Authorization was cancelled.')}\n\nYou denied access to Raindrop. To use the Raindrop wizard, you need to authorize access to your Raindrop account.\n\n${chalk.dim('You can try again by re-running the Raindrop wizard.')}`,
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
else {
|
|
488
|
+
ui.addItem({
|
|
489
|
+
type: 'error',
|
|
490
|
+
text: `${chalk.red('Authorization failed:')}\n\n${error.message}\n\n${chalk.dim(`If you think this is a bug in the Raindrop wizard, please create an issue:\n${ISSUES_URL}`)}`,
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
abort();
|
|
494
|
+
throw error;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../src/utils/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,0DAA0D;AAC1D,MAAM,KAAK,GAAG,KAAY,CAAC;AAC3B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,OAAO,EACP,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqO7B,CAAC;AAEF,MAAM,wBAAwB,GAAG;;;;;;;;;;;;CAYhC,CAAC;AAEF,MAAM,YAAY,GAAG;;OAEd,CAAC;AASR,SAAS,mBAAmB;IAC1B,OAAO,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,KAAa;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,aAAqB;IAKrB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,eAAwC,CAAC;QAC7C,IAAI,cAAsC,CAAC;QAE3C,MAAM,eAAe,GAAG,GAAG,EAAE,CAC3B,IAAI,OAAO,CAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC/B,eAAe,GAAG,GAAG,CAAC;YACtB,cAAc,GAAG,GAAG,CAAC;QACvB,CAAC,CAAC,CAAC;QAEL,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC5C,qEAAqE;YACrE,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACrC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,oBAAoB,aAAa,EAAE,CAAC,CAAC;YAElE,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;gBACjC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAE5C,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,cAAc,GAAG,KAAK,KAAK,eAAe,CAAC;gBACjD,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE;oBACxC,cAAc,EAAE,0BAA0B;iBAC3C,CAAC,CAAC;gBACH,GAAG,CAAC,GAAG,CAAC;;;;;uDAMA,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QACjC;gBACE,qBAAqB;;;gBAGrB,wBAAwB;;;;sBAIlB,YAAY;;;oCAGE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;oBACtD,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,sBAAsB;;qBAEpD,cAAc,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAC,4CAA4C;;;;;;;;SAQpH,CAAC,CAAC;gBACH,cAAc,CAAC,IAAI,KAAK,CAAC,gBAAgB,KAAK,EAAE,CAAC,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YAED,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;oBAC5B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;oBACnE,GAAG,CAAC,GAAG,CAAC;;;;;;kBAMA,qBAAqB;;;kBAGrB,wBAAwB;;;;;;;;;;;;;;WAc/B,CAAC,CAAC;oBACH,cAAc,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;oBACrD,OAAO;gBACT,CAAC;gBAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;gBACnE,GAAG,CAAC,GAAG,CAAC;;;;;;gBAMA,qBAAqB;;;gBAGrB,wBAAwB;;;;sBAIlB,YAAY;;;;;;;;;;;;;;;;;;;;SAoBzB,CAAC,CAAC;gBACH,eAAe,CAAC,KAAK,CAAC,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,6EAA6E;YAC7E,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;YACrD,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,EAAE;YAChC,OAAO,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAAmB;IAEnB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kBAAkB,EAAE;QAC/C,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,WAAW,EAAE;SACvC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,sCAAsC;QACxC,CAAC;QACD,MAAM,IAAI,KAAK,CACb,gCAAgC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,GAAG,YAAY,EAAE,CACxF,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwC,CAAC;IAC5E,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,oBAAoB,aAAa,WAAW,CAAC;IAEjE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAErE,MAAM,UAAU,GAAG,GAAG,OAAO,wBAAwB,kBAAkB,CAAC,KAAK,CAAC,iBAAiB,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;IAEjI,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,cAAc,CAAC;QAC7C,OAAO,EAAE,qBAAqB;QAC9B,WAAW,EAAE,OAAO;KACrB,CAAC,CAAC;IAEH,IAAI,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAChC,KAAK,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QACpC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YAC3C,gDAAgD;QAClD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,EAAE,CAAC,OAAO,CAAC;QACT,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CACjB,kFAAkF,CACnF,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;KACjC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAClC,YAAY,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAC/B,eAAe,EAAE;YACjB,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC/B,UAAU,CACR,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,EAClD,OAAO,CACR,CACF;SACF,CAAC,CAAC;QAEH,0DAA0D;QAC1D,YAAY,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,CAAC,KAAK,EAAE,CAAC;QAEf,iCAAiC;QACjC,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAExC,OAAO;YACL,KAAK;YACL,KAAK,EAAE,OAAO,CAAC,KAAe;YAC9B,WAAW,EAAE,OAAO,CAAC,WAAqB;YAC1C,OAAO,EAAE,OAAO,CAAC,OAAiB;SACnC,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,YAAY,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,EAAE,CAAC;QAEf,MAAM,KAAK,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QAElE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,EAAE,CAAC,OAAO,CAAC;gBACT,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,4CAA4C;aACnD,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACnD,EAAE,CAAC,OAAO,CAAC;gBACT,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,GAAG,KAAK,CAAC,MAAM,CACnB,8BAA8B,CAC/B,4HAA4H,KAAK,CAAC,GAAG,CACpI,sDAAsD,CACvD,EAAE;aACJ,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,OAAO,CAAC;gBACT,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,OACzC,KAAK,CAAC,OACR,OAAO,KAAK,CAAC,GAAG,CACd,+EAA+E,UAAU,EAAE,CAC5F,EAAE;aACJ,CAAC,CAAC;QACL,CAAC;QAED,KAAK,EAAE,CAAC;QACR,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import * as crypto from 'node:crypto';\nimport * as http from 'node:http';\nimport Chalk from 'chalk';\n\n// chalk v2 types don't work well with ESM default imports\nconst chalk = Chalk as any;\nimport open from 'open';\nimport ui from './ui.js';\nimport {\n WRITE_KEY_ENDPOINT,\n ISSUES_URL,\n APP_URL,\n CALLBACK_PORT,\n} from '../lib/constants.js';\nimport { abort } from './clack-utils.js';\n\nconst OAUTH_CALLBACK_STYLES = `\n <style>\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n body {\n font-family: 'SF Mono', SFMono-Regular, ui-monospace, Menlo, Monaco, monospace;\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #FAFAFA;\n overflow: hidden;\n position: relative;\n }\n\n /* Animated background grid */\n body::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-image:\n linear-gradient(rgba(71, 85, 105, 0.08) 1px, transparent 1px),\n linear-gradient(90deg, rgba(71, 85, 105, 0.08) 1px, transparent 1px);\n background-size: 50px 50px;\n animation: grid-move 20s linear infinite;\n }\n\n @keyframes grid-move {\n 0% { transform: translate(0, 0); }\n 100% { transform: translate(50px, 50px); }\n }\n\n /* Floating particles */\n .particles {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n z-index: 0;\n }\n\n .particle {\n position: absolute;\n width: 4px;\n height: 4px;\n background: rgba(71, 85, 105, 0.4);\n border-radius: 50%;\n animation: float-up 8s ease-in-out infinite;\n }\n\n .particle:nth-child(1) { left: 10%; animation-delay: 0s; animation-duration: 8s; }\n .particle:nth-child(2) { left: 20%; animation-delay: 1s; animation-duration: 10s; }\n .particle:nth-child(3) { left: 30%; animation-delay: 2s; animation-duration: 7s; }\n .particle:nth-child(4) { left: 40%; animation-delay: 0.5s; animation-duration: 9s; }\n .particle:nth-child(5) { left: 50%; animation-delay: 1.5s; animation-duration: 11s; }\n .particle:nth-child(6) { left: 60%; animation-delay: 2.5s; animation-duration: 8s; }\n .particle:nth-child(7) { left: 70%; animation-delay: 0.8s; animation-duration: 10s; }\n .particle:nth-child(8) { left: 80%; animation-delay: 1.8s; animation-duration: 7s; }\n .particle:nth-child(9) { left: 90%; animation-delay: 2.2s; animation-duration: 9s; }\n\n @keyframes float-up {\n 0% { transform: translateY(100vh) scale(0); opacity: 0; }\n 10% { opacity: 1; }\n 90% { opacity: 1; }\n 100% { transform: translateY(-100vh) scale(1); opacity: 0; }\n }\n\n .container {\n position: relative;\n z-index: 1;\n text-align: center;\n padding: 3rem;\n }\n\n /* Raindrop icon */\n .icon-container {\n position: relative;\n display: inline-block;\n margin-bottom: 0.75rem;\n animation: drop-in 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;\n opacity: 0;\n }\n\n @keyframes drop-in {\n 0% { transform: translateY(-50px) scale(0.5); opacity: 0; }\n 100% { transform: translateY(0) scale(1); opacity: 1; }\n }\n\n .raindrop-icon {\n width: 100px;\n height: 100px;\n position: relative;\n margin: 0 auto;\n filter: drop-shadow(0 0 20px rgba(100, 116, 139, 0.3));\n animation: glow-pulse 2s ease-in-out infinite;\n }\n\n .raindrop-icon svg {\n width: 100%;\n height: 100%;\n }\n\n @keyframes glow-pulse {\n 0%, 100% { filter: drop-shadow(0 0 20px rgba(100, 116, 139, 0.3)); }\n 50% { filter: drop-shadow(0 0 30px rgba(100, 116, 139, 0.5)); }\n }\n\n /* Success checkmark */\n .checkmark-container {\n position: absolute;\n bottom: -10px;\n right: -10px;\n width: 36px;\n height: 36px;\n background: linear-gradient(135deg, #48bb78 0%, #38a169 100%);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n animation: pop-in 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) 0.3s forwards;\n opacity: 0;\n transform: scale(0);\n box-shadow: 0 0 20px rgba(72, 187, 120, 0.5);\n }\n\n @keyframes pop-in {\n 0% { transform: scale(0); opacity: 0; }\n 100% { transform: scale(1); opacity: 1; }\n }\n\n .checkmark {\n width: 18px;\n height: 18px;\n stroke: white;\n stroke-width: 3;\n fill: none;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-dasharray: 24;\n stroke-dashoffset: 24;\n animation: draw-check 0.4s ease-out 0.5s forwards;\n }\n\n @keyframes draw-check {\n 100% { stroke-dashoffset: 0; }\n }\n\n h1 {\n font-size: 2rem;\n font-weight: 600;\n color: #0f172a;\n margin-bottom: 0.25rem;\n animation: fade-up 0.6s ease-out 0.2s forwards;\n opacity: 0;\n transform: translateY(20px);\n }\n\n @keyframes fade-up {\n 100% { opacity: 1; transform: translateY(0); }\n }\n\n p {\n font-size: 1rem;\n color: #475569;\n line-height: 1.5;\n animation: fade-up 0.6s ease-out 0.4s forwards;\n opacity: 0;\n transform: translateY(20px);\n }\n\n .terminal-hint {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n margin-top: 2.5rem;\n padding: 0.75rem 1.25rem;\n background: rgba(255, 255, 255, 0.5);\n border: 1px solid rgba(100, 116, 139, 0.2);\n border-radius: 8px;\n animation: fade-up 0.6s ease-out 0.6s forwards;\n opacity: 0;\n transform: translateY(20px);\n color: #475569;\n }\n\n .terminal-icon {\n font-size: 1.2rem;\n color: #64748b;\n }\n\n .blink {\n animation: blink-animation 1s steps(2, start) infinite;\n color: #475569;\n }\n\n @keyframes blink-animation {\n to { opacity: 0; }\n }\n\n .footer {\n position: absolute;\n bottom: 2rem;\n left: 0;\n right: 0;\n text-align: center;\n animation: fade-up 0.6s ease-out 0.8s forwards;\n opacity: 0;\n }\n\n .footer a {\n font-size: 0.875rem;\n color: #64748b;\n text-decoration: none;\n transition: color 0.2s;\n }\n\n .footer a:hover {\n color: #334155;\n }\n </style>\n`;\n\nconst OAUTH_CALLBACK_PARTICLES = `\n <div class=\"particles\">\n <div class=\"particle\"></div>\n <div class=\"particle\"></div>\n <div class=\"particle\"></div>\n <div class=\"particle\"></div>\n <div class=\"particle\"></div>\n <div class=\"particle\"></div>\n <div class=\"particle\"></div>\n <div class=\"particle\"></div>\n <div class=\"particle\"></div>\n </div>\n`;\n\nconst RAINDROP_SVG = `<svg viewBox=\"0 0 465 465\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M221.143 36.5547C222.888 36.5532 224.633 36.5533 226.378 36.5605C228.614 36.5719 230.849 36.58 233.085 36.5771C234.846 36.5745 236.607 36.5745 238.368 36.5781C239.216 36.5804 240.064 36.5831 240.911 36.585C246.765 36.5817 252.551 36.7179 258.334 37.71C259.936 38.1823 261.396 38.6945 262.906 39.4043C264.232 40.1727 265.402 40.9839 266.585 41.957C267.634 42.9772 268.564 44.018 269.473 45.1641C270.301 46.3999 270.928 47.5959 271.535 48.9551C272.013 50.6108 272.364 52.2662 272.706 53.9551C273.071 56.2368 273.19 58.4545 273.218 60.7627C273.218 61.6297 273.218 61.6299 273.218 62.4795C273.238 64.3495 273.257 66.2197 273.268 68.0898C273.277 70.0207 273.289 69.9522 273.303 71.8828C273.315 73.1138 273.328 74.3452 273.34 75.5762C273.341 76.1691 273.343 76.7448 273.344 77.3203C273.351 78.1398 273.351 78.1399 273.358 78.9434C273.365 80.3647 273.365 80.3649 273.491 81.6709C273.627 82.1164 273.759 82.549 273.891 82.9814C274.087 83.3669 274.278 83.7411 274.469 84.1152C275.256 84.7788 275.256 84.7792 276.027 85.4297C277.097 86.0433 277.098 86.0434 278.381 86.5605C278.9 86.6675 279.403 86.7712 279.906 86.875C284.027 87.4143 288.098 87.6795 292.252 87.7744C293.754 87.8007 295.257 87.8287 296.759 87.8584C297.87 87.883 297.871 87.8821 298.96 87.9062C301.59 87.9536 304.136 88.1296 306.739 88.5156C309.009 89.082 309.009 89.0821 311.14 89.9824C311.942 90.5689 311.943 90.5697 312.73 91.1445C313.187 91.5807 313.63 92.0044 314.073 92.4277C315.387 93.538 315.388 93.5376 316.519 94.8721C316.872 95.485 317.215 96.0799 317.558 96.6748C318.553 98.9651 319.355 101.248 319.941 103.673C320.069 104.832 320.194 105.994 320.244 107.159C320.256 107.605 320.266 108.038 320.277 108.471C320.486 118.498 320.486 118.498 320.421 128.528C320.418 129.032 320.415 129.52 320.412 130.009C320.408 130.945 320.404 131.883 320.399 132.819C320.385 134.353 320.394 135.876 320.43 137.41C320.596 138.075 320.758 138.721 320.919 139.366C321.22 139.792 321.512 140.206 321.805 140.619C322.335 141.024 322.849 141.418 323.363 141.812C324.502 142.223 324.503 142.223 325.867 142.573C329.534 143.44 329.534 143.44 337.665 144.012C339.125 144.113 340.584 144.22 342.043 144.332C344.197 144.53 346.053 144.798 348.148 145.369C348.965 145.794 348.965 145.795 349.767 146.212C350.519 146.792 350.519 146.791 351.257 147.359C352.62 148.728 353.918 150.098 355.146 151.59C355.904 152.736 355.904 152.736 356.398 153.912C356.658 154.76 356.887 155.618 357.101 156.479C357.881 160.91 358.196 165.294 358.239 169.788C358.242 170.511 358.245 171.213 358.247 171.914C358.277 175.01 358.303 178.106 358.323 181.202C358.339 183.564 358.355 185.926 358.378 188.288C358.385 189.048 358.392 189.786 358.399 190.524C358.402 191.256 358.405 191.967 358.407 192.678C358.414 193.359 358.421 194.02 358.428 194.682C358.439 196.437 358.438 196.437 358.567 198.04C359.019 199.648 359.02 199.648 359.546 200.974C359.795 201.348 360.037 201.711 360.279 202.074C360.695 202.365 361.098 202.647 361.501 202.93C362.166 203.127 362.812 203.318 363.457 203.51C365.966 203.937 365.966 203.937 371.342 204.183C374.278 204.293 377.17 204.465 380.081 204.886C381.792 205.223 381.792 205.223 383.504 205.863C385.006 206.629 386.448 207.456 387.904 208.308V209.286H388.883C389.957 210.571 390.903 211.803 391.816 213.197C392.869 215.039 392.869 215.039 393.38 216.347C393.798 217.61 393.798 217.611 394.065 218.992C394.765 223.56 394.886 228.074 394.868 232.686C394.864 233.575 394.862 234.465 394.861 235.354C394.862 237.235 394.861 239.116 394.856 240.997C394.847 243.411 394.841 245.825 394.841 248.239C394.841 250.138 394.84 252.036 394.837 253.935C394.835 254.848 394.834 255.762 394.832 256.676C394.83 262.27 394.725 267.837 394.382 273.422C394.306 274.598 394.233 275.774 394.163 276.95C393.99 279.896 393.758 282.836 393.474 285.772C392.381 295.758 390.667 305.724 387.904 315.388C385.154 324.671 381.719 333.619 377.407 342.289C373.423 350.116 368.83 357.519 363.595 364.568C362.81 365.619 362.03 366.671 361.271 367.739C359.492 370.259 357.657 372.709 355.634 375.039C351.267 379.735 346.777 384.44 341.749 388.434C340.512 389.397 339.331 390.35 338.172 391.407C334.077 395.366 329.501 398.689 324.83 401.931C316.368 407.676 307.325 412.746 298.013 416.981C289.519 420.711 280.672 423.798 271.662 426.012C261.694 428.303 251.432 429.725 241.221 430.29C231.442 430.634 221.601 430.533 211.884 429.312C203.192 428.161 194.734 426.489 186.36 423.877C185.669 423.658 185.669 423.659 184.991 423.444C182.154 422.561 179.344 421.626 176.568 420.563C165.846 416.281 155.804 411.044 145.967 405.029C145.604 404.807 145.251 404.592 144.898 404.376C141.373 402.244 138.088 399.927 134.844 397.385C134.272 396.935 133.718 396.5 133.163 396.063C132.509 395.562 131.874 395.075 131.238 394.589C130.594 394.093 129.969 393.611 129.344 393.13C128.315 392.34 127.3 391.532 126.318 390.685V389.707H125.34C124.81 389.241 124.81 389.24 124.29 388.783C123.849 388.343 123.42 387.916 122.991 387.488C122.502 387.001 122.027 386.528 121.553 386.056C120.78 385.276 120.78 385.276 120.023 384.512C116.338 380.808 112.736 377.092 109.403 373.065C109.003 372.573 108.615 372.094 108.227 371.616C104.887 367.672 101.751 363.586 98.7178 359.402C93.3339 351.864 88.579 343.826 84.5616 335.479C81.8572 329.674 79.4821 323.792 77.7627 317.616C77.6474 317.191 77.5359 316.778 77.4239 316.365C77.2968 315.897 77.1732 315.442 77.0499 314.987C74.3695 304.905 72.8362 294.771 71.9024 284.388C71.8367 283.623 71.7728 282.881 71.709 282.139C70.7175 270.64 70.5085 259.13 70.5118 247.594C70.5149 245.414 70.5173 243.234 70.5147 241.054C70.5127 239.599 70.5114 238.144 70.5118 236.689C70.5123 235.981 70.5123 235.293 70.5127 234.604C70.5063 230.366 70.6099 226.214 71.0674 221.998C71.3926 219.55 71.8625 217.207 72.5948 214.848C72.9065 214.287 73.2092 213.742 73.5118 213.197C74.0911 212.427 74.6942 211.674 75.3145 210.936C76.5772 209.588 77.7805 208.524 79.2569 207.392L81.335 206.353C82.6945 205.848 84.0248 205.475 85.4395 205.154C87.5774 204.828 89.6876 204.711 91.8477 204.61C94.0002 204.52 96.143 204.428 98.2891 204.238C99.6906 204.048 101.003 203.816 102.359 203.418C102.962 203.086 103.547 202.763 104.132 202.44C104.527 201.942 104.91 201.458 105.293 200.974C105.48 200.232 105.661 199.513 105.843 198.793C106.26 196.49 106.405 194.242 106.444 191.904C106.449 191.389 106.452 190.889 106.456 190.389C106.482 188.722 106.508 187.056 106.527 185.39C106.619 177.222 106.62 169.028 107.249 160.88C107.499 159.183 107.784 157.564 108.227 155.908C108.73 154.482 109.306 153.193 110.03 151.865C110.784 150.683 110.784 150.683 111.649 149.635C112.519 148.739 112.519 148.739 113.483 147.984C115.527 146.675 115.526 146.675 117.658 145.677C118.975 145.139 118.975 145.14 120.45 144.745C122.328 144.496 124.186 144.371 126.077 144.273C130.048 144.119 134.018 144.09 137.919 143.297C139.52 142.789 139.52 142.789 141.354 142.056C141.894 141.64 142.418 141.236 142.942 140.833C143.303 140.137 143.654 139.462 144.004 138.786C144.502 137.458 144.503 137.457 144.898 135.943C145.092 134.102 145.142 132.298 145.156 130.446C145.15 129.395 145.151 129.395 145.145 128.365C145.159 126.123 145.172 123.881 145.174 121.639C145.173 119.328 145.175 117.016 145.18 114.705C145.188 113.228 145.197 111.751 145.205 110.274C145.194 107.74 145.187 105.223 145.387 102.695C145.674 101.211 145.675 101.211 146.086 99.8672C146.782 97.8795 146.781 97.8792 147.591 96.3623C148.44 95.1567 149.296 94.0183 150.276 92.916C151.286 91.9959 151.286 91.9958 152.385 91.2354C153.384 90.5439 153.384 90.5439 154.677 89.9824C156.313 89.4265 157.891 88.9185 159.566 88.5156C160.816 88.3545 162.042 88.2747 163.3 88.2256C163.746 88.2145 164.179 88.2041 164.612 88.1934C166.045 88.1396 167.479 88.0862 168.912 88.041C170.384 87.9963 171.856 87.9497 173.327 87.9004C174.273 87.8656 175.219 87.8305 176.164 87.7959C177.813 87.7514 179.432 87.663 181.08 87.5381C183.228 87.0961 183.229 87.0963 184.991 86.5605C185.917 86.0513 185.918 86.0509 186.825 85.5518C187.366 85.0634 187.89 84.5892 188.414 84.1152C188.777 83.4841 189.13 82.8714 189.482 82.2588C189.98 81.0767 189.98 81.0764 190.37 79.7148C190.547 78.0048 190.577 76.3411 190.565 74.6221C190.551 73.9952 190.537 73.3868 190.523 72.7783C190.499 69.7468 190.45 68.7257 190.246 65.7002C190.059 63.2781 189.88 60.8955 189.889 58.4648C190.033 56.1443 190.175 53.8501 190.628 51.5664C191.079 50.0536 191.746 48.6552 192.431 47.2363C193.136 45.9319 193.873 44.7579 194.771 43.5771C195.768 42.5612 195.769 42.5611 196.879 41.6826C198.283 40.6904 199.672 39.8818 201.189 39.0547C202.478 38.5363 203.747 38.1529 205.093 37.8008C209.259 36.8932 213.227 36.5582 217.487 36.541C218.706 36.5479 219.924 36.5543 221.143 36.5547ZM314.703 250.225C308.944 250.225 304.342 253.225 304.342 261.677C304.342 294.364 280.346 337.209 235.628 337.209C226.902 337.209 224.176 341.45 224.176 347.109V380.562C224.176 391.744 231.739 391.744 239.829 391.744C302.384 391.744 358.876 330.936 360.217 259.922H360.202C360.511 254.065 355.605 249.135 349.789 249.135L314.703 250.225Z\" fill=\"#0f172a\"/>\n</svg>`;\n\nexport interface ConsentFlowResult {\n token: string;\n orgId: number;\n orgPublicId: string;\n orgName: string;\n}\n\nfunction generateRandomState(): string {\n return crypto.randomBytes(16).toString('hex');\n}\n\n/**\n * Decode the payload of a JWT without verifying the signature.\n * We only need the claims for display purposes; the backend already verified.\n */\nfunction decodeJWTPayload(token: string): Record<string, unknown> {\n const parts = token.split('.');\n if (parts.length !== 3) {\n throw new Error('Invalid JWT format');\n }\n const payload = Buffer.from(parts[1], 'base64url').toString('utf-8');\n return JSON.parse(payload);\n}\n\nasync function startCallbackServer(\n expectedState: string,\n): Promise<{\n server: http.Server;\n waitForCallback: () => Promise<string>;\n}> {\n return new Promise((resolve, reject) => {\n let callbackResolve: (token: string) => void;\n let callbackReject: (error: Error) => void;\n\n const waitForCallback = () =>\n new Promise<string>((res, rej) => {\n callbackResolve = res;\n callbackReject = rej;\n });\n\n const server = http.createServer((req, res) => {\n // Disable keep-alive to ensure connections close after each response\n res.setHeader('Connection', 'close');\n if (!req.url) {\n res.writeHead(400);\n res.end();\n return;\n }\n const url = new URL(req.url, `http://localhost:${CALLBACK_PORT}`);\n\n if (url.pathname !== '/callback') {\n res.writeHead(404, { 'Content-Type': 'text/plain' });\n res.end('Not found');\n return;\n }\n\n const token = url.searchParams.get('token');\n const state = url.searchParams.get('state');\n const error = url.searchParams.get('error');\n\n if (error) {\n const isAccessDenied = error === 'access_denied';\n res.writeHead(isAccessDenied ? 200 : 400, {\n 'Content-Type': 'text/html; charset=utf-8',\n });\n res.end(`\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Raindrop wizard - Authorization ${\n isAccessDenied ? 'cancelled' : 'failed'\n }</title>\n ${OAUTH_CALLBACK_STYLES}\n </head>\n <body>\n ${OAUTH_CALLBACK_PARTICLES}\n <div class=\"container\">\n <div class=\"icon-container\">\n <div class=\"raindrop-icon\" style=\"opacity: 0.5;\">\n ${RAINDROP_SVG}\n </div>\n </div>\n <h1 style=\"color: ${isAccessDenied ? '#64748b' : '#dc2626'};\">\n ${isAccessDenied ? 'Cancelled' : 'Authorization Failed'}\n </h1>\n <p>${isAccessDenied ? 'No worries! You can try again anytime.' : 'Something went wrong during authorization.'}</p>\n <div class=\"terminal-hint\">\n <span class=\"terminal-icon\">></span>\n <span>Return to terminal<span class=\"blink\">_</span></span>\n </div>\n </div>\n </body>\n </html>\n `);\n callbackReject(new Error(`OAuth error: ${error}`));\n return;\n }\n\n if (token) {\n if (state !== expectedState) {\n res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(`\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Raindrop wizard - Invalid state</title>\n ${OAUTH_CALLBACK_STYLES}\n </head>\n <body>\n ${OAUTH_CALLBACK_PARTICLES}\n <div class=\"container\">\n <div class=\"icon-container\">\n <div class=\"raindrop-icon\" style=\"filter: grayscale(0.5) opacity(0.7);\"></div>\n </div>\n <h1 style=\"color: #dc2626;\">Security Error</h1>\n <p>Invalid state parameter. Please try again.</p>\n <div class=\"terminal-hint\">\n <span class=\"terminal-icon\">></span>\n <span>Close this window<span class=\"blink\">_</span></span>\n </div>\n </div>\n </body>\n </html>\n `);\n callbackReject(new Error('Invalid state parameter'));\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(`\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Raindrop wizard is ready</title>\n ${OAUTH_CALLBACK_STYLES}\n </head>\n <body>\n ${OAUTH_CALLBACK_PARTICLES}\n <div class=\"container\">\n <div class=\"icon-container\">\n <div class=\"raindrop-icon\">\n ${RAINDROP_SVG}\n </div>\n <div class=\"checkmark-container\">\n <svg class=\"checkmark\" viewBox=\"0 0 24 24\">\n <polyline points=\"4,12 10,18 20,6\"></polyline>\n </svg>\n </div>\n </div>\n <h1>Login Complete</h1>\n <p>You're all set! Return to your terminal.</p>\n <div class=\"terminal-hint\">\n <span class=\"terminal-icon\">></span>\n <span>Raindrop wizard is working<span class=\"blink\">_</span></span>\n </div>\n </div>\n <div class=\"footer\">\n <a href=\"https://raindrop.ai/docs\" target=\"_blank\">Need help? Check out our docs</a>\n </div>\n </body>\n </html>\n `);\n callbackResolve(token);\n return;\n }\n\n // Handle any other requests (like favicon.ico) so connections close properly\n res.writeHead(404, { 'Content-Type': 'text/plain' });\n res.end('Not found');\n });\n\n server.listen(CALLBACK_PORT, () => {\n resolve({ server, waitForCallback });\n });\n\n server.on('error', reject);\n });\n}\n\nexport interface WriteKeyResponse {\n writeKey: string;\n orgId: string;\n}\n\nexport async function getOrgWriteKey(\n accessToken: string,\n): Promise<WriteKeyResponse> {\n const response = await fetch(WRITE_KEY_ENDPOINT, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n if (!response.ok) {\n let errorDetails = '';\n try {\n const errorBody = await response.text();\n errorDetails = errorBody ? ` - ${errorBody}` : '';\n } catch (e) {\n // Ignore errors reading response body\n }\n throw new Error(\n `Failed to get org write key: ${response.status} ${response.statusText}${errorDetails}`,\n );\n }\n\n const data = (await response.json()) as { api_key: string; org_id: string };\n return { writeKey: data.api_key, orgId: data.org_id };\n}\n\nexport async function performConsentFlow(): Promise<ConsentFlowResult> {\n const state = generateRandomState();\n const redirectUri = `http://localhost:${CALLBACK_PORT}/callback`;\n\n const { server, waitForCallback } = await startCallbackServer(state);\n\n const consentUrl = `${APP_URL}/cli/authorize?state=${encodeURIComponent(state)}&redirect_uri=${encodeURIComponent(redirectUri)}`;\n\n const continueResult = await ui.continuePrompt({\n message: 'Sign in to Raindrop',\n buttonLabel: 'Enter',\n });\n\n if (ui.isCancel(continueResult)) {\n abort();\n throw new Error('User cancelled sign in');\n }\n\n if (process.env.NODE_ENV !== 'test') {\n open(consentUrl, { wait: false }).catch(() => {\n // open throws in environments without a browser\n });\n }\n\n ui.addItem({\n type: 'response',\n text: `${chalk.bold(\n \"If the browser window didn't open automatically, please open the following link:\",\n )}\\n\\n${chalk.cyan(consentUrl)}`,\n });\n\n const loginSpinner = ui.spinner();\n loginSpinner.start('Waiting for authorization...');\n\n try {\n const token = await Promise.race([\n waitForCallback(),\n new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error('Authorization timed out')),\n 120_000,\n ),\n ),\n ]);\n\n // Stop spinner immediately and close server in background\n loginSpinner.stop();\n server.close();\n\n // Decode JWT to extract org info\n const payload = decodeJWTPayload(token);\n\n return {\n token,\n orgId: payload.orgId as number,\n orgPublicId: payload.orgPublicId as string,\n orgName: payload.orgName as string,\n };\n } catch (e) {\n loginSpinner.stop('Authorization failed.');\n server.close();\n\n const error = e instanceof Error ? e : new Error('Unknown error');\n\n if (error.message.includes('timeout')) {\n ui.addItem({\n type: 'error',\n text: 'Authorization timed out. Please try again.',\n });\n } else if (error.message.includes('access_denied')) {\n ui.addItem({\n type: 'response',\n text: `${chalk.yellow(\n 'Authorization was cancelled.',\n )}\\n\\nYou denied access to Raindrop. To use the Raindrop wizard, you need to authorize access to your Raindrop account.\\n\\n${chalk.dim(\n 'You can try again by re-running the Raindrop wizard.',\n )}`,\n });\n } else {\n ui.addItem({\n type: 'error',\n text: `${chalk.red('Authorization failed:')}\\n\\n${\n error.message\n }\\n\\n${chalk.dim(\n `If you think this is a bug in the Raindrop wizard, please create an issue:\\n${ISSUES_URL}`,\n )}`,\n });\n }\n\n abort();\n throw error;\n }\n}\n"]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for package.json structure.
|
|
3
|
+
* Eliminates the need for `any` types when working with package.json files.
|
|
4
|
+
*/
|
|
5
|
+
export interface PackageJson {
|
|
6
|
+
name?: string;
|
|
7
|
+
version?: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
main?: string;
|
|
10
|
+
module?: string;
|
|
11
|
+
types?: string;
|
|
12
|
+
scripts?: Record<string, string>;
|
|
13
|
+
dependencies?: Record<string, string>;
|
|
14
|
+
devDependencies?: Record<string, string>;
|
|
15
|
+
peerDependencies?: Record<string, string>;
|
|
16
|
+
optionalDependencies?: Record<string, string>;
|
|
17
|
+
engines?: {
|
|
18
|
+
node?: string;
|
|
19
|
+
npm?: string;
|
|
20
|
+
[key: string]: string | undefined;
|
|
21
|
+
};
|
|
22
|
+
keywords?: string[];
|
|
23
|
+
author?: string | {
|
|
24
|
+
name: string;
|
|
25
|
+
email?: string;
|
|
26
|
+
url?: string;
|
|
27
|
+
};
|
|
28
|
+
license?: string;
|
|
29
|
+
repository?: string | {
|
|
30
|
+
type: string;
|
|
31
|
+
url: string;
|
|
32
|
+
};
|
|
33
|
+
bugs?: string | {
|
|
34
|
+
url?: string;
|
|
35
|
+
email?: string;
|
|
36
|
+
};
|
|
37
|
+
homepage?: string;
|
|
38
|
+
private?: boolean;
|
|
39
|
+
workspaces?: string[] | {
|
|
40
|
+
packages?: string[];
|
|
41
|
+
nohoist?: string[];
|
|
42
|
+
};
|
|
43
|
+
[key: string]: unknown;
|
|
44
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-json-types.js","sourceRoot":"","sources":["../../../src/utils/package-json-types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * Type definitions for package.json structure.\n * Eliminates the need for `any` types when working with package.json files.\n */\n\nexport interface PackageJson {\n name?: string;\n version?: string;\n description?: string;\n main?: string;\n module?: string;\n types?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n engines?: {\n node?: string;\n npm?: string;\n [key: string]: string | undefined;\n };\n keywords?: string[];\n author?:\n | string\n | {\n name: string;\n email?: string;\n url?: string;\n };\n license?: string;\n repository?:\n | string\n | {\n type: string;\n url: string;\n };\n bugs?:\n | string\n | {\n url?: string;\n email?: string;\n };\n homepage?: string;\n private?: boolean;\n workspaces?:\n | string[]\n | {\n packages?: string[];\n nohoist?: string[];\n };\n // Allow additional properties\n [key: string]: unknown;\n}\n"]}
|