@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,549 @@
|
|
|
1
|
+
import { Integration } from './constants.js';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import fg from 'fast-glob';
|
|
5
|
+
import { execSync } from 'child_process';
|
|
6
|
+
/**
|
|
7
|
+
* Get installed Python packages based on detected package manager/environment.
|
|
8
|
+
* Returns the command used and the output.
|
|
9
|
+
*/
|
|
10
|
+
function getPythonPackages(installDir) {
|
|
11
|
+
// Check for Poetry (poetry.lock)
|
|
12
|
+
if (fs.existsSync(path.join(installDir, 'poetry.lock'))) {
|
|
13
|
+
try {
|
|
14
|
+
const output = execSync('poetry show', {
|
|
15
|
+
encoding: 'utf-8',
|
|
16
|
+
cwd: installDir,
|
|
17
|
+
}).trim();
|
|
18
|
+
return { command: 'poetry show', output };
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// Poetry not available or failed
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// Check for Pipenv (Pipfile.lock)
|
|
25
|
+
if (fs.existsSync(path.join(installDir, 'Pipfile.lock'))) {
|
|
26
|
+
try {
|
|
27
|
+
const output = execSync('pipenv run pip list', {
|
|
28
|
+
encoding: 'utf-8',
|
|
29
|
+
cwd: installDir,
|
|
30
|
+
}).trim();
|
|
31
|
+
return { command: 'pipenv run pip list', output };
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Pipenv not available or failed
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Check for uv (uv.lock)
|
|
38
|
+
if (fs.existsSync(path.join(installDir, 'uv.lock'))) {
|
|
39
|
+
try {
|
|
40
|
+
const output = execSync('uv pip list', {
|
|
41
|
+
encoding: 'utf-8',
|
|
42
|
+
cwd: installDir,
|
|
43
|
+
}).trim();
|
|
44
|
+
return { command: 'uv pip list', output };
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// uv not available or failed
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Check for PDM (pdm.lock)
|
|
51
|
+
if (fs.existsSync(path.join(installDir, 'pdm.lock'))) {
|
|
52
|
+
try {
|
|
53
|
+
const output = execSync('pdm list', {
|
|
54
|
+
encoding: 'utf-8',
|
|
55
|
+
cwd: installDir,
|
|
56
|
+
}).trim();
|
|
57
|
+
return { command: 'pdm list', output };
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// PDM not available or failed
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Check for Conda (environment.yml or conda-lock.yml)
|
|
64
|
+
if (fs.existsSync(path.join(installDir, 'environment.yml')) ||
|
|
65
|
+
fs.existsSync(path.join(installDir, 'environment.yaml')) ||
|
|
66
|
+
fs.existsSync(path.join(installDir, 'conda-lock.yml'))) {
|
|
67
|
+
try {
|
|
68
|
+
const output = execSync('conda list', {
|
|
69
|
+
encoding: 'utf-8',
|
|
70
|
+
cwd: installDir,
|
|
71
|
+
}).trim();
|
|
72
|
+
return { command: 'conda list', output };
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Conda not available or failed
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Check for virtual environment by scanning for pyvenv.cfg in top-level directories
|
|
79
|
+
try {
|
|
80
|
+
const entries = fs.readdirSync(installDir, { withFileTypes: true });
|
|
81
|
+
for (const entry of entries) {
|
|
82
|
+
if (entry.isDirectory()) {
|
|
83
|
+
const venvPath = path.join(installDir, entry.name);
|
|
84
|
+
const pyvenvCfg = path.join(venvPath, 'pyvenv.cfg');
|
|
85
|
+
if (fs.existsSync(pyvenvCfg)) {
|
|
86
|
+
// Found a virtual environment - try Unix-style path first, then Windows
|
|
87
|
+
const unixPip = path.join(venvPath, 'bin', 'pip');
|
|
88
|
+
const winPip = path.join(venvPath, 'Scripts', 'pip.exe');
|
|
89
|
+
if (fs.existsSync(unixPip)) {
|
|
90
|
+
try {
|
|
91
|
+
const output = execSync(`"${unixPip}" list`, {
|
|
92
|
+
encoding: 'utf-8',
|
|
93
|
+
cwd: installDir,
|
|
94
|
+
}).trim();
|
|
95
|
+
return { command: `${entry.name}/bin/pip list`, output };
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Failed
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else if (fs.existsSync(winPip)) {
|
|
102
|
+
try {
|
|
103
|
+
const output = execSync(`"${winPip}" list`, {
|
|
104
|
+
encoding: 'utf-8',
|
|
105
|
+
cwd: installDir,
|
|
106
|
+
}).trim();
|
|
107
|
+
return { command: `${entry.name}/Scripts/pip list`, output };
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// Failed
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Failed to read directory
|
|
119
|
+
}
|
|
120
|
+
// Fallback to system pip/pip3
|
|
121
|
+
try {
|
|
122
|
+
const output = execSync('pip list', {
|
|
123
|
+
encoding: 'utf-8',
|
|
124
|
+
cwd: installDir,
|
|
125
|
+
}).trim();
|
|
126
|
+
return { command: 'pip list', output };
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
try {
|
|
130
|
+
const output = execSync('pip3 list', {
|
|
131
|
+
encoding: 'utf-8',
|
|
132
|
+
cwd: installDir,
|
|
133
|
+
}).trim();
|
|
134
|
+
return { command: 'pip3 list', output };
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Collect setup details for Python projects
|
|
143
|
+
*/
|
|
144
|
+
export async function collectPythonSetupDetails(installDir) {
|
|
145
|
+
const details = [];
|
|
146
|
+
// Collect installed packages using detected package manager
|
|
147
|
+
const packages = getPythonPackages(installDir);
|
|
148
|
+
if (packages) {
|
|
149
|
+
details.push({
|
|
150
|
+
filename: `installed-packages (${packages.command})`,
|
|
151
|
+
content: packages.output,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
// Collect pyproject.toml
|
|
155
|
+
const pyprojectPath = path.join(installDir, 'pyproject.toml');
|
|
156
|
+
if (fs.existsSync(pyprojectPath)) {
|
|
157
|
+
const content = await fs.promises.readFile(pyprojectPath, 'utf-8');
|
|
158
|
+
details.push({ filename: 'pyproject.toml', content });
|
|
159
|
+
}
|
|
160
|
+
// Collect requirements.txt (lower priority - less verbose than package list)
|
|
161
|
+
const requirementsPath = path.join(installDir, 'requirements.txt');
|
|
162
|
+
if (fs.existsSync(requirementsPath)) {
|
|
163
|
+
const content = await fs.promises.readFile(requirementsPath, 'utf-8');
|
|
164
|
+
details.push({ filename: 'requirements.txt', content });
|
|
165
|
+
}
|
|
166
|
+
return details;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Detect edge runtime configuration in the project
|
|
170
|
+
*/
|
|
171
|
+
async function detectEdgeRuntimeConfig(installDir) {
|
|
172
|
+
const edgeDetails = [];
|
|
173
|
+
// Check Next.js config files
|
|
174
|
+
const nextConfigFiles = ['next.config.js', 'next.config.mjs', 'next.config.ts'];
|
|
175
|
+
for (const configFile of nextConfigFiles) {
|
|
176
|
+
const configPath = path.join(installDir, configFile);
|
|
177
|
+
if (fs.existsSync(configPath)) {
|
|
178
|
+
try {
|
|
179
|
+
const content = await fs.promises.readFile(configPath, 'utf-8');
|
|
180
|
+
// Check if it contains edge runtime configuration
|
|
181
|
+
if (content.includes("runtime: 'edge'") ||
|
|
182
|
+
content.includes('runtime: "edge"') ||
|
|
183
|
+
content.includes("experimental.runtime = 'edge'") ||
|
|
184
|
+
content.includes('experimental.runtime = "edge"')) {
|
|
185
|
+
edgeDetails.push({
|
|
186
|
+
filename: `edge-runtime-config (${configFile})`,
|
|
187
|
+
content,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
// Skip if can't read
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Check for middleware files (always edge runtime in Next.js)
|
|
197
|
+
const middlewareFiles = ['middleware.ts', 'middleware.js'];
|
|
198
|
+
for (const middlewareFile of middlewareFiles) {
|
|
199
|
+
const middlewarePath = path.join(installDir, middlewareFile);
|
|
200
|
+
if (fs.existsSync(middlewarePath)) {
|
|
201
|
+
try {
|
|
202
|
+
const content = await fs.promises.readFile(middlewarePath, 'utf-8');
|
|
203
|
+
edgeDetails.push({
|
|
204
|
+
filename: `edge-runtime-config (${middlewareFile})`,
|
|
205
|
+
content,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// Skip if can't read
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// Check Vercel configuration
|
|
214
|
+
const vercelConfigPath = path.join(installDir, 'vercel.json');
|
|
215
|
+
if (fs.existsSync(vercelConfigPath)) {
|
|
216
|
+
try {
|
|
217
|
+
const content = await fs.promises.readFile(vercelConfigPath, 'utf-8');
|
|
218
|
+
// Check if it contains edge functions configuration
|
|
219
|
+
if (content.includes('"runtime": "edge"')) {
|
|
220
|
+
edgeDetails.push({
|
|
221
|
+
filename: 'edge-runtime-config (vercel.json)',
|
|
222
|
+
content,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
// Skip if can't read
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// Check Cloudflare Workers configuration
|
|
231
|
+
const wranglerConfigPath = path.join(installDir, 'wrangler.toml');
|
|
232
|
+
if (fs.existsSync(wranglerConfigPath)) {
|
|
233
|
+
try {
|
|
234
|
+
const content = await fs.promises.readFile(wranglerConfigPath, 'utf-8');
|
|
235
|
+
edgeDetails.push({
|
|
236
|
+
filename: 'edge-runtime-config (wrangler.toml)',
|
|
237
|
+
content,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
// Skip if can't read
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// Check for route files with edge runtime export
|
|
245
|
+
const routeFiles = await fg(['app/**/*.{ts,tsx,js,jsx}', 'pages/**/*.{ts,tsx,js,jsx}'], {
|
|
246
|
+
cwd: installDir,
|
|
247
|
+
ignore: ['**/node_modules/**', '**/.next/**', '**/dist/**', '**/build/**'],
|
|
248
|
+
onlyFiles: true,
|
|
249
|
+
});
|
|
250
|
+
for (const file of routeFiles.slice(0, 10)) {
|
|
251
|
+
// Limit to first 10 to avoid overwhelming
|
|
252
|
+
try {
|
|
253
|
+
const filePath = path.join(installDir, file);
|
|
254
|
+
const content = await fs.promises.readFile(filePath, 'utf-8');
|
|
255
|
+
// Check for edge runtime export
|
|
256
|
+
if (content.includes("export const runtime = 'edge'") ||
|
|
257
|
+
content.includes('export const runtime = "edge"') ||
|
|
258
|
+
(content.includes('export const config') &&
|
|
259
|
+
(content.includes("runtime: 'edge'") || content.includes('runtime: "edge"')))) {
|
|
260
|
+
edgeDetails.push({
|
|
261
|
+
filename: `edge-runtime-config (${file})`,
|
|
262
|
+
content: content.substring(0, 1000), // First 1000 chars to avoid too much data
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
// Skip files that can't be read
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return edgeDetails;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Collect setup details for TypeScript/Node.js projects
|
|
275
|
+
*/
|
|
276
|
+
export async function collectTypeScriptSetupDetails(installDir) {
|
|
277
|
+
const details = [];
|
|
278
|
+
// Collect package.json
|
|
279
|
+
const packageJsonPath = path.join(installDir, 'package.json');
|
|
280
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
281
|
+
const content = await fs.promises.readFile(packageJsonPath, 'utf-8');
|
|
282
|
+
details.push({ filename: 'package.json', content });
|
|
283
|
+
}
|
|
284
|
+
// Collect Node version
|
|
285
|
+
try {
|
|
286
|
+
const nodeVersion = execSync('node --version', {
|
|
287
|
+
encoding: 'utf-8',
|
|
288
|
+
}).trim();
|
|
289
|
+
details.push({ filename: 'node-version', content: nodeVersion });
|
|
290
|
+
}
|
|
291
|
+
catch {
|
|
292
|
+
// Node version not available
|
|
293
|
+
}
|
|
294
|
+
// Collect TypeScript version
|
|
295
|
+
try {
|
|
296
|
+
// First try to get from package.json devDependencies/dependencies
|
|
297
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
298
|
+
const packageJson = JSON.parse(await fs.promises.readFile(packageJsonPath, 'utf-8'));
|
|
299
|
+
const deps = {
|
|
300
|
+
...packageJson.dependencies,
|
|
301
|
+
...packageJson.devDependencies,
|
|
302
|
+
};
|
|
303
|
+
if (deps.typescript) {
|
|
304
|
+
details.push({
|
|
305
|
+
filename: 'typescript-version',
|
|
306
|
+
content: deps.typescript,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
// TypeScript version not available
|
|
313
|
+
}
|
|
314
|
+
// Collect edge runtime configuration if present
|
|
315
|
+
const edgeDetails = await detectEdgeRuntimeConfig(installDir);
|
|
316
|
+
details.push(...edgeDetails);
|
|
317
|
+
return details;
|
|
318
|
+
}
|
|
319
|
+
// Python AI SDK import patterns to detect
|
|
320
|
+
const PYTHON_AI_SDK_IMPORT_PATTERNS = [
|
|
321
|
+
// Direct provider SDKs
|
|
322
|
+
/(?:from|import)\s+openai/,
|
|
323
|
+
/(?:from|import)\s+anthropic/,
|
|
324
|
+
/(?:from|import)\s+google\.generativeai/,
|
|
325
|
+
/(?:from|import)\s+mistralai/,
|
|
326
|
+
/(?:from|import)\s+cohere/,
|
|
327
|
+
/(?:from|import)\s+groq/,
|
|
328
|
+
/(?:from|import)\s+together/,
|
|
329
|
+
/(?:from|import)\s+fireworks/,
|
|
330
|
+
/(?:from|import)\s+replicate/,
|
|
331
|
+
// Frameworks / Orchestration
|
|
332
|
+
/(?:from|import)\s+litellm/,
|
|
333
|
+
/(?:from|import)\s+langchain/,
|
|
334
|
+
/from\s+langchain_\w+\s+import/,
|
|
335
|
+
/(?:from|import)\s+llama_index/,
|
|
336
|
+
/(?:from|import)\s+autogen/,
|
|
337
|
+
/(?:from|import)\s+crewai/,
|
|
338
|
+
/(?:from|import)\s+dspy/,
|
|
339
|
+
// Cloud AI
|
|
340
|
+
/(?:from|import)\s+vertexai/,
|
|
341
|
+
/from\s+google\.cloud\s+import\s+aiplatform/,
|
|
342
|
+
];
|
|
343
|
+
// Python AI SDK package names (for checking requirements/pyproject)
|
|
344
|
+
const PYTHON_AI_SDK_PACKAGES = [
|
|
345
|
+
// Direct provider SDKs
|
|
346
|
+
'openai',
|
|
347
|
+
'anthropic',
|
|
348
|
+
'google-generativeai',
|
|
349
|
+
'mistralai',
|
|
350
|
+
'cohere',
|
|
351
|
+
'groq',
|
|
352
|
+
'together',
|
|
353
|
+
'fireworks-ai',
|
|
354
|
+
'replicate',
|
|
355
|
+
// Frameworks / Orchestration
|
|
356
|
+
'litellm',
|
|
357
|
+
'langchain',
|
|
358
|
+
'langchain-openai',
|
|
359
|
+
'langchain-anthropic',
|
|
360
|
+
'langchain-google-genai',
|
|
361
|
+
'langchain-community',
|
|
362
|
+
'langchain-core',
|
|
363
|
+
'llama-index',
|
|
364
|
+
'llama-index-core',
|
|
365
|
+
'autogen',
|
|
366
|
+
'pyautogen',
|
|
367
|
+
'crewai',
|
|
368
|
+
'dspy',
|
|
369
|
+
'dspy-ai',
|
|
370
|
+
// Cloud AI
|
|
371
|
+
'vertexai',
|
|
372
|
+
'google-cloud-aiplatform',
|
|
373
|
+
];
|
|
374
|
+
async function detectPythonProject(options) {
|
|
375
|
+
// Check for Python files with AI SDK imports
|
|
376
|
+
const pythonFiles = await fg('**/*.py', {
|
|
377
|
+
cwd: options.installDir,
|
|
378
|
+
ignore: [
|
|
379
|
+
'**/node_modules/**',
|
|
380
|
+
'**/__pycache__/**',
|
|
381
|
+
'**/.venv/**',
|
|
382
|
+
'**/venv/**',
|
|
383
|
+
'**/site-packages/**',
|
|
384
|
+
],
|
|
385
|
+
onlyFiles: true,
|
|
386
|
+
});
|
|
387
|
+
for (const file of pythonFiles) {
|
|
388
|
+
try {
|
|
389
|
+
const filePath = path.join(options.installDir, file);
|
|
390
|
+
const content = await fs.promises.readFile(filePath, 'utf-8');
|
|
391
|
+
if (PYTHON_AI_SDK_IMPORT_PATTERNS.some((pattern) => pattern.test(content))) {
|
|
392
|
+
return true;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
catch {
|
|
396
|
+
// Skip files that can't be read
|
|
397
|
+
continue;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
// Check for AI SDK packages in requirements.txt
|
|
401
|
+
const requirementsPath = path.join(options.installDir, 'requirements.txt');
|
|
402
|
+
if (fs.existsSync(requirementsPath)) {
|
|
403
|
+
try {
|
|
404
|
+
const content = await fs.promises.readFile(requirementsPath, 'utf-8');
|
|
405
|
+
const lines = content.toLowerCase().split('\n');
|
|
406
|
+
for (const pkg of PYTHON_AI_SDK_PACKAGES) {
|
|
407
|
+
if (lines.some((line) => line.startsWith(pkg.toLowerCase()))) {
|
|
408
|
+
return true;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
catch {
|
|
413
|
+
// Skip if can't read
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
// Check for AI SDK packages in pyproject.toml
|
|
417
|
+
const pyprojectPath = path.join(options.installDir, 'pyproject.toml');
|
|
418
|
+
if (fs.existsSync(pyprojectPath)) {
|
|
419
|
+
try {
|
|
420
|
+
const content = await fs.promises.readFile(pyprojectPath, 'utf-8');
|
|
421
|
+
const contentLower = content.toLowerCase();
|
|
422
|
+
for (const pkg of PYTHON_AI_SDK_PACKAGES) {
|
|
423
|
+
// Check for package in dependencies (handles both regular and optional deps)
|
|
424
|
+
if (contentLower.includes(`"${pkg.toLowerCase()}"`) ||
|
|
425
|
+
contentLower.includes(`'${pkg.toLowerCase()}'`)) {
|
|
426
|
+
return true;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
catch {
|
|
431
|
+
// Skip if can't read
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
// Check for AI SDK packages in Pipfile
|
|
435
|
+
const pipfilePath = path.join(options.installDir, 'Pipfile');
|
|
436
|
+
if (fs.existsSync(pipfilePath)) {
|
|
437
|
+
try {
|
|
438
|
+
const content = await fs.promises.readFile(pipfilePath, 'utf-8');
|
|
439
|
+
const contentLower = content.toLowerCase();
|
|
440
|
+
for (const pkg of PYTHON_AI_SDK_PACKAGES) {
|
|
441
|
+
if (contentLower.includes(pkg.toLowerCase())) {
|
|
442
|
+
return true;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
catch {
|
|
447
|
+
// Skip if can't read
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
return false;
|
|
451
|
+
}
|
|
452
|
+
async function detectTypeScriptProject(options) {
|
|
453
|
+
// Check for tsconfig.json
|
|
454
|
+
const tsconfigPath = path.join(options.installDir, 'tsconfig.json');
|
|
455
|
+
if (fs.existsSync(tsconfigPath)) {
|
|
456
|
+
return true;
|
|
457
|
+
}
|
|
458
|
+
// Check for TypeScript files
|
|
459
|
+
const tsFiles = await fg('**/*.{ts,tsx}', {
|
|
460
|
+
cwd: options.installDir,
|
|
461
|
+
ignore: ['**/node_modules/**', '**/dist/**', '**/build/**'],
|
|
462
|
+
onlyFiles: true,
|
|
463
|
+
});
|
|
464
|
+
if (tsFiles.length > 0) {
|
|
465
|
+
return true;
|
|
466
|
+
}
|
|
467
|
+
// Check for TypeScript in package.json (if it exists)
|
|
468
|
+
const packageJsonPath = path.join(options.installDir, 'package.json');
|
|
469
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
470
|
+
try {
|
|
471
|
+
const packageJsonContent = await fs.promises.readFile(packageJsonPath, 'utf-8');
|
|
472
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
473
|
+
const deps = {
|
|
474
|
+
...(packageJson.dependencies || {}),
|
|
475
|
+
...(packageJson.devDependencies || {}),
|
|
476
|
+
};
|
|
477
|
+
if ('typescript' in deps ||
|
|
478
|
+
'@types/node' in deps ||
|
|
479
|
+
'@types/react' in deps) {
|
|
480
|
+
return true;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
catch {
|
|
484
|
+
// package.json exists but couldn't be read/parsed - skip this check
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
return false;
|
|
488
|
+
}
|
|
489
|
+
async function detectVercelAiSdkProject(options) {
|
|
490
|
+
// Check for 'ai' package in package.json
|
|
491
|
+
const packageJsonPath = path.join(options.installDir, 'package.json');
|
|
492
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
493
|
+
try {
|
|
494
|
+
await fs.promises.readFile(packageJsonPath, 'utf-8');
|
|
495
|
+
// package.json exists and is readable - continue to file check
|
|
496
|
+
}
|
|
497
|
+
catch {
|
|
498
|
+
// package.json exists but couldn't be read/parsed - continue to file check
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
// Check for Vercel AI SDK imports in source files
|
|
502
|
+
const sourceFiles = await fg('**/*.{ts,tsx,js,jsx}', {
|
|
503
|
+
cwd: options.installDir,
|
|
504
|
+
ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.next/**'],
|
|
505
|
+
onlyFiles: true,
|
|
506
|
+
});
|
|
507
|
+
const aiSdkImportPatterns = [
|
|
508
|
+
/from\s+['"]ai['"]/,
|
|
509
|
+
/from\s+['"]ai\/rsc['"]/,
|
|
510
|
+
/from\s+['"]@ai-sdk\//,
|
|
511
|
+
];
|
|
512
|
+
for (const file of sourceFiles) {
|
|
513
|
+
try {
|
|
514
|
+
const filePath = path.join(options.installDir, file);
|
|
515
|
+
const content = await fs.promises.readFile(filePath, 'utf-8');
|
|
516
|
+
if (aiSdkImportPatterns.some((pattern) => pattern.test(content))) {
|
|
517
|
+
return true;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
catch {
|
|
521
|
+
// Skip files that can't be read
|
|
522
|
+
continue;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
return false;
|
|
526
|
+
}
|
|
527
|
+
export const INTEGRATION_CONFIG = {
|
|
528
|
+
[Integration.python]: {
|
|
529
|
+
detect: detectPythonProject,
|
|
530
|
+
docsUrl: 'https://www.raindrop.ai/docs/sdk/python',
|
|
531
|
+
collectSetupDetails: collectPythonSetupDetails,
|
|
532
|
+
},
|
|
533
|
+
[Integration.typescript]: {
|
|
534
|
+
detect: detectTypeScriptProject,
|
|
535
|
+
docsUrl: 'https://www.raindrop.ai/docs/sdk/typescript',
|
|
536
|
+
collectSetupDetails: collectTypeScriptSetupDetails,
|
|
537
|
+
},
|
|
538
|
+
[Integration.vercelAiSdk]: {
|
|
539
|
+
detect: detectVercelAiSdkProject,
|
|
540
|
+
docsUrl: 'https://www.raindrop.ai/docs/sdk/auto-vercel-ai',
|
|
541
|
+
collectSetupDetails: collectTypeScriptSetupDetails, // Same as TypeScript
|
|
542
|
+
},
|
|
543
|
+
};
|
|
544
|
+
export const INTEGRATION_ORDER = [
|
|
545
|
+
Integration.python,
|
|
546
|
+
Integration.vercelAiSdk,
|
|
547
|
+
Integration.typescript,
|
|
548
|
+
];
|
|
549
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"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","sourcesContent":["import type { WizardOptions } from '../utils/types.js';\nimport { Integration } from './constants.js';\nimport fs from 'fs';\nimport path from 'path';\nimport fg from 'fast-glob';\nimport { execSync } from 'child_process';\n\n/**\n * Setup detail collected for Slack notification\n */\nexport type SetupDetail = {\n filename: string;\n content: string;\n};\n\ntype IntegrationConfig = {\n detect: (options: Pick<WizardOptions, 'installDir'>) => Promise<boolean>;\n docsUrl: string;\n collectSetupDetails: (installDir: string) => Promise<SetupDetail[]>;\n};\n\n/**\n * Get installed Python packages based on detected package manager/environment.\n * Returns the command used and the output.\n */\nfunction getPythonPackages(\n installDir: string,\n): { command: string; output: string } | null {\n // Check for Poetry (poetry.lock)\n if (fs.existsSync(path.join(installDir, 'poetry.lock'))) {\n try {\n const output = execSync('poetry show', {\n encoding: 'utf-8',\n cwd: installDir,\n }).trim();\n return { command: 'poetry show', output };\n } catch {\n // Poetry not available or failed\n }\n }\n\n // Check for Pipenv (Pipfile.lock)\n if (fs.existsSync(path.join(installDir, 'Pipfile.lock'))) {\n try {\n const output = execSync('pipenv run pip list', {\n encoding: 'utf-8',\n cwd: installDir,\n }).trim();\n return { command: 'pipenv run pip list', output };\n } catch {\n // Pipenv not available or failed\n }\n }\n\n // Check for uv (uv.lock)\n if (fs.existsSync(path.join(installDir, 'uv.lock'))) {\n try {\n const output = execSync('uv pip list', {\n encoding: 'utf-8',\n cwd: installDir,\n }).trim();\n return { command: 'uv pip list', output };\n } catch {\n // uv not available or failed\n }\n }\n\n // Check for PDM (pdm.lock)\n if (fs.existsSync(path.join(installDir, 'pdm.lock'))) {\n try {\n const output = execSync('pdm list', {\n encoding: 'utf-8',\n cwd: installDir,\n }).trim();\n return { command: 'pdm list', output };\n } catch {\n // PDM not available or failed\n }\n }\n\n // Check for Conda (environment.yml or conda-lock.yml)\n if (\n fs.existsSync(path.join(installDir, 'environment.yml')) ||\n fs.existsSync(path.join(installDir, 'environment.yaml')) ||\n fs.existsSync(path.join(installDir, 'conda-lock.yml'))\n ) {\n try {\n const output = execSync('conda list', {\n encoding: 'utf-8',\n cwd: installDir,\n }).trim();\n return { command: 'conda list', output };\n } catch {\n // Conda not available or failed\n }\n }\n\n // Check for virtual environment by scanning for pyvenv.cfg in top-level directories\n try {\n const entries = fs.readdirSync(installDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const venvPath = path.join(installDir, entry.name);\n const pyvenvCfg = path.join(venvPath, 'pyvenv.cfg');\n\n if (fs.existsSync(pyvenvCfg)) {\n // Found a virtual environment - try Unix-style path first, then Windows\n const unixPip = path.join(venvPath, 'bin', 'pip');\n const winPip = path.join(venvPath, 'Scripts', 'pip.exe');\n\n if (fs.existsSync(unixPip)) {\n try {\n const output = execSync(`\"${unixPip}\" list`, {\n encoding: 'utf-8',\n cwd: installDir,\n }).trim();\n return { command: `${entry.name}/bin/pip list`, output };\n } catch {\n // Failed\n }\n } else if (fs.existsSync(winPip)) {\n try {\n const output = execSync(`\"${winPip}\" list`, {\n encoding: 'utf-8',\n cwd: installDir,\n }).trim();\n return { command: `${entry.name}/Scripts/pip list`, output };\n } catch {\n // Failed\n }\n }\n }\n }\n }\n } catch {\n // Failed to read directory\n }\n\n // Fallback to system pip/pip3\n try {\n const output = execSync('pip list', {\n encoding: 'utf-8',\n cwd: installDir,\n }).trim();\n return { command: 'pip list', output };\n } catch {\n try {\n const output = execSync('pip3 list', {\n encoding: 'utf-8',\n cwd: installDir,\n }).trim();\n return { command: 'pip3 list', output };\n } catch {\n return null;\n }\n }\n}\n\n/**\n * Collect setup details for Python projects\n */\nexport async function collectPythonSetupDetails(\n installDir: string,\n): Promise<SetupDetail[]> {\n const details: SetupDetail[] = [];\n\n // Collect installed packages using detected package manager\n const packages = getPythonPackages(installDir);\n if (packages) {\n details.push({\n filename: `installed-packages (${packages.command})`,\n content: packages.output,\n });\n }\n\n // Collect pyproject.toml\n const pyprojectPath = path.join(installDir, 'pyproject.toml');\n if (fs.existsSync(pyprojectPath)) {\n const content = await fs.promises.readFile(pyprojectPath, 'utf-8');\n details.push({ filename: 'pyproject.toml', content });\n }\n\n // Collect requirements.txt (lower priority - less verbose than package list)\n const requirementsPath = path.join(installDir, 'requirements.txt');\n if (fs.existsSync(requirementsPath)) {\n const content = await fs.promises.readFile(requirementsPath, 'utf-8');\n details.push({ filename: 'requirements.txt', content });\n }\n\n return details;\n}\n\n/**\n * Detect edge runtime configuration in the project\n */\nasync function detectEdgeRuntimeConfig(\n installDir: string,\n): Promise<SetupDetail[]> {\n const edgeDetails: SetupDetail[] = [];\n\n // Check Next.js config files\n const nextConfigFiles = ['next.config.js', 'next.config.mjs', 'next.config.ts'];\n for (const configFile of nextConfigFiles) {\n const configPath = path.join(installDir, configFile);\n if (fs.existsSync(configPath)) {\n try {\n const content = await fs.promises.readFile(configPath, 'utf-8');\n // Check if it contains edge runtime configuration\n if (\n content.includes(\"runtime: 'edge'\") ||\n content.includes('runtime: \"edge\"') ||\n content.includes(\"experimental.runtime = 'edge'\") ||\n content.includes('experimental.runtime = \"edge\"')\n ) {\n edgeDetails.push({\n filename: `edge-runtime-config (${configFile})`,\n content,\n });\n }\n } catch {\n // Skip if can't read\n }\n }\n }\n\n // Check for middleware files (always edge runtime in Next.js)\n const middlewareFiles = ['middleware.ts', 'middleware.js'];\n for (const middlewareFile of middlewareFiles) {\n const middlewarePath = path.join(installDir, middlewareFile);\n if (fs.existsSync(middlewarePath)) {\n try {\n const content = await fs.promises.readFile(middlewarePath, 'utf-8');\n edgeDetails.push({\n filename: `edge-runtime-config (${middlewareFile})`,\n content,\n });\n } catch {\n // Skip if can't read\n }\n }\n }\n\n // Check Vercel configuration\n const vercelConfigPath = path.join(installDir, 'vercel.json');\n if (fs.existsSync(vercelConfigPath)) {\n try {\n const content = await fs.promises.readFile(vercelConfigPath, 'utf-8');\n // Check if it contains edge functions configuration\n if (content.includes('\"runtime\": \"edge\"')) {\n edgeDetails.push({\n filename: 'edge-runtime-config (vercel.json)',\n content,\n });\n }\n } catch {\n // Skip if can't read\n }\n }\n\n // Check Cloudflare Workers configuration\n const wranglerConfigPath = path.join(installDir, 'wrangler.toml');\n if (fs.existsSync(wranglerConfigPath)) {\n try {\n const content = await fs.promises.readFile(wranglerConfigPath, 'utf-8');\n edgeDetails.push({\n filename: 'edge-runtime-config (wrangler.toml)',\n content,\n });\n } catch {\n // Skip if can't read\n }\n }\n\n // Check for route files with edge runtime export\n const routeFiles = await fg(['app/**/*.{ts,tsx,js,jsx}', 'pages/**/*.{ts,tsx,js,jsx}'], {\n cwd: installDir,\n ignore: ['**/node_modules/**', '**/.next/**', '**/dist/**', '**/build/**'],\n onlyFiles: true,\n });\n\n for (const file of routeFiles.slice(0, 10)) {\n // Limit to first 10 to avoid overwhelming\n try {\n const filePath = path.join(installDir, file);\n const content = await fs.promises.readFile(filePath, 'utf-8');\n\n // Check for edge runtime export\n if (\n content.includes(\"export const runtime = 'edge'\") ||\n content.includes('export const runtime = \"edge\"') ||\n (content.includes('export const config') &&\n (content.includes(\"runtime: 'edge'\") || content.includes('runtime: \"edge\"')))\n ) {\n edgeDetails.push({\n filename: `edge-runtime-config (${file})`,\n content: content.substring(0, 1000), // First 1000 chars to avoid too much data\n });\n }\n } catch {\n // Skip files that can't be read\n continue;\n }\n }\n\n return edgeDetails;\n}\n\n/**\n * Collect setup details for TypeScript/Node.js projects\n */\nexport async function collectTypeScriptSetupDetails(\n installDir: string,\n): Promise<SetupDetail[]> {\n const details: SetupDetail[] = [];\n\n // Collect package.json\n const packageJsonPath = path.join(installDir, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n const content = await fs.promises.readFile(packageJsonPath, 'utf-8');\n details.push({ filename: 'package.json', content });\n }\n\n // Collect Node version\n try {\n const nodeVersion = execSync('node --version', {\n encoding: 'utf-8',\n }).trim();\n details.push({ filename: 'node-version', content: nodeVersion });\n } catch {\n // Node version not available\n }\n\n // Collect TypeScript version\n try {\n // First try to get from package.json devDependencies/dependencies\n if (fs.existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(\n await fs.promises.readFile(packageJsonPath, 'utf-8'),\n );\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n if (deps.typescript) {\n details.push({\n filename: 'typescript-version',\n content: deps.typescript,\n });\n }\n }\n } catch {\n // TypeScript version not available\n }\n\n // Collect edge runtime configuration if present\n const edgeDetails = await detectEdgeRuntimeConfig(installDir);\n details.push(...edgeDetails);\n\n return details;\n}\n\n// Python AI SDK import patterns to detect\nconst PYTHON_AI_SDK_IMPORT_PATTERNS = [\n // Direct provider SDKs\n /(?:from|import)\\s+openai/,\n /(?:from|import)\\s+anthropic/,\n /(?:from|import)\\s+google\\.generativeai/,\n /(?:from|import)\\s+mistralai/,\n /(?:from|import)\\s+cohere/,\n /(?:from|import)\\s+groq/,\n /(?:from|import)\\s+together/,\n /(?:from|import)\\s+fireworks/,\n /(?:from|import)\\s+replicate/,\n\n // Frameworks / Orchestration\n /(?:from|import)\\s+litellm/,\n /(?:from|import)\\s+langchain/,\n /from\\s+langchain_\\w+\\s+import/,\n /(?:from|import)\\s+llama_index/,\n /(?:from|import)\\s+autogen/,\n /(?:from|import)\\s+crewai/,\n /(?:from|import)\\s+dspy/,\n\n // Cloud AI\n /(?:from|import)\\s+vertexai/,\n /from\\s+google\\.cloud\\s+import\\s+aiplatform/,\n];\n\n// Python AI SDK package names (for checking requirements/pyproject)\nconst PYTHON_AI_SDK_PACKAGES = [\n // Direct provider SDKs\n 'openai',\n 'anthropic',\n 'google-generativeai',\n 'mistralai',\n 'cohere',\n 'groq',\n 'together',\n 'fireworks-ai',\n 'replicate',\n\n // Frameworks / Orchestration\n 'litellm',\n 'langchain',\n 'langchain-openai',\n 'langchain-anthropic',\n 'langchain-google-genai',\n 'langchain-community',\n 'langchain-core',\n 'llama-index',\n 'llama-index-core',\n 'autogen',\n 'pyautogen',\n 'crewai',\n 'dspy',\n 'dspy-ai',\n\n // Cloud AI\n 'vertexai',\n 'google-cloud-aiplatform',\n];\n\nasync function detectPythonProject(\n options: Pick<WizardOptions, 'installDir'>,\n): Promise<boolean> {\n // Check for Python files with AI SDK imports\n const pythonFiles = await fg('**/*.py', {\n cwd: options.installDir,\n ignore: [\n '**/node_modules/**',\n '**/__pycache__/**',\n '**/.venv/**',\n '**/venv/**',\n '**/site-packages/**',\n ],\n onlyFiles: true,\n });\n\n for (const file of pythonFiles) {\n try {\n const filePath = path.join(options.installDir, file);\n const content = await fs.promises.readFile(filePath, 'utf-8');\n\n if (\n PYTHON_AI_SDK_IMPORT_PATTERNS.some((pattern) => pattern.test(content))\n ) {\n return true;\n }\n } catch {\n // Skip files that can't be read\n continue;\n }\n }\n\n // Check for AI SDK packages in requirements.txt\n const requirementsPath = path.join(options.installDir, 'requirements.txt');\n if (fs.existsSync(requirementsPath)) {\n try {\n const content = await fs.promises.readFile(requirementsPath, 'utf-8');\n const lines = content.toLowerCase().split('\\n');\n for (const pkg of PYTHON_AI_SDK_PACKAGES) {\n if (lines.some((line) => line.startsWith(pkg.toLowerCase()))) {\n return true;\n }\n }\n } catch {\n // Skip if can't read\n }\n }\n\n // Check for AI SDK packages in pyproject.toml\n const pyprojectPath = path.join(options.installDir, 'pyproject.toml');\n if (fs.existsSync(pyprojectPath)) {\n try {\n const content = await fs.promises.readFile(pyprojectPath, 'utf-8');\n const contentLower = content.toLowerCase();\n for (const pkg of PYTHON_AI_SDK_PACKAGES) {\n // Check for package in dependencies (handles both regular and optional deps)\n if (\n contentLower.includes(`\"${pkg.toLowerCase()}\"`) ||\n contentLower.includes(`'${pkg.toLowerCase()}'`)\n ) {\n return true;\n }\n }\n } catch {\n // Skip if can't read\n }\n }\n\n // Check for AI SDK packages in Pipfile\n const pipfilePath = path.join(options.installDir, 'Pipfile');\n if (fs.existsSync(pipfilePath)) {\n try {\n const content = await fs.promises.readFile(pipfilePath, 'utf-8');\n const contentLower = content.toLowerCase();\n for (const pkg of PYTHON_AI_SDK_PACKAGES) {\n if (contentLower.includes(pkg.toLowerCase())) {\n return true;\n }\n }\n } catch {\n // Skip if can't read\n }\n }\n\n return false;\n}\n\nasync function detectTypeScriptProject(\n options: Pick<WizardOptions, 'installDir'>,\n): Promise<boolean> {\n // Check for tsconfig.json\n const tsconfigPath = path.join(options.installDir, 'tsconfig.json');\n if (fs.existsSync(tsconfigPath)) {\n return true;\n }\n\n // Check for TypeScript files\n const tsFiles = await fg('**/*.{ts,tsx}', {\n cwd: options.installDir,\n ignore: ['**/node_modules/**', '**/dist/**', '**/build/**'],\n onlyFiles: true,\n });\n\n if (tsFiles.length > 0) {\n return true;\n }\n\n // Check for TypeScript in package.json (if it exists)\n const packageJsonPath = path.join(options.installDir, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n try {\n const packageJsonContent = await fs.promises.readFile(\n packageJsonPath,\n 'utf-8',\n );\n const packageJson = JSON.parse(packageJsonContent);\n const deps = {\n ...(packageJson.dependencies || {}),\n ...(packageJson.devDependencies || {}),\n };\n if (\n 'typescript' in deps ||\n '@types/node' in deps ||\n '@types/react' in deps\n ) {\n return true;\n }\n } catch {\n // package.json exists but couldn't be read/parsed - skip this check\n }\n }\n\n return false;\n}\n\nasync function detectVercelAiSdkProject(\n options: Pick<WizardOptions, 'installDir'>,\n): Promise<boolean> {\n // Check for 'ai' package in package.json\n const packageJsonPath = path.join(options.installDir, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n try {\n await fs.promises.readFile(packageJsonPath, 'utf-8');\n // package.json exists and is readable - continue to file check\n } catch {\n // package.json exists but couldn't be read/parsed - continue to file check\n }\n }\n\n // Check for Vercel AI SDK imports in source files\n const sourceFiles = await fg('**/*.{ts,tsx,js,jsx}', {\n cwd: options.installDir,\n ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.next/**'],\n onlyFiles: true,\n });\n\n const aiSdkImportPatterns = [\n /from\\s+['\"]ai['\"]/,\n /from\\s+['\"]ai\\/rsc['\"]/,\n /from\\s+['\"]@ai-sdk\\//,\n ];\n\n for (const file of sourceFiles) {\n try {\n const filePath = path.join(options.installDir, file);\n const content = await fs.promises.readFile(filePath, 'utf-8');\n\n if (aiSdkImportPatterns.some((pattern) => pattern.test(content))) {\n return true;\n }\n } catch {\n // Skip files that can't be read\n continue;\n }\n }\n\n return false;\n}\n\nexport const INTEGRATION_CONFIG = {\n [Integration.python]: {\n detect: detectPythonProject,\n docsUrl: 'https://www.raindrop.ai/docs/sdk/python',\n collectSetupDetails: collectPythonSetupDetails,\n },\n [Integration.typescript]: {\n detect: detectTypeScriptProject,\n docsUrl: 'https://www.raindrop.ai/docs/sdk/typescript',\n collectSetupDetails: collectTypeScriptSetupDetails,\n },\n [Integration.vercelAiSdk]: {\n detect: detectVercelAiSdkProject,\n docsUrl: 'https://www.raindrop.ai/docs/sdk/auto-vercel-ai',\n collectSetupDetails: collectTypeScriptSetupDetails, // Same as TypeScript\n },\n} as const satisfies Record<Integration, IntegrationConfig>;\n\nexport const INTEGRATION_ORDER = [\n Integration.python,\n Integration.vercelAiSdk,\n Integration.typescript,\n] as const;\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export declare enum Integration {
|
|
2
|
+
python = "python",
|
|
3
|
+
typescript = "typescript",
|
|
4
|
+
vercelAiSdk = "vercel-ai-sdk"
|
|
5
|
+
}
|
|
6
|
+
export declare function getIntegrationDescription(type: string): string;
|
|
7
|
+
export declare const IS_DEV: boolean;
|
|
8
|
+
export declare const ISSUES_URL = "https://github.com/raindrop/wizard/issues";
|
|
9
|
+
export declare const CALLBACK_PORT = 8259;
|
|
10
|
+
export declare const API_BASE_URL = "https://api.dawnai.com";
|
|
11
|
+
export declare const APP_URL = "https://app.raindrop.ai";
|
|
12
|
+
export declare const WRITE_KEY_ENDPOINT = "https://api.dawnai.com/api/cli/users/key";
|
|
13
|
+
export declare const EVENTS_LIST_ENDPOINT = "https://api.dawnai.com/api/cli/events/list";
|
|
14
|
+
export declare const ANTHROPIC_BASE_URL = "https://api.dawnai.com/api/cli";
|
|
15
|
+
export declare const SESSION_START_ENDPOINT = "https://api.dawnai.com/api/cli/session/init";
|
|
16
|
+
export declare const SESSION_UPDATE_ENDPOINT = "https://api.dawnai.com/api/cli/session/update";
|
|
17
|
+
/**
|
|
18
|
+
* Spinner message shown during wizard execution
|
|
19
|
+
*/
|
|
20
|
+
export declare const SPINNER_MESSAGE = "Raindrop wizard is working...";
|
|
21
|
+
/**
|
|
22
|
+
* Safe bash command patterns that can be auto-approved without user confirmation.
|
|
23
|
+
* Uses simple prefix matching with optional * wildcard at the end.
|
|
24
|
+
*
|
|
25
|
+
* NOTE: Package manager install/build/run commands are NOT auto-approved and require user confirmation.
|
|
26
|
+
*/
|
|
27
|
+
export declare const SAFE_BASH_PATTERNS: string[];
|