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.
Files changed (115) hide show
  1. package/.env +15 -0
  2. package/README.md +85 -0
  3. package/dist/bin/agentstudio.d.ts +3 -0
  4. package/dist/bin/agentstudio.d.ts.map +1 -0
  5. package/dist/bin/agentstudio.js +141 -0
  6. package/dist/bin/agentstudio.js.map +1 -0
  7. package/dist/index.d.ts +2 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +87 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/middleware/auth.d.ts +7 -0
  12. package/dist/middleware/auth.d.ts.map +1 -0
  13. package/dist/middleware/auth.js +21 -0
  14. package/dist/middleware/auth.js.map +1 -0
  15. package/dist/routes/agents.d.ts +4 -0
  16. package/dist/routes/agents.d.ts.map +1 -0
  17. package/dist/routes/agents.js +804 -0
  18. package/dist/routes/agents.js.map +1 -0
  19. package/dist/routes/auth.d.ts +4 -0
  20. package/dist/routes/auth.d.ts.map +1 -0
  21. package/dist/routes/auth.js +60 -0
  22. package/dist/routes/auth.js.map +1 -0
  23. package/dist/routes/files.d.ts +4 -0
  24. package/dist/routes/files.d.ts.map +1 -0
  25. package/dist/routes/files.js +301 -0
  26. package/dist/routes/files.js.map +1 -0
  27. package/dist/routes/mcp.d.ts +4 -0
  28. package/dist/routes/mcp.d.ts.map +1 -0
  29. package/dist/routes/mcp.js +652 -0
  30. package/dist/routes/mcp.js.map +1 -0
  31. package/dist/routes/media.d.ts +5 -0
  32. package/dist/routes/media.d.ts.map +1 -0
  33. package/dist/routes/media.js +117 -0
  34. package/dist/routes/media.js.map +1 -0
  35. package/dist/routes/slides.d.ts +4 -0
  36. package/dist/routes/slides.d.ts.map +1 -0
  37. package/dist/routes/slides.js +146 -0
  38. package/dist/routes/slides.js.map +1 -0
  39. package/dist/services/claudeSession.d.ts +83 -0
  40. package/dist/services/claudeSession.d.ts.map +1 -0
  41. package/dist/services/claudeSession.js +255 -0
  42. package/dist/services/claudeSession.js.map +1 -0
  43. package/dist/services/messageQueue.d.ts +31 -0
  44. package/dist/services/messageQueue.d.ts.map +1 -0
  45. package/dist/services/messageQueue.js +67 -0
  46. package/dist/services/messageQueue.js.map +1 -0
  47. package/dist/services/sessionManager.d.ts +132 -0
  48. package/dist/services/sessionManager.d.ts.map +1 -0
  49. package/dist/services/sessionManager.js +439 -0
  50. package/dist/services/sessionManager.js.map +1 -0
  51. package/dist/types/claude-history.d.ts +48 -0
  52. package/dist/types/claude-history.d.ts.map +1 -0
  53. package/dist/types/claude-history.js +2 -0
  54. package/dist/types/claude-history.js.map +1 -0
  55. package/dist/types/claude-versions.d.ts +31 -0
  56. package/dist/types/claude-versions.d.ts.map +1 -0
  57. package/dist/types/claude-versions.js +2 -0
  58. package/dist/types/claude-versions.js.map +1 -0
  59. package/dist/types/commands.d.ts +32 -0
  60. package/dist/types/commands.d.ts.map +1 -0
  61. package/dist/types/commands.js +2 -0
  62. package/dist/types/commands.js.map +1 -0
  63. package/dist/types/index.d.ts +81 -0
  64. package/dist/types/index.d.ts.map +1 -0
  65. package/dist/types/index.js +150 -0
  66. package/dist/types/index.js.map +1 -0
  67. package/dist/types/subagents.d.ts +88 -0
  68. package/dist/types/subagents.d.ts.map +1 -0
  69. package/dist/types/subagents.js +2 -0
  70. package/dist/types/subagents.js.map +1 -0
  71. package/dist/utils/agentStorage.d.ts +19 -0
  72. package/dist/utils/agentStorage.d.ts.map +1 -0
  73. package/dist/utils/agentStorage.js +110 -0
  74. package/dist/utils/agentStorage.js.map +1 -0
  75. package/dist/utils/claudeVersionStorage.d.ts +33 -0
  76. package/dist/utils/claudeVersionStorage.d.ts.map +1 -0
  77. package/dist/utils/claudeVersionStorage.js +168 -0
  78. package/dist/utils/claudeVersionStorage.js.map +1 -0
  79. package/dist/utils/jwt.d.ts +15 -0
  80. package/dist/utils/jwt.d.ts.map +1 -0
  81. package/dist/utils/jwt.js +28 -0
  82. package/dist/utils/jwt.js.map +1 -0
  83. package/dist/utils/projectMetadataStorage.d.ts +21 -0
  84. package/dist/utils/projectMetadataStorage.d.ts.map +1 -0
  85. package/dist/utils/projectMetadataStorage.js +68 -0
  86. package/dist/utils/projectMetadataStorage.js.map +1 -0
  87. package/frontend/dist/index.html +86 -0
  88. package/package.json +66 -0
  89. package/src/bin/agentstudio.ts +161 -0
  90. package/src/index.ts +100 -0
  91. package/src/middleware/auth.ts +26 -0
  92. package/src/routes/agents.ts +885 -0
  93. package/src/routes/auth.ts +73 -0
  94. package/src/routes/commands.ts.bak +441 -0
  95. package/src/routes/files.ts +352 -0
  96. package/src/routes/mcp.ts +751 -0
  97. package/src/routes/media.ts +140 -0
  98. package/src/routes/projects.ts.bak +601 -0
  99. package/src/routes/sessions.ts.bak +809 -0
  100. package/src/routes/settings.ts.bak +718 -0
  101. package/src/routes/slides.ts +170 -0
  102. package/src/routes/subagents.ts.bak +364 -0
  103. package/src/services/claudeSession.ts +293 -0
  104. package/src/services/messageQueue.ts +71 -0
  105. package/src/services/sessionManager.ts +532 -0
  106. package/src/types/claude-history.ts +50 -0
  107. package/src/types/claude-versions.ts +33 -0
  108. package/src/types/commands.ts +35 -0
  109. package/src/types/index.ts +248 -0
  110. package/src/types/subagents.ts +106 -0
  111. package/src/utils/agentStorage.ts +126 -0
  112. package/src/utils/claudeVersionStorage.ts +199 -0
  113. package/src/utils/jwt.ts +36 -0
  114. package/src/utils/projectMetadataStorage.ts +86 -0
  115. 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":"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"}
@@ -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();