agentstudio 0.1.0
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/.env +15 -0
- package/README.md +85 -0
- package/dist/bin/agentstudio.d.ts +3 -0
- package/dist/bin/agentstudio.d.ts.map +1 -0
- package/dist/bin/agentstudio.js +141 -0
- package/dist/bin/agentstudio.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +87 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/auth.d.ts +7 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +21 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/routes/agents.d.ts +4 -0
- package/dist/routes/agents.d.ts.map +1 -0
- package/dist/routes/agents.js +804 -0
- package/dist/routes/agents.js.map +1 -0
- package/dist/routes/auth.d.ts +4 -0
- package/dist/routes/auth.d.ts.map +1 -0
- package/dist/routes/auth.js +60 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/files.d.ts +4 -0
- package/dist/routes/files.d.ts.map +1 -0
- package/dist/routes/files.js +301 -0
- package/dist/routes/files.js.map +1 -0
- package/dist/routes/mcp.d.ts +4 -0
- package/dist/routes/mcp.d.ts.map +1 -0
- package/dist/routes/mcp.js +652 -0
- package/dist/routes/mcp.js.map +1 -0
- package/dist/routes/media.d.ts +5 -0
- package/dist/routes/media.d.ts.map +1 -0
- package/dist/routes/media.js +117 -0
- package/dist/routes/media.js.map +1 -0
- package/dist/routes/slides.d.ts +4 -0
- package/dist/routes/slides.d.ts.map +1 -0
- package/dist/routes/slides.js +146 -0
- package/dist/routes/slides.js.map +1 -0
- package/dist/services/claudeSession.d.ts +83 -0
- package/dist/services/claudeSession.d.ts.map +1 -0
- package/dist/services/claudeSession.js +255 -0
- package/dist/services/claudeSession.js.map +1 -0
- package/dist/services/messageQueue.d.ts +31 -0
- package/dist/services/messageQueue.d.ts.map +1 -0
- package/dist/services/messageQueue.js +67 -0
- package/dist/services/messageQueue.js.map +1 -0
- package/dist/services/sessionManager.d.ts +132 -0
- package/dist/services/sessionManager.d.ts.map +1 -0
- package/dist/services/sessionManager.js +439 -0
- package/dist/services/sessionManager.js.map +1 -0
- package/dist/types/claude-history.d.ts +48 -0
- package/dist/types/claude-history.d.ts.map +1 -0
- package/dist/types/claude-history.js +2 -0
- package/dist/types/claude-history.js.map +1 -0
- package/dist/types/claude-versions.d.ts +31 -0
- package/dist/types/claude-versions.d.ts.map +1 -0
- package/dist/types/claude-versions.js +2 -0
- package/dist/types/claude-versions.js.map +1 -0
- package/dist/types/commands.d.ts +32 -0
- package/dist/types/commands.d.ts.map +1 -0
- package/dist/types/commands.js +2 -0
- package/dist/types/commands.js.map +1 -0
- package/dist/types/index.d.ts +81 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +150 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/subagents.d.ts +88 -0
- package/dist/types/subagents.d.ts.map +1 -0
- package/dist/types/subagents.js +2 -0
- package/dist/types/subagents.js.map +1 -0
- package/dist/utils/agentStorage.d.ts +19 -0
- package/dist/utils/agentStorage.d.ts.map +1 -0
- package/dist/utils/agentStorage.js +110 -0
- package/dist/utils/agentStorage.js.map +1 -0
- package/dist/utils/claudeVersionStorage.d.ts +33 -0
- package/dist/utils/claudeVersionStorage.d.ts.map +1 -0
- package/dist/utils/claudeVersionStorage.js +168 -0
- package/dist/utils/claudeVersionStorage.js.map +1 -0
- package/dist/utils/jwt.d.ts +15 -0
- package/dist/utils/jwt.d.ts.map +1 -0
- package/dist/utils/jwt.js +28 -0
- package/dist/utils/jwt.js.map +1 -0
- package/dist/utils/projectMetadataStorage.d.ts +21 -0
- package/dist/utils/projectMetadataStorage.d.ts.map +1 -0
- package/dist/utils/projectMetadataStorage.js +68 -0
- package/dist/utils/projectMetadataStorage.js.map +1 -0
- package/frontend/dist/index.html +86 -0
- package/package.json +66 -0
- package/src/bin/agentstudio.ts +161 -0
- package/src/index.ts +100 -0
- package/src/middleware/auth.ts +26 -0
- package/src/routes/agents.ts +885 -0
- package/src/routes/auth.ts +73 -0
- package/src/routes/commands.ts.bak +441 -0
- package/src/routes/files.ts +352 -0
- package/src/routes/mcp.ts +751 -0
- package/src/routes/media.ts +140 -0
- package/src/routes/projects.ts.bak +601 -0
- package/src/routes/sessions.ts.bak +809 -0
- package/src/routes/settings.ts.bak +718 -0
- package/src/routes/slides.ts +170 -0
- package/src/routes/subagents.ts.bak +364 -0
- package/src/services/claudeSession.ts +293 -0
- package/src/services/messageQueue.ts +71 -0
- package/src/services/sessionManager.ts +532 -0
- package/src/types/claude-history.ts +50 -0
- package/src/types/claude-versions.ts +33 -0
- package/src/types/commands.ts +35 -0
- package/src/types/index.ts +248 -0
- package/src/types/subagents.ts +106 -0
- package/src/utils/agentStorage.ts +126 -0
- package/src/utils/claudeVersionStorage.ts +199 -0
- package/src/utils/jwt.ts +36 -0
- package/src/utils/projectMetadataStorage.ts +86 -0
- package/tsconfig.json +26 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
5
|
+
const __dirname = path.dirname(__filename);
|
|
6
|
+
export class ClaudeVersionStorage {
|
|
7
|
+
dataDir;
|
|
8
|
+
constructor(dataDir) {
|
|
9
|
+
this.dataDir = dataDir || path.join(__dirname, '../../data/claude-versions');
|
|
10
|
+
}
|
|
11
|
+
getVersionsPath() {
|
|
12
|
+
return path.join(this.dataDir, 'versions.json');
|
|
13
|
+
}
|
|
14
|
+
async saveVersions(versions) {
|
|
15
|
+
await fs.ensureDir(this.dataDir);
|
|
16
|
+
const versionsPath = this.getVersionsPath();
|
|
17
|
+
await fs.writeJson(versionsPath, versions, { spaces: 2 });
|
|
18
|
+
}
|
|
19
|
+
async loadVersions() {
|
|
20
|
+
const versionsPath = this.getVersionsPath();
|
|
21
|
+
try {
|
|
22
|
+
if (await fs.pathExists(versionsPath)) {
|
|
23
|
+
return await fs.readJson(versionsPath);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
console.error('Error loading Claude versions:', error);
|
|
28
|
+
}
|
|
29
|
+
// Return default versions if file doesn't exist
|
|
30
|
+
const now = new Date().toISOString();
|
|
31
|
+
return [
|
|
32
|
+
{
|
|
33
|
+
id: 'claude-3-5-sonnet-20241022',
|
|
34
|
+
name: 'Claude 3.5 Sonnet',
|
|
35
|
+
model: 'claude-3-5-sonnet-20241022',
|
|
36
|
+
description: 'Latest Claude 3.5 Sonnet model',
|
|
37
|
+
isDefault: true,
|
|
38
|
+
executablePath: '',
|
|
39
|
+
environmentVariables: {},
|
|
40
|
+
alias: 'claude-3-5-sonnet',
|
|
41
|
+
createdAt: now,
|
|
42
|
+
updatedAt: now
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: 'claude-3-opus-20240229',
|
|
46
|
+
name: 'Claude 3 Opus',
|
|
47
|
+
model: 'claude-3-opus-20240229',
|
|
48
|
+
description: 'Claude 3 Opus model',
|
|
49
|
+
isDefault: false,
|
|
50
|
+
executablePath: '',
|
|
51
|
+
environmentVariables: {},
|
|
52
|
+
alias: 'claude-3-opus',
|
|
53
|
+
createdAt: now,
|
|
54
|
+
updatedAt: now
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: 'claude-3-sonnet-20240229',
|
|
58
|
+
name: 'Claude 3 Sonnet',
|
|
59
|
+
model: 'claude-3-sonnet-20240229',
|
|
60
|
+
description: 'Claude 3 Sonnet model',
|
|
61
|
+
isDefault: false,
|
|
62
|
+
executablePath: '',
|
|
63
|
+
environmentVariables: {},
|
|
64
|
+
alias: 'claude-3-sonnet',
|
|
65
|
+
createdAt: now,
|
|
66
|
+
updatedAt: now
|
|
67
|
+
}
|
|
68
|
+
];
|
|
69
|
+
}
|
|
70
|
+
async getDefaultVersionId() {
|
|
71
|
+
const versions = await this.loadVersions();
|
|
72
|
+
const defaultVersion = versions.find(v => v.isDefault);
|
|
73
|
+
return defaultVersion?.id || versions[0]?.id || 'claude-3-5-sonnet-20241022';
|
|
74
|
+
}
|
|
75
|
+
async setDefaultVersion(versionId) {
|
|
76
|
+
const versions = await this.loadVersions();
|
|
77
|
+
const updatedVersions = versions.map(v => ({
|
|
78
|
+
...v,
|
|
79
|
+
isDefault: v.id === versionId
|
|
80
|
+
}));
|
|
81
|
+
await this.saveVersions(updatedVersions);
|
|
82
|
+
}
|
|
83
|
+
async createVersion(version) {
|
|
84
|
+
const versions = await this.loadVersions();
|
|
85
|
+
const now = new Date().toISOString();
|
|
86
|
+
const newVersion = {
|
|
87
|
+
...version,
|
|
88
|
+
id: `custom-${Date.now()}`,
|
|
89
|
+
createdAt: now,
|
|
90
|
+
updatedAt: now
|
|
91
|
+
};
|
|
92
|
+
versions.push(newVersion);
|
|
93
|
+
await this.saveVersions(versions);
|
|
94
|
+
return newVersion;
|
|
95
|
+
}
|
|
96
|
+
async updateVersion(versionId, updates) {
|
|
97
|
+
const versions = await this.loadVersions();
|
|
98
|
+
const versionIndex = versions.findIndex(v => v.id === versionId);
|
|
99
|
+
if (versionIndex === -1)
|
|
100
|
+
return null;
|
|
101
|
+
versions[versionIndex] = {
|
|
102
|
+
...versions[versionIndex],
|
|
103
|
+
...updates,
|
|
104
|
+
updatedAt: new Date().toISOString()
|
|
105
|
+
};
|
|
106
|
+
await this.saveVersions(versions);
|
|
107
|
+
return versions[versionIndex];
|
|
108
|
+
}
|
|
109
|
+
async deleteVersion(versionId) {
|
|
110
|
+
const versions = await this.loadVersions();
|
|
111
|
+
const filteredVersions = versions.filter(v => v.id !== versionId);
|
|
112
|
+
if (filteredVersions.length === versions.length)
|
|
113
|
+
return false;
|
|
114
|
+
await this.saveVersions(filteredVersions);
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
async initializeSystemVersion() {
|
|
118
|
+
const versions = await this.loadVersions();
|
|
119
|
+
// Ensure at least one version exists
|
|
120
|
+
if (versions.length === 0) {
|
|
121
|
+
const now = new Date().toISOString();
|
|
122
|
+
await this.saveVersions([
|
|
123
|
+
{
|
|
124
|
+
id: 'claude-3-5-sonnet-20241022',
|
|
125
|
+
name: 'Claude 3.5 Sonnet',
|
|
126
|
+
model: 'claude-3-5-sonnet-20241022',
|
|
127
|
+
description: 'Latest Claude 3.5 Sonnet model',
|
|
128
|
+
isDefault: true,
|
|
129
|
+
executablePath: '',
|
|
130
|
+
environmentVariables: {},
|
|
131
|
+
alias: 'claude-3-5-sonnet',
|
|
132
|
+
createdAt: now,
|
|
133
|
+
updatedAt: now
|
|
134
|
+
}
|
|
135
|
+
]);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Export singleton functions for backward compatibility
|
|
140
|
+
export const getAllVersions = async () => {
|
|
141
|
+
const storage = new ClaudeVersionStorage();
|
|
142
|
+
return storage.loadVersions();
|
|
143
|
+
};
|
|
144
|
+
export const getDefaultVersionId = async () => {
|
|
145
|
+
const storage = new ClaudeVersionStorage();
|
|
146
|
+
return storage.getDefaultVersionId();
|
|
147
|
+
};
|
|
148
|
+
export const setDefaultVersion = async (versionId) => {
|
|
149
|
+
const storage = new ClaudeVersionStorage();
|
|
150
|
+
return storage.setDefaultVersion(versionId);
|
|
151
|
+
};
|
|
152
|
+
export const createVersion = async (version) => {
|
|
153
|
+
const storage = new ClaudeVersionStorage();
|
|
154
|
+
return storage.createVersion(version);
|
|
155
|
+
};
|
|
156
|
+
export const updateVersion = async (versionId, updates) => {
|
|
157
|
+
const storage = new ClaudeVersionStorage();
|
|
158
|
+
return storage.updateVersion(versionId, updates);
|
|
159
|
+
};
|
|
160
|
+
export const deleteVersion = async (versionId) => {
|
|
161
|
+
const storage = new ClaudeVersionStorage();
|
|
162
|
+
return storage.deleteVersion(versionId);
|
|
163
|
+
};
|
|
164
|
+
export const initializeSystemVersion = async () => {
|
|
165
|
+
const storage = new ClaudeVersionStorage();
|
|
166
|
+
return storage.initializeSystemVersion();
|
|
167
|
+
};
|
|
168
|
+
//# sourceMappingURL=claudeVersionStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claudeVersionStorage.js","sourceRoot":"","sources":["../../src/utils/claudeVersionStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAe3C,MAAM,OAAO,oBAAoB;IACvB,OAAO,CAAS;IAExB,YAAY,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,4BAA4B,CAAC,CAAC;IAC/E,CAAC;IAEO,eAAe;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAyB;QAC1C,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBACtC,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;QACzD,CAAC;QAED,gDAAgD;QAChD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,OAAO;YACL;gBACE,EAAE,EAAE,4BAA4B;gBAChC,IAAI,EAAE,mBAAmB;gBACzB,KAAK,EAAE,4BAA4B;gBACnC,WAAW,EAAE,gCAAgC;gBAC7C,SAAS,EAAE,IAAI;gBACf,cAAc,EAAE,EAAE;gBAClB,oBAAoB,EAAE,EAAE;gBACxB,KAAK,EAAE,mBAAmB;gBAC1B,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,GAAG;aACf;YACD;gBACE,EAAE,EAAE,wBAAwB;gBAC5B,IAAI,EAAE,eAAe;gBACrB,KAAK,EAAE,wBAAwB;gBAC/B,WAAW,EAAE,qBAAqB;gBAClC,SAAS,EAAE,KAAK;gBAChB,cAAc,EAAE,EAAE;gBAClB,oBAAoB,EAAE,EAAE;gBACxB,KAAK,EAAE,eAAe;gBACtB,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,GAAG;aACf;YACD;gBACE,EAAE,EAAE,0BAA0B;gBAC9B,IAAI,EAAE,iBAAiB;gBACvB,KAAK,EAAE,0BAA0B;gBACjC,WAAW,EAAE,uBAAuB;gBACpC,SAAS,EAAE,KAAK;gBAChB,cAAc,EAAE,EAAE;gBAClB,oBAAoB,EAAE,EAAE;gBACxB,KAAK,EAAE,iBAAiB;gBACxB,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,GAAG;aACf;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACvD,OAAO,cAAc,EAAE,EAAE,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,4BAA4B,CAAC;IAC/E,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,SAAiB;QACvC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,eAAe,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACzC,GAAG,CAAC;YACJ,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,SAAS;SAC9B,CAAC,CAAC,CAAC;QACJ,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAA8D;QAChF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,UAAU,GAAkB;YAChC,GAAG,OAAO;YACV,EAAE,EAAE,UAAU,IAAI,CAAC,GAAG,EAAE,EAAE;YAC1B,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;SACf,CAAC;QACF,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1B,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,OAA+B;QACpE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QACjE,IAAI,YAAY,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAErC,QAAQ,CAAC,YAAY,CAAC,GAAG;YACvB,GAAG,QAAQ,CAAC,YAAY,CAAC;YACzB,GAAG,OAAO;YACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QACF,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,QAAQ,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAAiB;QACnC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QAClE,IAAI,gBAAgB,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAE9D,MAAM,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,uBAAuB;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,qCAAqC;QACrC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,IAAI,CAAC,YAAY,CAAC;gBACtB;oBACE,EAAE,EAAE,4BAA4B;oBAChC,IAAI,EAAE,mBAAmB;oBACzB,KAAK,EAAE,4BAA4B;oBACnC,WAAW,EAAE,gCAAgC;oBAC7C,SAAS,EAAE,IAAI;oBACf,cAAc,EAAE,EAAE;oBAClB,oBAAoB,EAAE,EAAE;oBACxB,KAAK,EAAE,mBAAmB;oBAC1B,SAAS,EAAE,GAAG;oBACd,SAAS,EAAE,GAAG;iBACf;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF;AAED,wDAAwD;AACxD,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,IAA8B,EAAE;IACjE,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC3C,OAAO,OAAO,CAAC,YAAY,EAAE,CAAC;AAChC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,IAAqB,EAAE;IAC7D,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC3C,OAAO,OAAO,CAAC,mBAAmB,EAAE,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,SAAiB,EAAiB,EAAE;IAC1E,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC3C,OAAO,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,OAA8D,EAA0B,EAAE;IAC5H,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC3C,OAAO,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,SAAiB,EAAE,OAA+B,EAAiC,EAAE;IACvH,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC3C,OAAO,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,SAAiB,EAAoB,EAAE;IACzE,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC3C,OAAO,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,IAAmB,EAAE;IAC/D,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC3C,OAAO,OAAO,CAAC,uBAAuB,EAAE,CAAC;AAC3C,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface JWTPayload {
|
|
2
|
+
authenticated: true;
|
|
3
|
+
iat?: number;
|
|
4
|
+
exp?: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Generate a JWT token for authentication
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateToken(): string;
|
|
10
|
+
/**
|
|
11
|
+
* Verify and decode a JWT token
|
|
12
|
+
* @returns Decoded payload if valid, null if invalid
|
|
13
|
+
*/
|
|
14
|
+
export declare function verifyToken(token: string): JWTPayload | null;
|
|
15
|
+
//# sourceMappingURL=jwt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/utils/jwt.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,IAAI,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAQtC;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAO5D"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import jwt from 'jsonwebtoken';
|
|
2
|
+
const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key-change-this-in-production';
|
|
3
|
+
const JWT_EXPIRES_IN = process.env.JWT_EXPIRES_IN || '7d';
|
|
4
|
+
/**
|
|
5
|
+
* Generate a JWT token for authentication
|
|
6
|
+
*/
|
|
7
|
+
export function generateToken() {
|
|
8
|
+
const payload = {
|
|
9
|
+
authenticated: true,
|
|
10
|
+
};
|
|
11
|
+
return jwt.sign(payload, JWT_SECRET, {
|
|
12
|
+
expiresIn: JWT_EXPIRES_IN,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Verify and decode a JWT token
|
|
17
|
+
* @returns Decoded payload if valid, null if invalid
|
|
18
|
+
*/
|
|
19
|
+
export function verifyToken(token) {
|
|
20
|
+
try {
|
|
21
|
+
const decoded = jwt.verify(token, JWT_SECRET);
|
|
22
|
+
return decoded;
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=jwt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../src/utils/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,cAAc,CAAC;AAE/B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,2CAA2C,CAAC;AACzF,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC;AAQ1D;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAe;QAC1B,aAAa,EAAE,IAAI;KACpB,CAAC;IAEF,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE;QACnC,SAAS,EAAE,cAAc;KACP,CAAC,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAe,CAAC;QAC5D,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface ProjectMetadata {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
path: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
createdAt: string;
|
|
7
|
+
updatedAt: string;
|
|
8
|
+
agents: string[];
|
|
9
|
+
customData?: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
export declare class ProjectMetadataStorage {
|
|
12
|
+
private dataDir;
|
|
13
|
+
constructor(dataDir?: string);
|
|
14
|
+
private getProjectPath;
|
|
15
|
+
saveProject(project: ProjectMetadata): Promise<void>;
|
|
16
|
+
loadProject(projectId: string): Promise<ProjectMetadata | null>;
|
|
17
|
+
deleteProject(projectId: string): Promise<void>;
|
|
18
|
+
listProjects(): Promise<ProjectMetadata[]>;
|
|
19
|
+
projectExists(projectId: string): Promise<boolean>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=projectMetadataStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectMetadataStorage.d.ts","sourceRoot":"","sources":["../../src/utils/projectMetadataStorage.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,CAAC,EAAE,MAAM;IAI5B,OAAO,CAAC,cAAc;IAIhB,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpD,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAY/D,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY/C,YAAY,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAsB1C,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAIzD"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
5
|
+
const __dirname = path.dirname(__filename);
|
|
6
|
+
export class ProjectMetadataStorage {
|
|
7
|
+
dataDir;
|
|
8
|
+
constructor(dataDir) {
|
|
9
|
+
this.dataDir = dataDir || path.join(__dirname, '../../data/projects');
|
|
10
|
+
}
|
|
11
|
+
getProjectPath(projectId) {
|
|
12
|
+
return path.join(this.dataDir, `${projectId}.json`);
|
|
13
|
+
}
|
|
14
|
+
async saveProject(project) {
|
|
15
|
+
await fs.ensureDir(this.dataDir);
|
|
16
|
+
const projectPath = this.getProjectPath(project.id);
|
|
17
|
+
await fs.writeJson(projectPath, project, { spaces: 2 });
|
|
18
|
+
}
|
|
19
|
+
async loadProject(projectId) {
|
|
20
|
+
const projectPath = this.getProjectPath(projectId);
|
|
21
|
+
try {
|
|
22
|
+
if (await fs.pathExists(projectPath)) {
|
|
23
|
+
return await fs.readJson(projectPath);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
console.error(`Error loading project ${projectId}:`, error);
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
async deleteProject(projectId) {
|
|
32
|
+
const projectPath = this.getProjectPath(projectId);
|
|
33
|
+
try {
|
|
34
|
+
if (await fs.pathExists(projectPath)) {
|
|
35
|
+
await fs.remove(projectPath);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
console.error(`Error deleting project ${projectId}:`, error);
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async listProjects() {
|
|
44
|
+
await fs.ensureDir(this.dataDir);
|
|
45
|
+
const files = await fs.readdir(this.dataDir);
|
|
46
|
+
const projects = [];
|
|
47
|
+
for (const file of files) {
|
|
48
|
+
if (file.endsWith('.json')) {
|
|
49
|
+
const projectId = path.basename(file, '.json');
|
|
50
|
+
try {
|
|
51
|
+
const project = await this.loadProject(projectId);
|
|
52
|
+
if (project) {
|
|
53
|
+
projects.push(project);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
console.error(`Error loading project from file ${file}:`, error);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return projects;
|
|
62
|
+
}
|
|
63
|
+
async projectExists(projectId) {
|
|
64
|
+
const projectPath = this.getProjectPath(projectId);
|
|
65
|
+
return await fs.pathExists(projectPath);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=projectMetadataStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectMetadataStorage.js","sourceRoot":"","sources":["../../src/utils/projectMetadataStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>AgentStudio</title>
|
|
7
|
+
<style>
|
|
8
|
+
body {
|
|
9
|
+
margin: 0;
|
|
10
|
+
padding: 0;
|
|
11
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
12
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
13
|
+
height: 100vh;
|
|
14
|
+
display: flex;
|
|
15
|
+
align-items: center;
|
|
16
|
+
justify-content: center;
|
|
17
|
+
color: white;
|
|
18
|
+
}
|
|
19
|
+
.container {
|
|
20
|
+
text-align: center;
|
|
21
|
+
max-width: 600px;
|
|
22
|
+
padding: 2rem;
|
|
23
|
+
}
|
|
24
|
+
.logo {
|
|
25
|
+
font-size: 3rem;
|
|
26
|
+
margin-bottom: 1rem;
|
|
27
|
+
}
|
|
28
|
+
h1 {
|
|
29
|
+
font-size: 2.5rem;
|
|
30
|
+
margin-bottom: 1rem;
|
|
31
|
+
font-weight: 700;
|
|
32
|
+
}
|
|
33
|
+
p {
|
|
34
|
+
font-size: 1.2rem;
|
|
35
|
+
margin-bottom: 2rem;
|
|
36
|
+
opacity: 0.9;
|
|
37
|
+
}
|
|
38
|
+
.status {
|
|
39
|
+
background: rgba(255, 255, 255, 0.1);
|
|
40
|
+
padding: 1rem;
|
|
41
|
+
border-radius: 8px;
|
|
42
|
+
margin: 1rem 0;
|
|
43
|
+
}
|
|
44
|
+
.actions {
|
|
45
|
+
margin-top: 2rem;
|
|
46
|
+
}
|
|
47
|
+
.btn {
|
|
48
|
+
background: white;
|
|
49
|
+
color: #667eea;
|
|
50
|
+
border: none;
|
|
51
|
+
padding: 0.75rem 1.5rem;
|
|
52
|
+
border-radius: 6px;
|
|
53
|
+
font-size: 1rem;
|
|
54
|
+
font-weight: 600;
|
|
55
|
+
cursor: pointer;
|
|
56
|
+
margin: 0 0.5rem;
|
|
57
|
+
transition: all 0.3s ease;
|
|
58
|
+
}
|
|
59
|
+
.btn:hover {
|
|
60
|
+
transform: translateY(-2px);
|
|
61
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
|
|
62
|
+
}
|
|
63
|
+
</style>
|
|
64
|
+
</head>
|
|
65
|
+
<body>
|
|
66
|
+
<div class="container">
|
|
67
|
+
<div class="logo">🤖</div>
|
|
68
|
+
<h1>AgentStudio</h1>
|
|
69
|
+
<p>AI-powered presentation editor with Claude integration</p>
|
|
70
|
+
|
|
71
|
+
<div class="status">
|
|
72
|
+
<strong>Backend Status:</strong> Running on port 4936
|
|
73
|
+
</div>
|
|
74
|
+
|
|
75
|
+
<div class="actions">
|
|
76
|
+
<button class="btn" onclick="window.open('/api/health', '_blank')">Check API Health</button>
|
|
77
|
+
<button class="btn" onclick="window.open('https://github.com/jeffkit/agentstudio', '_blank')">View Documentation</button>
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
<div style="margin-top: 2rem; font-size: 0.9rem; opacity: 0.7;">
|
|
81
|
+
<p>Full frontend interface will be available in future releases.</p>
|
|
82
|
+
<p>For now, use the API endpoints directly or check the documentation.</p>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
</body>
|
|
86
|
+
</html>
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agentstudio",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Claude-powered AgentStudio - AI-powered presentation editor with Claude integration",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"agentstudio": "./dist/bin/agentstudio.js"
|
|
9
|
+
},
|
|
10
|
+
"author": "jeffkit <bbmyth@gmail.com>",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "https://github.com/jeffkit/agentstudio.git"
|
|
15
|
+
},
|
|
16
|
+
"homepage": "https://github.com/jeffkit/agentstudio#readme",
|
|
17
|
+
"bugs": {
|
|
18
|
+
"url": "https://github.com/jeffkit/agentstudio/issues"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"agentstudio",
|
|
22
|
+
"ai",
|
|
23
|
+
"claude",
|
|
24
|
+
"presentation",
|
|
25
|
+
"editor",
|
|
26
|
+
"agent",
|
|
27
|
+
"studio"
|
|
28
|
+
],
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=18.0.0"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"dev": "node --import tsx/esm --watch src/index.ts",
|
|
34
|
+
"build": "tsc",
|
|
35
|
+
"start": "node dist/index.js",
|
|
36
|
+
"type-check": "tsc --noEmit",
|
|
37
|
+
"prepublishOnly": "npm run build"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@ai-sdk/anthropic": "^1.0.5",
|
|
41
|
+
"@ai-sdk/openai": "^1.0.7",
|
|
42
|
+
"@anthropic-ai/claude-code": "^2.0.10",
|
|
43
|
+
"ai": "^5.0.22",
|
|
44
|
+
"cors": "^2.8.5",
|
|
45
|
+
"dotenv": "^16.3.1",
|
|
46
|
+
"eventsource": "^4.0.0",
|
|
47
|
+
"express": "^4.18.2",
|
|
48
|
+
"fs-extra": "^11.1.1",
|
|
49
|
+
"gray-matter": "^4.0.3",
|
|
50
|
+
"helmet": "^7.0.0",
|
|
51
|
+
"jsonwebtoken": "^9.0.2",
|
|
52
|
+
"zod": "^3.22.2",
|
|
53
|
+
"commander": "^11.1.0",
|
|
54
|
+
"concurrently": "^8.2.2"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@types/cors": "^2.8.13",
|
|
58
|
+
"@types/express": "^4.17.17",
|
|
59
|
+
"@types/fs-extra": "^11.0.1",
|
|
60
|
+
"@types/jsonwebtoken": "^9.0.10",
|
|
61
|
+
"@types/node": "^20.5.0",
|
|
62
|
+
"ts-node": "^10.9.2",
|
|
63
|
+
"tsx": "^4.20.6",
|
|
64
|
+
"typescript": "^5.1.6"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { program } from 'commander';
|
|
4
|
+
import { startServer } from '../index.js';
|
|
5
|
+
import { spawn } from 'child_process';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import { fileURLToPath } from 'url';
|
|
8
|
+
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = path.dirname(__filename);
|
|
11
|
+
|
|
12
|
+
program
|
|
13
|
+
.name('agentstudio')
|
|
14
|
+
.description('AgentStudio - AI-powered presentation editor with Claude integration')
|
|
15
|
+
.version('0.1.0');
|
|
16
|
+
|
|
17
|
+
// Start both frontend and backend
|
|
18
|
+
program
|
|
19
|
+
.command('start')
|
|
20
|
+
.description('Start both frontend and backend servers')
|
|
21
|
+
.option('-p, --port <port>', 'backend server port', '4936')
|
|
22
|
+
.option('-f, --frontend-port <port>', 'frontend server port', '3000')
|
|
23
|
+
.option('-h, --host <host>', 'server host', 'localhost')
|
|
24
|
+
.option('-c, --config <path>', 'path to config file')
|
|
25
|
+
.option('--env <path>', 'path to .env file')
|
|
26
|
+
.option('--no-auth', 'disable authentication (development only)')
|
|
27
|
+
.action(async (options) => {
|
|
28
|
+
console.log('🚀 Starting AgentStudio...');
|
|
29
|
+
|
|
30
|
+
// Start backend
|
|
31
|
+
process.env.PORT = options.port;
|
|
32
|
+
process.env.HOST = options.host;
|
|
33
|
+
|
|
34
|
+
if (options.env) {
|
|
35
|
+
process.env.ENV_PATH = options.env;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (options.config) {
|
|
39
|
+
process.env.CONFIG_PATH = options.config;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (options.noAuth) {
|
|
43
|
+
process.env.NO_AUTH = 'true';
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
await startServer();
|
|
48
|
+
console.log(`✅ Backend running on http://${options.host}:${options.port}`);
|
|
49
|
+
console.log(`✅ Frontend running on http://${options.host}:${options.frontendPort}`);
|
|
50
|
+
console.log('📖 Open your browser to http://localhost:3000 to start using AgentStudio');
|
|
51
|
+
} catch (error) {
|
|
52
|
+
console.error('❌ Failed to start AgentStudio:', error);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// Start backend only
|
|
58
|
+
program
|
|
59
|
+
.command('backend')
|
|
60
|
+
.description('Start backend server only')
|
|
61
|
+
.option('-p, --port <port>', 'server port', '4936')
|
|
62
|
+
.option('-h, --host <host>', 'server host', 'localhost')
|
|
63
|
+
.option('-c, --config <path>', 'path to config file')
|
|
64
|
+
.option('--env <path>', 'path to .env file')
|
|
65
|
+
.option('--no-auth', 'disable authentication (development only)')
|
|
66
|
+
.action(async (options) => {
|
|
67
|
+
console.log('🚀 Starting AgentStudio Backend...');
|
|
68
|
+
|
|
69
|
+
process.env.PORT = options.port;
|
|
70
|
+
process.env.HOST = options.host;
|
|
71
|
+
|
|
72
|
+
if (options.env) {
|
|
73
|
+
process.env.ENV_PATH = options.env;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (options.config) {
|
|
77
|
+
process.env.CONFIG_PATH = options.config;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (options.noAuth) {
|
|
81
|
+
process.env.NO_AUTH = 'true';
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
try {
|
|
85
|
+
await startServer();
|
|
86
|
+
console.log(`✅ Backend running on http://${options.host}:${options.port}`);
|
|
87
|
+
} catch (error) {
|
|
88
|
+
console.error('❌ Failed to start backend:', error);
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// Start frontend only (development mode)
|
|
94
|
+
program
|
|
95
|
+
.command('frontend')
|
|
96
|
+
.description('Start frontend development server only')
|
|
97
|
+
.option('-p, --port <port>', 'frontend server port', '3000')
|
|
98
|
+
.option('-h, --host <host>', 'server host', 'localhost')
|
|
99
|
+
.action((options) => {
|
|
100
|
+
console.log('🚀 Starting AgentStudio Frontend...');
|
|
101
|
+
|
|
102
|
+
const frontendDir = path.join(__dirname, '../../frontend');
|
|
103
|
+
|
|
104
|
+
const frontendProcess = spawn('npm', ['run', 'dev'], {
|
|
105
|
+
cwd: frontendDir,
|
|
106
|
+
stdio: 'inherit',
|
|
107
|
+
shell: true,
|
|
108
|
+
env: {
|
|
109
|
+
...process.env,
|
|
110
|
+
PORT: options.port,
|
|
111
|
+
HOST: options.host
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
frontendProcess.on('error', (error) => {
|
|
116
|
+
console.error('❌ Failed to start frontend:', error);
|
|
117
|
+
process.exit(1);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// Initialize configuration
|
|
122
|
+
program
|
|
123
|
+
.command('init')
|
|
124
|
+
.description('Initialize AgentStudio configuration')
|
|
125
|
+
.option('--env <path>', 'path to create .env file', '.env')
|
|
126
|
+
.action(async (options) => {
|
|
127
|
+
console.log('🔧 Initializing AgentStudio configuration...');
|
|
128
|
+
|
|
129
|
+
const fs = await import('fs-extra');
|
|
130
|
+
const path = await import('path');
|
|
131
|
+
|
|
132
|
+
const envPath = path.default.resolve(options.env);
|
|
133
|
+
const envContent = `# AgentStudio Configuration
|
|
134
|
+
# AI Provider (choose one)
|
|
135
|
+
OPENAI_API_KEY=your_openai_api_key_here
|
|
136
|
+
ANTHROPIC_API_KEY=your_anthropic_api_key_here
|
|
137
|
+
|
|
138
|
+
# Server Configuration
|
|
139
|
+
PORT=4936
|
|
140
|
+
NODE_ENV=production
|
|
141
|
+
|
|
142
|
+
# File System
|
|
143
|
+
SLIDES_DIR=./slides
|
|
144
|
+
|
|
145
|
+
# CORS Configuration (optional)
|
|
146
|
+
# Add custom origins for production deployments
|
|
147
|
+
CORS_ORIGINS=https://your-frontend.vercel.app,https://custom-domain.com
|
|
148
|
+
`;
|
|
149
|
+
|
|
150
|
+
try {
|
|
151
|
+
await fs.default.ensureFile(envPath);
|
|
152
|
+
await fs.default.writeFile(envPath, envContent);
|
|
153
|
+
console.log(`✅ Configuration file created: ${envPath}`);
|
|
154
|
+
console.log('📝 Please edit the .env file with your API keys and settings');
|
|
155
|
+
} catch (error) {
|
|
156
|
+
console.error('❌ Failed to create configuration file:', error);
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
program.parse();
|