@chimerai/cli 0.2.96 → 0.2.98
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/dist/commands/create.js
CHANGED
|
@@ -995,6 +995,9 @@ async function copyFeatureFiles(targetDir, features) {
|
|
|
995
995
|
const useAppNameHook = templates.generateUseAppNameHook();
|
|
996
996
|
await fs_extra_1.default.ensureDir(path_1.default.join(targetDir, 'lib'));
|
|
997
997
|
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'lib/use-app-name.ts'), useAppNameHook);
|
|
998
|
+
// app-settings route — always generated (called by useAppName hook)
|
|
999
|
+
await fs_extra_1.default.ensureDir(path_1.default.join(targetDir, 'app/api/app-settings'));
|
|
1000
|
+
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'app/api/app-settings/route.ts'), templates.generateAppSettingsRoute());
|
|
998
1001
|
// ── Widget Infrastructure (embeddable chat for external apps) ──────
|
|
999
1002
|
// Rate limiter (supports both session and API-key tiers)
|
|
1000
1003
|
const rateLimiter = templates.generateRateLimiter();
|
|
@@ -1107,10 +1110,6 @@ async function copyFeatureFiles(targetDir, features) {
|
|
|
1107
1110
|
const adminSettingsRoute = templates.generateAdminSettingsRoute();
|
|
1108
1111
|
await fs_extra_1.default.ensureDir(path_1.default.join(targetDir, 'app/api/admin/settings'));
|
|
1109
1112
|
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'app/api/admin/settings/route.ts'), adminSettingsRoute);
|
|
1110
|
-
// Public app-settings API route (used by useAppName hook)
|
|
1111
|
-
const appSettingsRoute = templates.generateAppSettingsRoute();
|
|
1112
|
-
await fs_extra_1.default.ensureDir(path_1.default.join(targetDir, 'app/api/app-settings'));
|
|
1113
|
-
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'app/api/app-settings/route.ts'), appSettingsRoute);
|
|
1114
1113
|
// ── RBAC Permission utilities (required by admin API routes) ───
|
|
1115
1114
|
const permissionsLib = `/**
|
|
1116
1115
|
* Permission utility functions
|
|
@@ -1287,6 +1286,17 @@ async function getServerSessionWithPermissions() {
|
|
|
1287
1286
|
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'app/api/v1/models/route.ts'), templates.generateV1ModelsRoute());
|
|
1288
1287
|
}
|
|
1289
1288
|
// ── Billing / Stripe (when selected) ────────────────────────────
|
|
1289
|
+
// Always generate /api/billing/credits — chat hook calls it unconditionally.
|
|
1290
|
+
// Without billing: return a stub so the client gets a clean 200 instead of 404.
|
|
1291
|
+
await fs_extra_1.default.ensureDir(path_1.default.join(targetDir, 'app/api/billing/credits'));
|
|
1292
|
+
if (!features.includes('billing')) {
|
|
1293
|
+
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'app/api/billing/credits/route.ts'), `import { NextResponse } from 'next/server';
|
|
1294
|
+
// Billing feature not enabled — return stub so the client doesn't get a 404
|
|
1295
|
+
export async function GET() {
|
|
1296
|
+
return NextResponse.json({ balance: null, enabled: false });
|
|
1297
|
+
}
|
|
1298
|
+
`);
|
|
1299
|
+
}
|
|
1290
1300
|
if (features.includes('billing')) {
|
|
1291
1301
|
const stripeLib = templates.generateStripeLib();
|
|
1292
1302
|
await fs_extra_1.default.ensureDir(path_1.default.join(targetDir, 'lib'));
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
/**
|
|
6
6
|
* Generates the Model Providers management page
|
|
7
|
-
* Self-contained
|
|
7
|
+
* Self-contained — no external @chimerai/* imports needed
|
|
8
8
|
* @returns TypeScript/JSX content for app/dashboard/providers/page.tsx
|
|
9
9
|
*/
|
|
10
10
|
export declare function generateModelProvidersPage(): string;
|
|
@@ -9,7 +9,7 @@ exports.generatePromptManagementPage = generatePromptManagementPage;
|
|
|
9
9
|
exports.generatePromptSelector = generatePromptSelector;
|
|
10
10
|
/**
|
|
11
11
|
* Generates the Model Providers management page
|
|
12
|
-
* Self-contained
|
|
12
|
+
* Self-contained — no external @chimerai/* imports needed
|
|
13
13
|
* @returns TypeScript/JSX content for app/dashboard/providers/page.tsx
|
|
14
14
|
*/
|
|
15
15
|
function generateModelProvidersPage() {
|
|
@@ -156,7 +156,7 @@ export default function ProvidersPage() {
|
|
|
156
156
|
await fetchProviders();
|
|
157
157
|
}
|
|
158
158
|
} catch {
|
|
159
|
-
// Sync failed silently
|
|
159
|
+
// Sync failed silently — models will appear on next manual sync
|
|
160
160
|
} finally {
|
|
161
161
|
setSyncing(prev => ({ ...prev, [id]: false }));
|
|
162
162
|
}
|
|
@@ -241,7 +241,7 @@ export default function ProvidersPage() {
|
|
|
241
241
|
<select value={formData.defaultModel}
|
|
242
242
|
onChange={e => setFormData(f => ({ ...f, defaultModel: e.target.value }))}
|
|
243
243
|
className="w-full px-3 py-2 border dark:border-gray-600 rounded-lg dark:bg-gray-700 dark:text-white">
|
|
244
|
-
<option value=""
|
|
244
|
+
<option value="">— Select a model —</option>
|
|
245
245
|
{editingModels
|
|
246
246
|
.filter(m => !m.capabilities || m.capabilities.length === 0 || m.capabilities.some(c => ['chat', 'completion'].includes(c)))
|
|
247
247
|
.map(m => <option key={m.id} value={m.modelId}>{m.name || m.modelId}</option>)}
|
|
@@ -297,7 +297,7 @@ export default function ProvidersPage() {
|
|
|
297
297
|
)}
|
|
298
298
|
{testResults[provider.id] && (
|
|
299
299
|
<div className={\`text-sm p-2 rounded mb-3 \${testResults[provider.id].success ? 'bg-green-50 dark:bg-green-900/20 text-green-700 dark:text-green-300' : 'bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-300'}\`}>
|
|
300
|
-
{testResults[provider.id].success ?
|
|
300
|
+
{testResults[provider.id].success ? \`✓ Connected (\${testResults[provider.id].responseTime}ms)\` : \`✗ \${testResults[provider.id].errorMessage}\`}
|
|
301
301
|
</div>
|
|
302
302
|
)}
|
|
303
303
|
<div className="flex gap-2 mt-3 pt-3 border-t dark:border-gray-700">
|
package/package.json
CHANGED