@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.
Files changed (135) hide show
  1. package/LICENSE +47 -0
  2. package/dist/bin.d.ts +2 -0
  3. package/dist/bin.js +117 -0
  4. package/dist/bin.js.map +1 -0
  5. package/dist/src/docs/browser.md +105 -0
  6. package/dist/src/docs/python.md +618 -0
  7. package/dist/src/docs/typescript.md +584 -0
  8. package/dist/src/docs/vercel-ai-sdk.md +304 -0
  9. package/dist/src/lib/agent-interface.d.ts +46 -0
  10. package/dist/src/lib/agent-interface.js +292 -0
  11. package/dist/src/lib/agent-interface.js.map +1 -0
  12. package/dist/src/lib/agent-prompts.d.ts +10 -0
  13. package/dist/src/lib/agent-prompts.js +49 -0
  14. package/dist/src/lib/agent-prompts.js.map +1 -0
  15. package/dist/src/lib/config.d.ts +39 -0
  16. package/dist/src/lib/config.js +549 -0
  17. package/dist/src/lib/config.js.map +1 -0
  18. package/dist/src/lib/constants.d.ts +27 -0
  19. package/dist/src/lib/constants.js +165 -0
  20. package/dist/src/lib/constants.js.map +1 -0
  21. package/dist/src/lib/handlers.d.ts +68 -0
  22. package/dist/src/lib/handlers.js +420 -0
  23. package/dist/src/lib/handlers.js.map +1 -0
  24. package/dist/src/lib/integration-testing.d.ts +44 -0
  25. package/dist/src/lib/integration-testing.js +123 -0
  26. package/dist/src/lib/integration-testing.js.map +1 -0
  27. package/dist/src/lib/mcp.d.ts +14 -0
  28. package/dist/src/lib/mcp.js +134 -0
  29. package/dist/src/lib/mcp.js.map +1 -0
  30. package/dist/src/lib/sdk-messages.d.ts +17 -0
  31. package/dist/src/lib/sdk-messages.js +278 -0
  32. package/dist/src/lib/sdk-messages.js.map +1 -0
  33. package/dist/src/lib/wizard.d.ts +6 -0
  34. package/dist/src/lib/wizard.js +131 -0
  35. package/dist/src/lib/wizard.js.map +1 -0
  36. package/dist/src/run.d.ts +8 -0
  37. package/dist/src/run.js +53 -0
  38. package/dist/src/run.js.map +1 -0
  39. package/dist/src/ui/App.d.ts +15 -0
  40. package/dist/src/ui/App.js +27 -0
  41. package/dist/src/ui/App.js.map +1 -0
  42. package/dist/src/ui/cancellation.d.ts +14 -0
  43. package/dist/src/ui/cancellation.js +17 -0
  44. package/dist/src/ui/cancellation.js.map +1 -0
  45. package/dist/src/ui/components/ClarifyingQuestionsPrompt.d.ts +17 -0
  46. package/dist/src/ui/components/ClarifyingQuestionsPrompt.js +359 -0
  47. package/dist/src/ui/components/ClarifyingQuestionsPrompt.js.map +1 -0
  48. package/dist/src/ui/components/ContinuePrompt.d.ts +14 -0
  49. package/dist/src/ui/components/ContinuePrompt.js +23 -0
  50. package/dist/src/ui/components/ContinuePrompt.js.map +1 -0
  51. package/dist/src/ui/components/DiffDisplay.d.ts +18 -0
  52. package/dist/src/ui/components/DiffDisplay.js +110 -0
  53. package/dist/src/ui/components/DiffDisplay.js.map +1 -0
  54. package/dist/src/ui/components/FeedbackSelectPrompt.d.ts +20 -0
  55. package/dist/src/ui/components/FeedbackSelectPrompt.js +132 -0
  56. package/dist/src/ui/components/FeedbackSelectPrompt.js.map +1 -0
  57. package/dist/src/ui/components/HistoryItemDisplay.d.ts +14 -0
  58. package/dist/src/ui/components/HistoryItemDisplay.js +140 -0
  59. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -0
  60. package/dist/src/ui/components/Logo.d.ts +10 -0
  61. package/dist/src/ui/components/Logo.js +47 -0
  62. package/dist/src/ui/components/Logo.js.map +1 -0
  63. package/dist/src/ui/components/OrgInfoBox.d.ts +11 -0
  64. package/dist/src/ui/components/OrgInfoBox.js +16 -0
  65. package/dist/src/ui/components/OrgInfoBox.js.map +1 -0
  66. package/dist/src/ui/components/PendingPrompt.d.ts +18 -0
  67. package/dist/src/ui/components/PendingPrompt.js +57 -0
  68. package/dist/src/ui/components/PendingPrompt.js.map +1 -0
  69. package/dist/src/ui/components/PersistentTextInput.d.ts +21 -0
  70. package/dist/src/ui/components/PersistentTextInput.js +117 -0
  71. package/dist/src/ui/components/PersistentTextInput.js.map +1 -0
  72. package/dist/src/ui/components/PlanApprovalPrompt.d.ts +19 -0
  73. package/dist/src/ui/components/PlanApprovalPrompt.js +62 -0
  74. package/dist/src/ui/components/PlanApprovalPrompt.js.map +1 -0
  75. package/dist/src/ui/components/PromptContainer.d.ts +14 -0
  76. package/dist/src/ui/components/PromptContainer.js +18 -0
  77. package/dist/src/ui/components/PromptContainer.js.map +1 -0
  78. package/dist/src/ui/components/SelectPrompt.d.ts +14 -0
  79. package/dist/src/ui/components/SelectPrompt.js +62 -0
  80. package/dist/src/ui/components/SelectPrompt.js.map +1 -0
  81. package/dist/src/ui/components/SpinnerDisplay.d.ts +13 -0
  82. package/dist/src/ui/components/SpinnerDisplay.js +11 -0
  83. package/dist/src/ui/components/SpinnerDisplay.js.map +1 -0
  84. package/dist/src/ui/components/ToolApprovalPrompt.d.ts +14 -0
  85. package/dist/src/ui/components/ToolApprovalPrompt.js +142 -0
  86. package/dist/src/ui/components/ToolApprovalPrompt.js.map +1 -0
  87. package/dist/src/ui/components/ToolCallDisplay.d.ts +14 -0
  88. package/dist/src/ui/components/ToolCallDisplay.js +83 -0
  89. package/dist/src/ui/components/ToolCallDisplay.js.map +1 -0
  90. package/dist/src/ui/components/WriteKeyDisplay.d.ts +15 -0
  91. package/dist/src/ui/components/WriteKeyDisplay.js +13 -0
  92. package/dist/src/ui/components/WriteKeyDisplay.js.map +1 -0
  93. package/dist/src/ui/contexts/WizardContext.d.ts +210 -0
  94. package/dist/src/ui/contexts/WizardContext.js +362 -0
  95. package/dist/src/ui/contexts/WizardContext.js.map +1 -0
  96. package/dist/src/ui/hooks/useCancellation.d.ts +15 -0
  97. package/dist/src/ui/hooks/useCancellation.js +25 -0
  98. package/dist/src/ui/hooks/useCancellation.js.map +1 -0
  99. package/dist/src/ui/render.d.ts +34 -0
  100. package/dist/src/ui/render.js +94 -0
  101. package/dist/src/ui/render.js.map +1 -0
  102. package/dist/src/ui/types.d.ts +184 -0
  103. package/dist/src/ui/types.js +6 -0
  104. package/dist/src/ui/types.js.map +1 -0
  105. package/dist/src/utils/clack-utils.d.ts +13 -0
  106. package/dist/src/utils/clack-utils.js +131 -0
  107. package/dist/src/utils/clack-utils.js.map +1 -0
  108. package/dist/src/utils/debug.d.ts +13 -0
  109. package/dist/src/utils/debug.js +47 -0
  110. package/dist/src/utils/debug.js.map +1 -0
  111. package/dist/src/utils/environment.d.ts +5 -0
  112. package/dist/src/utils/environment.js +131 -0
  113. package/dist/src/utils/environment.js.map +1 -0
  114. package/dist/src/utils/logging.d.ts +9 -0
  115. package/dist/src/utils/logging.js +38 -0
  116. package/dist/src/utils/logging.js.map +1 -0
  117. package/dist/src/utils/oauth.d.ts +12 -0
  118. package/dist/src/utils/oauth.js +497 -0
  119. package/dist/src/utils/oauth.js.map +1 -0
  120. package/dist/src/utils/package-json-types.d.ts +44 -0
  121. package/dist/src/utils/package-json-types.js +6 -0
  122. package/dist/src/utils/package-json-types.js.map +1 -0
  123. package/dist/src/utils/package-json.d.ts +19 -0
  124. package/dist/src/utils/package-json.js +22 -0
  125. package/dist/src/utils/package-json.js.map +1 -0
  126. package/dist/src/utils/session.d.ts +2 -0
  127. package/dist/src/utils/session.js +87 -0
  128. package/dist/src/utils/session.js.map +1 -0
  129. package/dist/src/utils/types.d.ts +61 -0
  130. package/dist/src/utils/types.js +2 -0
  131. package/dist/src/utils/types.js.map +1 -0
  132. package/dist/src/utils/ui.d.ts +120 -0
  133. package/dist/src/utils/ui.js +164 -0
  134. package/dist/src/utils/ui.js.map +1 -0
  135. 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[];