@chimerai/cli 0.2.89 → 0.2.90
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/add.d.ts.map +1 -1
- package/dist/commands/add.js +2 -4
- package/dist/commands/create.js +18 -2
- package/dist/templates/chat.d.ts +1 -0
- package/dist/templates/chat.d.ts.map +1 -1
- package/dist/templates/chat.js +135 -0
- package/dist/templates/components.d.ts.map +1 -1
- package/dist/templates/components.js +0 -6
- package/dist/templates/index.d.ts +3 -3
- package/dist/templates/index.d.ts.map +1 -1
- package/dist/templates/index.js +6 -3
- package/dist/templates/layout.d.ts +2 -0
- package/dist/templates/layout.d.ts.map +1 -1
- package/dist/templates/layout.js +127 -3
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiBH,UAAU,UAAU;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiBH,UAAU,UAAU;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAk5ED,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,iBAyHtE"}
|
package/dist/commands/add.js
CHANGED
|
@@ -1194,12 +1194,10 @@ async function hasFeature(feature, targetDir) {
|
|
|
1194
1194
|
if (feature === 'billing')
|
|
1195
1195
|
return 'stripe' in deps;
|
|
1196
1196
|
if (feature === 'rbac') {
|
|
1197
|
-
return
|
|
1198
|
-
(await fs_extra_1.default.pathExists(path_1.default.join(targetDir, 'lib/rbac.ts'))));
|
|
1197
|
+
return '@chimerai/rbac' in deps || (await fs_extra_1.default.pathExists(path_1.default.join(targetDir, 'lib/rbac.ts')));
|
|
1199
1198
|
}
|
|
1200
1199
|
if (feature === 'admin-dashboard') {
|
|
1201
|
-
return ('@chimerai/admin-ui' in deps ||
|
|
1202
|
-
(await fs_extra_1.default.pathExists(path_1.default.join(targetDir, 'app/admin'))));
|
|
1200
|
+
return ('@chimerai/admin-ui' in deps || (await fs_extra_1.default.pathExists(path_1.default.join(targetDir, 'app/admin'))));
|
|
1203
1201
|
}
|
|
1204
1202
|
}
|
|
1205
1203
|
catch {
|
package/dist/commands/create.js
CHANGED
|
@@ -231,7 +231,15 @@ async function createCommand(projectName, options) {
|
|
|
231
231
|
*/
|
|
232
232
|
function validateFeatureCombination(features) {
|
|
233
233
|
const warnings = [];
|
|
234
|
-
const authRequired = [
|
|
234
|
+
const authRequired = [
|
|
235
|
+
'rbac',
|
|
236
|
+
'admin-dashboard',
|
|
237
|
+
'billing',
|
|
238
|
+
'mfa',
|
|
239
|
+
'gdpr',
|
|
240
|
+
'audit-log',
|
|
241
|
+
'chat-ui',
|
|
242
|
+
];
|
|
235
243
|
if (!features.includes('auth')) {
|
|
236
244
|
authRequired.forEach((f) => {
|
|
237
245
|
if (features.includes(f)) {
|
|
@@ -1004,6 +1012,14 @@ async function copyFeatureFiles(targetDir, features) {
|
|
|
1004
1012
|
const providersPage = templates.generateModelProvidersPage();
|
|
1005
1013
|
await fs_extra_1.default.ensureDir(path_1.default.join(targetDir, 'app/dashboard/providers'));
|
|
1006
1014
|
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'app/dashboard/providers/page.tsx'), providersPage);
|
|
1015
|
+
// No-auth dashboard landing page + layout (when auth is not selected)
|
|
1016
|
+
if (!features.includes('auth')) {
|
|
1017
|
+
const noAuthDashPage = templates.generateDashboardPageNoAuth(features);
|
|
1018
|
+
await fs_extra_1.default.ensureDir(path_1.default.join(targetDir, 'app/dashboard'));
|
|
1019
|
+
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'app/dashboard/page.tsx'), noAuthDashPage);
|
|
1020
|
+
const noAuthDashLayout = templates.generateDashboardLayoutNoAuth();
|
|
1021
|
+
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'app/dashboard/layout.tsx'), noAuthDashLayout);
|
|
1022
|
+
}
|
|
1007
1023
|
if (features.includes('admin')) {
|
|
1008
1024
|
// Admin layout with session check + admin role guard
|
|
1009
1025
|
const adminLayout = templates.generateAdminLayout();
|
|
@@ -1218,7 +1234,7 @@ async function getServerSessionWithPermissions() {
|
|
|
1218
1234
|
].join('\n') + '\n');
|
|
1219
1235
|
// Chat page
|
|
1220
1236
|
await fs_extra_1.default.ensureDir(path_1.default.join(targetDir, 'app/(app)/chat'));
|
|
1221
|
-
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'app/(app)/chat/page.tsx'), templates.generateChatPage());
|
|
1237
|
+
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'app/(app)/chat/page.tsx'), features.includes('auth') ? templates.generateChatPage() : templates.generateChatPageNoAuth());
|
|
1222
1238
|
// API routes
|
|
1223
1239
|
await fs_extra_1.default.ensureDir(path_1.default.join(targetDir, 'app/api/v1/chat/stream'));
|
|
1224
1240
|
await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'app/api/v1/chat/stream/route.ts'), templates.generateChatStreamRouteWithPersistence());
|
package/dist/templates/chat.d.ts
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* Displays conversations, allows provider selection, integrates StreamingChat component
|
|
8
8
|
* @returns TypeScript/JSX content for app/dashboard/chat/page.tsx
|
|
9
9
|
*/
|
|
10
|
+
export declare function generateChatPageNoAuth(): string;
|
|
10
11
|
export declare function generateChatPage(): string;
|
|
11
12
|
/**
|
|
12
13
|
* Generates the streaming Chat API route — Direct LLM provider communication with DB persistence
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/templates/chat.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAuLzC;AAED;;;;GAIG;AACH,wBAAgB,sCAAsC,IAAI,MAAM,CAwa/D;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAwEnD;AAMD;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAkb5C;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAuQ5C;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAwH1C;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CA+O5C;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CA+D9C;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,IAAI,MAAM,CAyGxD"}
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/templates/chat.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAqI/C;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAuLzC;AAED;;;;GAIG;AACH,wBAAgB,sCAAsC,IAAI,MAAM,CAwa/D;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAwEnD;AAMD;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAkb5C;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAuQ5C;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAwH1C;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CA+O5C;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CA+D9C;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,IAAI,MAAM,CAyGxD"}
|
package/dist/templates/chat.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Generates streaming chat UI, conversation management, and AI model integration
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.generateChatPageNoAuth = generateChatPageNoAuth;
|
|
7
8
|
exports.generateChatPage = generateChatPage;
|
|
8
9
|
exports.generateChatStreamRouteWithPersistence = generateChatStreamRouteWithPersistence;
|
|
9
10
|
exports.generateConversationsRoute = generateConversationsRoute;
|
|
@@ -18,6 +19,140 @@ exports.generateConversationDetailRoute = generateConversationDetailRoute;
|
|
|
18
19
|
* Displays conversations, allows provider selection, integrates StreamingChat component
|
|
19
20
|
* @returns TypeScript/JSX content for app/dashboard/chat/page.tsx
|
|
20
21
|
*/
|
|
22
|
+
function generateChatPageNoAuth() {
|
|
23
|
+
return `// @chimerai component=ChatPageNoAuth version=1.0
|
|
24
|
+
'use client';
|
|
25
|
+
|
|
26
|
+
import { useRef, useState } from 'react';
|
|
27
|
+
import { useAppName } from '@/lib/use-app-name';
|
|
28
|
+
import { useChat } from '@/components/chat/use-chat';
|
|
29
|
+
import { ChatMessage } from '@/components/chat/chat-message';
|
|
30
|
+
import { ChatInput } from '@/components/chat/chat-input';
|
|
31
|
+
import { ChatSidebar } from '@/components/chat/chat-sidebar';
|
|
32
|
+
import { ModelSelector } from '@/components/chat/model-selector';
|
|
33
|
+
import type { MessageActions } from '@/components/chat/chat-message';
|
|
34
|
+
|
|
35
|
+
export default function ChatPage() {
|
|
36
|
+
const messagesEndRef = useRef<HTMLDivElement>(null);
|
|
37
|
+
const [sidebarOpen, setSidebarOpen] = useState(false);
|
|
38
|
+
const appName = useAppName();
|
|
39
|
+
|
|
40
|
+
const {
|
|
41
|
+
messages,
|
|
42
|
+
isStreaming,
|
|
43
|
+
conversations,
|
|
44
|
+
selectedConversationId,
|
|
45
|
+
models,
|
|
46
|
+
selectedModelId,
|
|
47
|
+
creditBalance,
|
|
48
|
+
isLoadingConversation,
|
|
49
|
+
sendMessage,
|
|
50
|
+
stopStreaming,
|
|
51
|
+
selectConversation,
|
|
52
|
+
startNewChat,
|
|
53
|
+
deleteConversation,
|
|
54
|
+
renameConversation,
|
|
55
|
+
setSelectedModelId,
|
|
56
|
+
regenerateMessage,
|
|
57
|
+
editMessage,
|
|
58
|
+
deleteMessage,
|
|
59
|
+
} = useChat();
|
|
60
|
+
|
|
61
|
+
const handleSelectConversation = (id: string) => {
|
|
62
|
+
selectConversation(id);
|
|
63
|
+
setSidebarOpen(false);
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
const handleNewChat = () => {
|
|
67
|
+
startNewChat();
|
|
68
|
+
setSidebarOpen(false);
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const messageActions: MessageActions = {
|
|
72
|
+
onRegenerate: regenerateMessage,
|
|
73
|
+
onEdit: editMessage,
|
|
74
|
+
onDelete: deleteMessage,
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
return (
|
|
78
|
+
<div className="flex h-screen bg-white dark:bg-gray-950 relative">
|
|
79
|
+
{sidebarOpen && (
|
|
80
|
+
<div
|
|
81
|
+
className="fixed inset-0 bg-black/50 z-30 md:hidden"
|
|
82
|
+
onClick={() => setSidebarOpen(false)}
|
|
83
|
+
/>
|
|
84
|
+
)}
|
|
85
|
+
<aside className={\`fixed inset-y-0 left-0 z-40 w-72 border-r border-gray-200 dark:border-gray-800 transform transition-transform duration-200 ease-in-out
|
|
86
|
+
\${sidebarOpen ? 'translate-x-0' : '-translate-x-full'}
|
|
87
|
+
md:relative md:translate-x-0 md:z-auto\`}>
|
|
88
|
+
<ChatSidebar
|
|
89
|
+
conversations={conversations}
|
|
90
|
+
selectedId={selectedConversationId}
|
|
91
|
+
onSelect={handleSelectConversation}
|
|
92
|
+
onNewChat={handleNewChat}
|
|
93
|
+
onDelete={deleteConversation}
|
|
94
|
+
onRename={renameConversation}
|
|
95
|
+
/>
|
|
96
|
+
</aside>
|
|
97
|
+
<main className="flex-1 flex flex-col min-w-0">
|
|
98
|
+
<div className="flex items-center gap-3 border-b border-gray-200 dark:border-gray-800 px-4 py-2">
|
|
99
|
+
<button
|
|
100
|
+
onClick={() => setSidebarOpen(!sidebarOpen)}
|
|
101
|
+
className="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 text-gray-500 md:hidden"
|
|
102
|
+
aria-label="Toggle sidebar"
|
|
103
|
+
>
|
|
104
|
+
<svg className="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
105
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 6h16M4 12h16M4 18h16" />
|
|
106
|
+
</svg>
|
|
107
|
+
</button>
|
|
108
|
+
<ModelSelector
|
|
109
|
+
models={models}
|
|
110
|
+
value={selectedModelId}
|
|
111
|
+
onValueChange={setSelectedModelId}
|
|
112
|
+
disabled={isStreaming}
|
|
113
|
+
/>
|
|
114
|
+
<div className="flex-1" />
|
|
115
|
+
<span className="text-xs text-gray-400">{appName}</span>
|
|
116
|
+
</div>
|
|
117
|
+
<div className="flex-1 overflow-y-auto">
|
|
118
|
+
{isLoadingConversation ? (
|
|
119
|
+
<div className="flex items-center justify-center h-full">
|
|
120
|
+
<div className="text-gray-400">Loading conversation...</div>
|
|
121
|
+
</div>
|
|
122
|
+
) : messages.length === 0 ? (
|
|
123
|
+
<div className="flex flex-col items-center justify-center h-full text-center px-4">
|
|
124
|
+
<svg className="h-12 w-12 text-gray-300 mb-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
125
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={1.5} d="M8 10h.01M12 10h.01M16 10h.01M9 16H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-5l-5 5v-5z" />
|
|
126
|
+
</svg>
|
|
127
|
+
<h2 className="text-lg font-medium text-gray-700 dark:text-gray-300 mb-1">Start a conversation</h2>
|
|
128
|
+
<p className="text-sm text-gray-400">Send a message to begin chatting with AI</p>
|
|
129
|
+
</div>
|
|
130
|
+
) : (
|
|
131
|
+
<div className="max-w-3xl mx-auto">
|
|
132
|
+
{messages.map((msg, idx) => (
|
|
133
|
+
<ChatMessage
|
|
134
|
+
key={msg.id || idx}
|
|
135
|
+
message={msg}
|
|
136
|
+
index={idx}
|
|
137
|
+
actions={messageActions}
|
|
138
|
+
/>
|
|
139
|
+
))}
|
|
140
|
+
<div ref={messagesEndRef} />
|
|
141
|
+
</div>
|
|
142
|
+
)}
|
|
143
|
+
</div>
|
|
144
|
+
<ChatInput
|
|
145
|
+
onSend={sendMessage}
|
|
146
|
+
onStop={stopStreaming}
|
|
147
|
+
isStreaming={isStreaming}
|
|
148
|
+
creditBalance={creditBalance}
|
|
149
|
+
/>
|
|
150
|
+
</main>
|
|
151
|
+
</div>
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
`;
|
|
155
|
+
}
|
|
21
156
|
function generateChatPage() {
|
|
22
157
|
return `// @chimerai component=ChatPage version=2.0
|
|
23
158
|
'use client';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/templates/components.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/templates/components.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAyTnD;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,IAAI,MAAM,CA2QrD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CA4D/C"}
|
|
@@ -18,7 +18,6 @@ function generateModelProvidersPage() {
|
|
|
18
18
|
'use client';
|
|
19
19
|
|
|
20
20
|
import { useState, useEffect, useCallback } from 'react';
|
|
21
|
-
import { useSession } from 'next-auth/react';
|
|
22
21
|
|
|
23
22
|
interface ProviderModel {
|
|
24
23
|
id: string;
|
|
@@ -64,7 +63,6 @@ const PROVIDER_TYPES = [
|
|
|
64
63
|
const emptyForm: ProviderFormData = { name: '', type: 'openai', apiKey: '', baseUrl: '', defaultModel: '' };
|
|
65
64
|
|
|
66
65
|
export default function ProvidersPage() {
|
|
67
|
-
const { data: session } = useSession();
|
|
68
66
|
const [providers, setProviders] = useState<Provider[]>([]);
|
|
69
67
|
const [loading, setLoading] = useState(true);
|
|
70
68
|
const [showForm, setShowForm] = useState(false);
|
|
@@ -190,10 +188,6 @@ export default function ProvidersPage() {
|
|
|
190
188
|
setShowForm(true);
|
|
191
189
|
};
|
|
192
190
|
|
|
193
|
-
if (!session?.user?.id) {
|
|
194
|
-
return <div className="container mx-auto py-8"><p className="text-center text-gray-500">Please sign in to manage model providers.</p></div>;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
191
|
return (
|
|
198
192
|
<div className="container mx-auto py-8 max-w-5xl">
|
|
199
193
|
<div className="flex items-center justify-between mb-6">
|
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
* written to a file in the generated project.
|
|
7
7
|
*/
|
|
8
8
|
export { generateNextConfig, generateTsConfig, generateTailwindConfig, generatePostcssConfig, generateGlobalsCss, } from './config.js';
|
|
9
|
-
export { generateAppLayout, generateAppLayoutWithAuth, generateAppPage, generateAppPageNoAuth, generateAuthBasicLayout, generateDashboardLayout, generateDashboardPage, generateProfilePage, generateUserProfileRoute, generateSettingsPage, generateUseAppNameHook, } from './layout.js';
|
|
9
|
+
export { generateAppLayout, generateAppLayoutWithAuth, generateAppPage, generateAppPageNoAuth, generateAuthBasicLayout, generateDashboardLayout, generateDashboardLayoutNoAuth, generateDashboardPage, generateDashboardPageNoAuth, generateProfilePage, generateUserProfileRoute, generateSettingsPage, generateUseAppNameHook, } from './layout.js';
|
|
10
10
|
export { generateNextAuthRoute, generateLoginPage, generateSessionProvider, generateLogoutButton, generateNextAuthTypes, generateAuthLib, generateResolveAuth, } from './auth.js';
|
|
11
|
-
export { generateChatPage, generateUseChatHook, generateChatMessage, generateChatInput, generateChatSidebar, generateModelSelector, generateChatStreamRouteWithPersistence, generateConversationsRoute, generateConversationDetailRoute, } from './chat.js';
|
|
11
|
+
export { generateChatPage, generateChatPageNoAuth, generateUseChatHook, generateChatMessage, generateChatInput, generateChatSidebar, generateModelSelector, generateChatStreamRouteWithPersistence, generateConversationsRoute, generateConversationDetailRoute, } from './chat.js';
|
|
12
12
|
export { generateAdminLayout, generateAdminDashboardPage, generateAdminUsersPage, generateAdminRolesPage, generateAdminSettingsPage, generateAdminLogsPage, generateAuditLogHelper, generatePermissionsLib, generateRequirePermissionLib, } from './admin.js';
|
|
13
|
-
export { generateModelProvidersPage, generatePromptManagementPage, generatePromptSelector } from './components.js';
|
|
13
|
+
export { generateModelProvidersPage, generatePromptManagementPage, generatePromptSelector, } from './components.js';
|
|
14
14
|
export { generateAdminUsersRoute, generateAdminUsersIdRoute, generateAdminRolesRoute, generateAdminRolesIdRoute, generatePromptsRoute, generatePromptsIdRoute, generatePromptsSetDefaultRoute, generateHealthRoute, generateModelsRoute, generateV1ModelsRoute, generateAuditLogRoute, generateGdprDataExportRoute, generateGdprAccountDeleteRoute, generateAdminSettingsRoute, generateAppSettingsRoute, } from './api-routes.js';
|
|
15
15
|
export { generateProviderCrudRoute, generateProviderIdRoute, generateProviderTestRoute, generateProviderSyncRoute, generateInternalProvidersRoute, generateInternalProviderIdRoute, generateInternalProviderUsageRoute, generateNotifyProviderChangeLib, } from './provider-routes.js';
|
|
16
16
|
export { generatePrismaLib, generateEncryptionLib, generateApiKeyAuthLib, generateApiProtectionLib, generatePrismaSchema, } from './prisma.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,EACf,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,GACpB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,sCAAsC,EACtC,0BAA0B,EAC1B,+BAA+B,GAChC,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,EACtB,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,YAAY,CAAC;AAGpB,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"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"}
|
package/dist/templates/index.js
CHANGED
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
* written to a file in the generated project.
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.
|
|
11
|
-
exports.
|
|
12
|
-
exports.FEATURE_TEMPLATES = exports.ALL_TEMPLATES = exports.TOOL_GENERATORS = exports.generateToolsInit = exports.generateWebhookTools = exports.generateDeeplTools = exports.generateAirtableTools = exports.generateGoogleSheetsTools = exports.generateVisionTools = exports.generateNlpTools = exports.generateCodeTools = exports.generateDocumentTools = exports.generateWebTools = exports.generateRoutesInit = exports.generateToolsRoutes = exports.generateGuardrailsRoutes = exports.generateRagRoutes = exports.generateChatRoutes = exports.generateFileExtractor = exports.generateDockerComposeAiService = exports.generateAiServiceReadme = exports.generateAiServiceDockerfile = exports.generateAiServiceRequirements = exports.generateAiServiceModels = exports.generateAiServiceConfig = exports.generateAiServiceMain = exports.generateGuardrailsService = exports.generateVectorStore = exports.generateRagService = exports.generateEmbeddingService = exports.generateModerationService = exports.generateModelService = exports.generateChatService = exports.generateServicesInit = exports.generateProviderClient = exports.TOOL_INFO = exports.writeAiManifest = exports.readAiManifest = exports.generateDockerComposeDev = exports.generateDockerComposeProd = exports.generateDockerignore = exports.generateDockerfile = exports.GDPR_SCHEMA_EXTENSION = exports.generateGdprConsentRoute = exports.generateGdprPage = exports.generateGdprLib = void 0;
|
|
10
|
+
exports.generateAdminRolesRoute = exports.generateAdminUsersIdRoute = exports.generateAdminUsersRoute = exports.generatePromptSelector = exports.generatePromptManagementPage = exports.generateModelProvidersPage = exports.generateRequirePermissionLib = exports.generatePermissionsLib = exports.generateAuditLogHelper = exports.generateAdminLogsPage = exports.generateAdminSettingsPage = exports.generateAdminRolesPage = exports.generateAdminUsersPage = exports.generateAdminDashboardPage = exports.generateAdminLayout = exports.generateConversationDetailRoute = exports.generateConversationsRoute = exports.generateChatStreamRouteWithPersistence = exports.generateModelSelector = exports.generateChatSidebar = exports.generateChatInput = exports.generateChatMessage = exports.generateUseChatHook = exports.generateChatPageNoAuth = exports.generateChatPage = exports.generateResolveAuth = exports.generateAuthLib = exports.generateNextAuthTypes = exports.generateLogoutButton = exports.generateSessionProvider = exports.generateLoginPage = exports.generateNextAuthRoute = exports.generateUseAppNameHook = exports.generateSettingsPage = exports.generateUserProfileRoute = exports.generateProfilePage = exports.generateDashboardPageNoAuth = exports.generateDashboardPage = exports.generateDashboardLayoutNoAuth = exports.generateDashboardLayout = exports.generateAuthBasicLayout = exports.generateAppPageNoAuth = exports.generateAppPage = exports.generateAppLayoutWithAuth = exports.generateAppLayout = exports.generateGlobalsCss = exports.generatePostcssConfig = exports.generateTailwindConfig = exports.generateTsConfig = exports.generateNextConfig = void 0;
|
|
11
|
+
exports.generateMfaDisableRoute = exports.generateMfaVerifyRoute = exports.generateMfaSetupRoute = exports.generateMfaLib = exports.generateRateLimiter = exports.generateApiKeyIdRoute = exports.generateApiKeysRoute = exports.generateApiKeyManagementPage = exports.generateWidgetLoader = exports.generateWidgetBundle = exports.generateRagDeleteRoute = exports.generateRagClearRoute = exports.generateRagStatsRoute = exports.generateRagQueryRoute = exports.generateRagUploadRoute = exports.generateRagPage = exports.generateRagLib = exports.generateStripeWebhookRoute = exports.generateSubscriptionRoute = exports.generatePortalRoute = exports.generateCheckoutRoute = exports.generateBillingPage = exports.generateStripeLib = exports.generateMiddlewareNoAuth = exports.generateMiddleware = exports.generatePrismaSchema = exports.generateApiProtectionLib = exports.generateApiKeyAuthLib = exports.generateEncryptionLib = exports.generatePrismaLib = exports.generateNotifyProviderChangeLib = exports.generateInternalProviderUsageRoute = exports.generateInternalProviderIdRoute = exports.generateInternalProvidersRoute = exports.generateProviderSyncRoute = exports.generateProviderTestRoute = exports.generateProviderIdRoute = exports.generateProviderCrudRoute = exports.generateAppSettingsRoute = exports.generateAdminSettingsRoute = exports.generateGdprAccountDeleteRoute = exports.generateGdprDataExportRoute = exports.generateAuditLogRoute = exports.generateV1ModelsRoute = exports.generateModelsRoute = exports.generateHealthRoute = exports.generatePromptsSetDefaultRoute = exports.generatePromptsIdRoute = exports.generatePromptsRoute = exports.generateAdminRolesIdRoute = void 0;
|
|
12
|
+
exports.FEATURE_TEMPLATES = exports.ALL_TEMPLATES = exports.TOOL_GENERATORS = exports.generateToolsInit = exports.generateWebhookTools = exports.generateDeeplTools = exports.generateAirtableTools = exports.generateGoogleSheetsTools = exports.generateVisionTools = exports.generateNlpTools = exports.generateCodeTools = exports.generateDocumentTools = exports.generateWebTools = exports.generateRoutesInit = exports.generateToolsRoutes = exports.generateGuardrailsRoutes = exports.generateRagRoutes = exports.generateChatRoutes = exports.generateFileExtractor = exports.generateDockerComposeAiService = exports.generateAiServiceReadme = exports.generateAiServiceDockerfile = exports.generateAiServiceRequirements = exports.generateAiServiceModels = exports.generateAiServiceConfig = exports.generateAiServiceMain = exports.generateGuardrailsService = exports.generateVectorStore = exports.generateRagService = exports.generateEmbeddingService = exports.generateModerationService = exports.generateModelService = exports.generateChatService = exports.generateServicesInit = exports.generateProviderClient = exports.TOOL_INFO = exports.writeAiManifest = exports.readAiManifest = exports.generateDockerComposeDev = exports.generateDockerComposeProd = exports.generateDockerignore = exports.generateDockerfile = exports.GDPR_SCHEMA_EXTENSION = exports.generateGdprConsentRoute = exports.generateGdprPage = exports.generateGdprLib = exports.MFA_USER_FIELDS = exports.MFA_SCHEMA_EXTENSION = exports.generateMfaPage = void 0;
|
|
13
13
|
// Config templates
|
|
14
14
|
var config_js_1 = require("./config.js");
|
|
15
15
|
Object.defineProperty(exports, "generateNextConfig", { enumerable: true, get: function () { return config_js_1.generateNextConfig; } });
|
|
@@ -25,7 +25,9 @@ Object.defineProperty(exports, "generateAppPage", { enumerable: true, get: funct
|
|
|
25
25
|
Object.defineProperty(exports, "generateAppPageNoAuth", { enumerable: true, get: function () { return layout_js_1.generateAppPageNoAuth; } });
|
|
26
26
|
Object.defineProperty(exports, "generateAuthBasicLayout", { enumerable: true, get: function () { return layout_js_1.generateAuthBasicLayout; } });
|
|
27
27
|
Object.defineProperty(exports, "generateDashboardLayout", { enumerable: true, get: function () { return layout_js_1.generateDashboardLayout; } });
|
|
28
|
+
Object.defineProperty(exports, "generateDashboardLayoutNoAuth", { enumerable: true, get: function () { return layout_js_1.generateDashboardLayoutNoAuth; } });
|
|
28
29
|
Object.defineProperty(exports, "generateDashboardPage", { enumerable: true, get: function () { return layout_js_1.generateDashboardPage; } });
|
|
30
|
+
Object.defineProperty(exports, "generateDashboardPageNoAuth", { enumerable: true, get: function () { return layout_js_1.generateDashboardPageNoAuth; } });
|
|
29
31
|
Object.defineProperty(exports, "generateProfilePage", { enumerable: true, get: function () { return layout_js_1.generateProfilePage; } });
|
|
30
32
|
Object.defineProperty(exports, "generateUserProfileRoute", { enumerable: true, get: function () { return layout_js_1.generateUserProfileRoute; } });
|
|
31
33
|
Object.defineProperty(exports, "generateSettingsPage", { enumerable: true, get: function () { return layout_js_1.generateSettingsPage; } });
|
|
@@ -42,6 +44,7 @@ Object.defineProperty(exports, "generateResolveAuth", { enumerable: true, get: f
|
|
|
42
44
|
// Chat templates
|
|
43
45
|
var chat_js_1 = require("./chat.js");
|
|
44
46
|
Object.defineProperty(exports, "generateChatPage", { enumerable: true, get: function () { return chat_js_1.generateChatPage; } });
|
|
47
|
+
Object.defineProperty(exports, "generateChatPageNoAuth", { enumerable: true, get: function () { return chat_js_1.generateChatPageNoAuth; } });
|
|
45
48
|
Object.defineProperty(exports, "generateUseChatHook", { enumerable: true, get: function () { return chat_js_1.generateUseChatHook; } });
|
|
46
49
|
Object.defineProperty(exports, "generateChatMessage", { enumerable: true, get: function () { return chat_js_1.generateChatMessage; } });
|
|
47
50
|
Object.defineProperty(exports, "generateChatInput", { enumerable: true, get: function () { return chat_js_1.generateChatInput; } });
|
|
@@ -40,6 +40,8 @@ export declare function generateAuthBasicLayout(): string;
|
|
|
40
40
|
* Provides structure for authenticated application pages
|
|
41
41
|
* @returns TypeScript/JSX content for app/(dashboard)/layout.tsx
|
|
42
42
|
*/
|
|
43
|
+
export declare function generateDashboardLayoutNoAuth(): string;
|
|
44
|
+
export declare function generateDashboardPageNoAuth(features?: string[]): string;
|
|
43
45
|
export declare function generateDashboardLayout(): string;
|
|
44
46
|
/**
|
|
45
47
|
* Generates the main dashboard page shown after login
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/templates/layout.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,GAAE,MAAuB,GAAG,MAAM,CAyB9E;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,GAAE,MAAuB,GAAG,MAAM,CAmCtF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/templates/layout.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,GAAE,MAAuB,GAAG,MAAM,CAyB9E;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,GAAE,MAAuB,GAAG,MAAM,CAmCtF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAkC9C;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAiCxC;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CA2BhD;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,IAAI,MAAM,CA4DtD;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,GAAE,MAAM,EAAO,GAAG,MAAM,CA+C3E;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAuGhD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,GAAE,MAAM,EAAO,GAAG,MAAM,CAgErE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAkG5C;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CA6BjD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAyJ7C;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAkC/C"}
|
package/dist/templates/layout.js
CHANGED
|
@@ -9,6 +9,8 @@ exports.generateAppLayoutWithAuth = generateAppLayoutWithAuth;
|
|
|
9
9
|
exports.generateAppPageNoAuth = generateAppPageNoAuth;
|
|
10
10
|
exports.generateAppPage = generateAppPage;
|
|
11
11
|
exports.generateAuthBasicLayout = generateAuthBasicLayout;
|
|
12
|
+
exports.generateDashboardLayoutNoAuth = generateDashboardLayoutNoAuth;
|
|
13
|
+
exports.generateDashboardPageNoAuth = generateDashboardPageNoAuth;
|
|
12
14
|
exports.generateDashboardLayout = generateDashboardLayout;
|
|
13
15
|
exports.generateDashboardPage = generateDashboardPage;
|
|
14
16
|
exports.generateProfilePage = generateProfilePage;
|
|
@@ -96,16 +98,32 @@ export default function RootLayout({
|
|
|
96
98
|
*/
|
|
97
99
|
function generateAppPageNoAuth() {
|
|
98
100
|
return `// @chimerai component=AppPageNoAuth version=1.0
|
|
101
|
+
import Link from 'next/link';
|
|
102
|
+
|
|
99
103
|
export default function Home() {
|
|
100
104
|
return (
|
|
101
105
|
<main className="flex min-h-screen flex-col items-center justify-center p-24">
|
|
102
106
|
<div className="text-center">
|
|
103
107
|
<h1 className="text-4xl font-bold mb-4">Welcome</h1>
|
|
104
|
-
<p className="text-muted-foreground">
|
|
108
|
+
<p className="text-muted-foreground mb-8">
|
|
105
109
|
Your ChimerAI application is running.
|
|
106
110
|
</p>
|
|
107
|
-
<
|
|
108
|
-
|
|
111
|
+
<div className="flex gap-4 justify-center flex-wrap">
|
|
112
|
+
<Link
|
|
113
|
+
href="/chat"
|
|
114
|
+
className="px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors font-medium"
|
|
115
|
+
>
|
|
116
|
+
💬 Open Chat
|
|
117
|
+
</Link>
|
|
118
|
+
<Link
|
|
119
|
+
href="/dashboard/providers"
|
|
120
|
+
className="px-6 py-3 border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors font-medium"
|
|
121
|
+
>
|
|
122
|
+
🔌 Manage Providers
|
|
123
|
+
</Link>
|
|
124
|
+
</div>
|
|
125
|
+
<p className="text-xs text-muted-foreground mt-8">
|
|
126
|
+
To add authentication later, run: <code className="bg-gray-100 px-1 rounded">chimerai add auth</code>
|
|
109
127
|
</p>
|
|
110
128
|
</div>
|
|
111
129
|
</main>
|
|
@@ -191,6 +209,112 @@ export default function AuthLayout({
|
|
|
191
209
|
* Provides structure for authenticated application pages
|
|
192
210
|
* @returns TypeScript/JSX content for app/(dashboard)/layout.tsx
|
|
193
211
|
*/
|
|
212
|
+
function generateDashboardLayoutNoAuth() {
|
|
213
|
+
return `// @chimerai component=DashboardLayoutNoAuth version=1.0
|
|
214
|
+
'use client';
|
|
215
|
+
|
|
216
|
+
import { useState } from 'react';
|
|
217
|
+
import Link from 'next/link';
|
|
218
|
+
import { useAppName } from '@/lib/use-app-name';
|
|
219
|
+
|
|
220
|
+
export default function DashboardLayout({
|
|
221
|
+
children,
|
|
222
|
+
}: {
|
|
223
|
+
children: React.ReactNode;
|
|
224
|
+
}) {
|
|
225
|
+
const [sidebarOpen, setSidebarOpen] = useState(false);
|
|
226
|
+
const appName = useAppName();
|
|
227
|
+
|
|
228
|
+
return (
|
|
229
|
+
<div className="flex min-h-screen bg-white dark:bg-gray-900">
|
|
230
|
+
<button
|
|
231
|
+
onClick={() => setSidebarOpen(!sidebarOpen)}
|
|
232
|
+
className="fixed top-4 left-4 z-50 md:hidden p-2 rounded-lg bg-gray-100 dark:bg-gray-800 shadow"
|
|
233
|
+
aria-label="Toggle menu"
|
|
234
|
+
>
|
|
235
|
+
<svg className="h-5 w-5 dark:text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
236
|
+
{sidebarOpen ? (
|
|
237
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
|
|
238
|
+
) : (
|
|
239
|
+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 6h16M4 12h16M4 18h16" />
|
|
240
|
+
)}
|
|
241
|
+
</svg>
|
|
242
|
+
</button>
|
|
243
|
+
{sidebarOpen && (
|
|
244
|
+
<div className="fixed inset-0 z-30 bg-black/50 md:hidden" onClick={() => setSidebarOpen(false)} />
|
|
245
|
+
)}
|
|
246
|
+
<aside className={\`fixed z-40 inset-y-0 left-0 w-64 border-r border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 p-4 flex flex-col transform transition-transform duration-200 ease-in-out md:relative md:translate-x-0 \${sidebarOpen ? 'translate-x-0' : '-translate-x-full'}\`}>
|
|
247
|
+
<div className="mb-4 mt-12 md:mt-0">
|
|
248
|
+
<h2 className="text-lg font-bold dark:text-white">{appName}</h2>
|
|
249
|
+
</div>
|
|
250
|
+
<nav className="space-y-2 flex-1">
|
|
251
|
+
<Link href="/dashboard" onClick={() => setSidebarOpen(false)} className="block px-4 py-2 rounded hover:bg-gray-200 dark:hover:bg-gray-700 dark:text-gray-200">
|
|
252
|
+
Dashboard
|
|
253
|
+
</Link>
|
|
254
|
+
<Link href="/chat" onClick={() => setSidebarOpen(false)} className="block px-4 py-2 rounded hover:bg-gray-200 dark:hover:bg-gray-700 dark:text-gray-200">
|
|
255
|
+
💬 Chat
|
|
256
|
+
</Link>
|
|
257
|
+
<Link href="/dashboard/providers" onClick={() => setSidebarOpen(false)} className="block px-4 py-2 rounded hover:bg-gray-200 dark:hover:bg-gray-700 dark:text-gray-200">
|
|
258
|
+
🔌 AI Providers
|
|
259
|
+
</Link>
|
|
260
|
+
</nav>
|
|
261
|
+
<div className="border-t border-gray-200 dark:border-gray-700 pt-3 text-xs text-gray-400 px-2">
|
|
262
|
+
<code>chimerai add auth</code> to add login
|
|
263
|
+
</div>
|
|
264
|
+
</aside>
|
|
265
|
+
<main className="flex-1 p-8 pt-16 md:pt-8 dark:text-white">
|
|
266
|
+
{children}
|
|
267
|
+
</main>
|
|
268
|
+
</div>
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
`;
|
|
272
|
+
}
|
|
273
|
+
function generateDashboardPageNoAuth(features = []) {
|
|
274
|
+
const links = [
|
|
275
|
+
` { href: '/chat', label: 'Chat', icon: '💬', description: 'AI-powered chat conversations' },`,
|
|
276
|
+
` { href: '/dashboard/providers', label: 'AI Providers', icon: '🔌', description: 'Manage AI model providers and API keys' },`,
|
|
277
|
+
];
|
|
278
|
+
if (features.includes('prompts')) {
|
|
279
|
+
links.push(` { href: '/dashboard/prompts', label: 'Prompt Templates', icon: '📝', description: 'Create and manage system prompts' },`);
|
|
280
|
+
}
|
|
281
|
+
return `// @chimerai component=DashboardPageNoAuth version=1.0
|
|
282
|
+
'use client';
|
|
283
|
+
|
|
284
|
+
import Link from 'next/link';
|
|
285
|
+
|
|
286
|
+
export default function DashboardPage() {
|
|
287
|
+
const links = [
|
|
288
|
+
${links.join('\n')}
|
|
289
|
+
];
|
|
290
|
+
|
|
291
|
+
return (
|
|
292
|
+
<div className="container mx-auto py-8 px-4">
|
|
293
|
+
<div className="mb-8">
|
|
294
|
+
<h1 className="text-3xl font-bold mb-2 dark:text-white">Dashboard</h1>
|
|
295
|
+
<p className="text-gray-600 dark:text-gray-400">Your ChimerAI Application</p>
|
|
296
|
+
</div>
|
|
297
|
+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
|
298
|
+
{links.map((link) => (
|
|
299
|
+
<Link
|
|
300
|
+
key={link.href}
|
|
301
|
+
href={link.href}
|
|
302
|
+
className="block p-6 bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 shadow-sm hover:shadow-md hover:border-blue-300 dark:hover:border-blue-600 transition-all"
|
|
303
|
+
>
|
|
304
|
+
<div className="text-3xl mb-3">{link.icon}</div>
|
|
305
|
+
<h2 className="text-xl font-semibold mb-2 dark:text-white">{link.label}</h2>
|
|
306
|
+
<p className="text-gray-600 dark:text-gray-400 text-sm">{link.description}</p>
|
|
307
|
+
</Link>
|
|
308
|
+
))}
|
|
309
|
+
</div>
|
|
310
|
+
<p className="mt-8 text-sm text-gray-400">
|
|
311
|
+
Run <code className="bg-gray-100 dark:bg-gray-700 px-1 rounded">chimerai add auth</code> to enable authentication.
|
|
312
|
+
</p>
|
|
313
|
+
</div>
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
`;
|
|
317
|
+
}
|
|
194
318
|
function generateDashboardLayout() {
|
|
195
319
|
return `// @chimerai component=DashboardLayout version=1.2
|
|
196
320
|
'use client';
|
package/package.json
CHANGED