@agent-foundry/studio 1.0.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/README.md +96 -0
- package/dist/db/client.d.ts +59 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +51 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/deployments.d.ts +65 -0
- package/dist/db/deployments.d.ts.map +1 -0
- package/dist/db/deployments.js +249 -0
- package/dist/db/deployments.js.map +1 -0
- package/dist/db/index.d.ts +7 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +7 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/projects.d.ts +48 -0
- package/dist/db/projects.d.ts.map +1 -0
- package/dist/db/projects.js +192 -0
- package/dist/db/projects.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/oss/client.d.ts +65 -0
- package/dist/oss/client.d.ts.map +1 -0
- package/dist/oss/client.js +146 -0
- package/dist/oss/client.js.map +1 -0
- package/dist/oss/index.d.ts +7 -0
- package/dist/oss/index.d.ts.map +1 -0
- package/dist/oss/index.js +7 -0
- package/dist/oss/index.js.map +1 -0
- package/dist/oss/types.d.ts +96 -0
- package/dist/oss/types.d.ts.map +1 -0
- package/dist/oss/types.js +5 -0
- package/dist/oss/types.js.map +1 -0
- package/dist/oss/uploader.d.ts +72 -0
- package/dist/oss/uploader.d.ts.map +1 -0
- package/dist/oss/uploader.js +185 -0
- package/dist/oss/uploader.js.map +1 -0
- package/dist/types/deployment.d.ts +112 -0
- package/dist/types/deployment.d.ts.map +1 -0
- package/dist/types/deployment.js +7 -0
- package/dist/types/deployment.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/project.d.ts +90 -0
- package/dist/types/project.d.ts.map +1 -0
- package/dist/types/project.js +8 -0
- package/dist/types/project.js.map +1 -0
- package/dist/types/user.d.ts +71 -0
- package/dist/types/user.d.ts.map +1 -0
- package/dist/types/user.js +8 -0
- package/dist/types/user.js.map +1 -0
- package/dist/types/workspace.d.ts +88 -0
- package/dist/types/workspace.d.ts.map +1 -0
- package/dist/types/workspace.js +27 -0
- package/dist/types/workspace.js.map +1 -0
- package/dist/utils/build.d.ts +78 -0
- package/dist/utils/build.d.ts.map +1 -0
- package/dist/utils/build.js +148 -0
- package/dist/utils/build.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/manifest.d.ts +106 -0
- package/dist/utils/manifest.d.ts.map +1 -0
- package/dist/utils/manifest.js +109 -0
- package/dist/utils/manifest.js.map +1 -0
- package/package.json +62 -0
- package/src/db/client.ts +92 -0
- package/src/db/deployments.ts +316 -0
- package/src/db/index.ts +7 -0
- package/src/db/projects.ts +246 -0
- package/src/db/schema.sql +156 -0
- package/src/index.ts +18 -0
- package/src/oss/client.ts +183 -0
- package/src/oss/index.ts +7 -0
- package/src/oss/types.ts +126 -0
- package/src/oss/uploader.ts +254 -0
- package/src/types/deployment.ts +147 -0
- package/src/types/index.ts +8 -0
- package/src/types/project.ts +114 -0
- package/src/types/user.ts +91 -0
- package/src/types/workspace.ts +124 -0
- package/src/utils/build.ts +199 -0
- package/src/utils/index.ts +6 -0
- package/src/utils/manifest.ts +224 -0
package/README.md
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# @agent-foundry/studio
|
|
2
|
+
|
|
3
|
+
Full SDK for Agent Foundry Build Studio - provides types, Alibaba Cloud OSS upload utilities, and Supabase database client.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @agent-foundry/studio
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
- **Types**: TypeScript interfaces for Studio projects, deployments, workspaces, and users
|
|
14
|
+
- **OSS Client**: Direct upload to Alibaba Cloud OSS with STS credentials
|
|
15
|
+
- **DB Client**: Supabase client wrapper for project and deployment management
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
### Types Only
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
import type { StudioProject, Deployment, Workspace } from '@agent-foundry/studio/types';
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### OSS Upload
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
import { DirectUploader } from '@agent-foundry/studio/oss';
|
|
29
|
+
|
|
30
|
+
const uploader = new DirectUploader({
|
|
31
|
+
bffBaseUrl: 'http://localhost:11001',
|
|
32
|
+
authToken: 'your-supabase-jwt',
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// Upload a built bundle
|
|
36
|
+
const result = await uploader.upload({
|
|
37
|
+
projectId: 'project-uuid',
|
|
38
|
+
files: distFiles,
|
|
39
|
+
onProgress: (progress) => console.log(`${progress.percent}%`),
|
|
40
|
+
});
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Database Operations
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
import { createStudioClient } from '@agent-foundry/studio/db';
|
|
47
|
+
|
|
48
|
+
const client = createStudioClient({
|
|
49
|
+
supabaseUrl: 'https://your-project.supabase.co',
|
|
50
|
+
supabaseKey: 'your-anon-key',
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// Create a project
|
|
54
|
+
const project = await client.projects.create({
|
|
55
|
+
name: 'My App',
|
|
56
|
+
slug: 'my-app',
|
|
57
|
+
rootPath: '/Users/me/projects/my-app',
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// Create a deployment
|
|
61
|
+
const deployment = await client.deployments.create({
|
|
62
|
+
projectId: project.id,
|
|
63
|
+
version: '1.0.0',
|
|
64
|
+
});
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Architecture
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
┌─────────────────────────────────────────────────────────┐
|
|
71
|
+
│ Tauri Desktop App │
|
|
72
|
+
│ ┌─────────────────┐ ┌─────────────────────────────┐ │
|
|
73
|
+
│ │ Studio UI │ │ OpenCode Server (Hono) │ │
|
|
74
|
+
│ │ (React) │ │ │ │
|
|
75
|
+
│ └────────┬────────┘ └─────────────────────────────┘ │
|
|
76
|
+
└───────────┼─────────────────────────────────────────────┘
|
|
77
|
+
│
|
|
78
|
+
▼
|
|
79
|
+
┌─────────────────────────────────────────────────────────┐
|
|
80
|
+
│ @agent-foundry/studio Package │
|
|
81
|
+
│ ┌──────────┐ ┌──────────────┐ ┌──────────────────┐ │
|
|
82
|
+
│ │ Types │ │ OSS Client │ │ Supabase Client │ │
|
|
83
|
+
│ └──────────┘ └──────┬───────┘ └────────┬─────────┘ │
|
|
84
|
+
└─────────────────────────┼──────────────────┼────────────┘
|
|
85
|
+
│ │
|
|
86
|
+
┌─────────────┘ │
|
|
87
|
+
▼ ▼
|
|
88
|
+
┌────────────────┐ ┌────────────────────┐
|
|
89
|
+
│ Alibaba Cloud │ │ Supabase │
|
|
90
|
+
│ OSS │ │ PostgreSQL │
|
|
91
|
+
└────────────────┘ └────────────────────┘
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## License
|
|
95
|
+
|
|
96
|
+
MIT
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supabase Studio Client
|
|
3
|
+
*
|
|
4
|
+
* Wrapper around @supabase/supabase-js providing typed access to
|
|
5
|
+
* Studio-specific tables (studio_projects, studio_deployments).
|
|
6
|
+
*/
|
|
7
|
+
import { SupabaseClient } from '@supabase/supabase-js';
|
|
8
|
+
import { ProjectsRepository } from './projects';
|
|
9
|
+
import { DeploymentsRepository } from './deployments';
|
|
10
|
+
/**
|
|
11
|
+
* Configuration for creating a Studio client
|
|
12
|
+
*/
|
|
13
|
+
export interface StudioClientConfig {
|
|
14
|
+
/** Supabase project URL */
|
|
15
|
+
supabaseUrl: string;
|
|
16
|
+
/** Supabase anon key (or service role key for server-side) */
|
|
17
|
+
supabaseKey: string;
|
|
18
|
+
/** Optional: Pass an existing Supabase client instance */
|
|
19
|
+
existingClient?: SupabaseClient;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Studio Client - main entry point for database operations
|
|
23
|
+
*/
|
|
24
|
+
export interface StudioClient {
|
|
25
|
+
/** Raw Supabase client for advanced operations */
|
|
26
|
+
readonly supabase: SupabaseClient;
|
|
27
|
+
/** Projects repository */
|
|
28
|
+
readonly projects: ProjectsRepository;
|
|
29
|
+
/** Deployments repository */
|
|
30
|
+
readonly deployments: DeploymentsRepository;
|
|
31
|
+
/**
|
|
32
|
+
* Get current authenticated user ID
|
|
33
|
+
* @throws Error if not authenticated
|
|
34
|
+
*/
|
|
35
|
+
getCurrentUserId(): Promise<string>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create a new Studio client
|
|
39
|
+
*
|
|
40
|
+
* @param config - Client configuration
|
|
41
|
+
* @returns StudioClient instance
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* const client = createStudioClient({
|
|
46
|
+
* supabaseUrl: 'https://your-project.supabase.co',
|
|
47
|
+
* supabaseKey: 'your-anon-key',
|
|
48
|
+
* });
|
|
49
|
+
*
|
|
50
|
+
* // Create a project
|
|
51
|
+
* const project = await client.projects.create({
|
|
52
|
+
* name: 'My App',
|
|
53
|
+
* slug: 'my-app',
|
|
54
|
+
* rootPath: '/Users/me/projects/my-app',
|
|
55
|
+
* });
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare function createStudioClient(config: StudioClientConfig): StudioClient;
|
|
59
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAgB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IAEpB,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;IAEpB,0DAA0D;IAC1D,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,kDAAkD;IAClD,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAElC,0BAA0B;IAC1B,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IAEtC,6BAA6B;IAC7B,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAC;IAE5C;;;OAGG;IACH,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACrC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CAyB3E"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supabase Studio Client
|
|
3
|
+
*
|
|
4
|
+
* Wrapper around @supabase/supabase-js providing typed access to
|
|
5
|
+
* Studio-specific tables (studio_projects, studio_deployments).
|
|
6
|
+
*/
|
|
7
|
+
import { createClient } from '@supabase/supabase-js';
|
|
8
|
+
import { ProjectsRepository } from './projects';
|
|
9
|
+
import { DeploymentsRepository } from './deployments';
|
|
10
|
+
/**
|
|
11
|
+
* Create a new Studio client
|
|
12
|
+
*
|
|
13
|
+
* @param config - Client configuration
|
|
14
|
+
* @returns StudioClient instance
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const client = createStudioClient({
|
|
19
|
+
* supabaseUrl: 'https://your-project.supabase.co',
|
|
20
|
+
* supabaseKey: 'your-anon-key',
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* // Create a project
|
|
24
|
+
* const project = await client.projects.create({
|
|
25
|
+
* name: 'My App',
|
|
26
|
+
* slug: 'my-app',
|
|
27
|
+
* rootPath: '/Users/me/projects/my-app',
|
|
28
|
+
* });
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export function createStudioClient(config) {
|
|
32
|
+
const supabase = config.existingClient ?? createClient(config.supabaseUrl, config.supabaseKey);
|
|
33
|
+
const projects = new ProjectsRepository(supabase);
|
|
34
|
+
const deployments = new DeploymentsRepository(supabase);
|
|
35
|
+
return {
|
|
36
|
+
supabase,
|
|
37
|
+
projects,
|
|
38
|
+
deployments,
|
|
39
|
+
async getCurrentUserId() {
|
|
40
|
+
const { data: { user }, error } = await supabase.auth.getUser();
|
|
41
|
+
if (error) {
|
|
42
|
+
throw new Error(`Failed to get current user: ${error.message}`);
|
|
43
|
+
}
|
|
44
|
+
if (!user) {
|
|
45
|
+
throw new Error('Not authenticated');
|
|
46
|
+
}
|
|
47
|
+
return user.id;
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAkB,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAoCtD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA0B;IAC3D,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,IAAI,YAAY,CACpD,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,WAAW,CACnB,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,IAAI,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAExD,OAAO;QACL,QAAQ;QACR,QAAQ;QACR,WAAW;QAEX,KAAK,CAAC,gBAAgB;YACpB,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChE,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deployments Repository
|
|
3
|
+
*
|
|
4
|
+
* CRUD operations for studio_deployments table.
|
|
5
|
+
*/
|
|
6
|
+
import { SupabaseClient } from '@supabase/supabase-js';
|
|
7
|
+
import type { Deployment, CreateDeploymentInput, UpdateDeploymentInput, DeploymentListFilters } from '../types/deployment';
|
|
8
|
+
/**
|
|
9
|
+
* Deployments Repository - manages studio_deployments table
|
|
10
|
+
*/
|
|
11
|
+
export declare class DeploymentsRepository {
|
|
12
|
+
private readonly supabase;
|
|
13
|
+
private readonly TABLE;
|
|
14
|
+
constructor(supabase: SupabaseClient);
|
|
15
|
+
/**
|
|
16
|
+
* Create a new deployment
|
|
17
|
+
*/
|
|
18
|
+
create(input: CreateDeploymentInput): Promise<Deployment>;
|
|
19
|
+
/**
|
|
20
|
+
* Get a deployment by ID
|
|
21
|
+
*/
|
|
22
|
+
getById(id: string): Promise<Deployment | null>;
|
|
23
|
+
/**
|
|
24
|
+
* List deployments with optional filters
|
|
25
|
+
*/
|
|
26
|
+
list(filters?: DeploymentListFilters): Promise<Deployment[]>;
|
|
27
|
+
/**
|
|
28
|
+
* Update a deployment
|
|
29
|
+
*/
|
|
30
|
+
update(id: string, input: UpdateDeploymentInput): Promise<Deployment>;
|
|
31
|
+
/**
|
|
32
|
+
* Mark deployment as building
|
|
33
|
+
*/
|
|
34
|
+
markBuilding(id: string): Promise<Deployment>;
|
|
35
|
+
/**
|
|
36
|
+
* Mark deployment as uploading
|
|
37
|
+
*/
|
|
38
|
+
markUploading(id: string): Promise<Deployment>;
|
|
39
|
+
/**
|
|
40
|
+
* Mark deployment as published
|
|
41
|
+
*/
|
|
42
|
+
markPublished(id: string, ossInfo: {
|
|
43
|
+
bucket: string;
|
|
44
|
+
key: string;
|
|
45
|
+
url: string;
|
|
46
|
+
sizeBytes: number;
|
|
47
|
+
}): Promise<Deployment>;
|
|
48
|
+
/**
|
|
49
|
+
* Mark deployment as failed
|
|
50
|
+
*/
|
|
51
|
+
markFailed(id: string, errorMessage: string, buildLog?: string): Promise<Deployment>;
|
|
52
|
+
/**
|
|
53
|
+
* Get the latest successful deployment for a project
|
|
54
|
+
*/
|
|
55
|
+
getLatestPublished(projectId: string): Promise<Deployment | null>;
|
|
56
|
+
/**
|
|
57
|
+
* Delete a deployment
|
|
58
|
+
*/
|
|
59
|
+
delete(id: string): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Append to build log
|
|
62
|
+
*/
|
|
63
|
+
appendBuildLog(id: string, logLine: string): Promise<void>;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=deployments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployments.d.ts","sourceRoot":"","sources":["../../src/db/deployments.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EACV,UAAU,EACV,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EAGtB,MAAM,qBAAqB,CAAC;AAyD7B;;GAEG;AACH,qBAAa,qBAAqB;IAGpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAFrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;gBAEjB,QAAQ,EAAE,cAAc;IAErD;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC;IA2B/D;;OAEG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAiBrD;;OAEG;IACG,IAAI,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAoCtE;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC;IAkD3E;;OAEG;IACG,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAInD;;OAEG;IACG,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAIpD;;OAEG;IACG,aAAa,CACjB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GACvE,OAAO,CAAC,UAAU,CAAC;IAWtB;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAQ1F;;OAEG;IACG,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAoBvE;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvC;;OAEG;IACG,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAYjE"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deployments Repository
|
|
3
|
+
*
|
|
4
|
+
* CRUD operations for studio_deployments table.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Convert database row to Deployment
|
|
8
|
+
*/
|
|
9
|
+
function rowToDeployment(row) {
|
|
10
|
+
return {
|
|
11
|
+
id: row.id,
|
|
12
|
+
projectId: row.project_id,
|
|
13
|
+
userId: row.user_id,
|
|
14
|
+
version: row.version,
|
|
15
|
+
status: row.status,
|
|
16
|
+
ossBucket: row.oss_bucket ?? undefined,
|
|
17
|
+
ossKey: row.oss_key ?? undefined,
|
|
18
|
+
ossUrl: row.oss_url ?? undefined,
|
|
19
|
+
bundleSizeBytes: row.bundle_size_bytes ?? undefined,
|
|
20
|
+
buildLog: row.build_log ?? undefined,
|
|
21
|
+
errorMessage: row.error_message ?? undefined,
|
|
22
|
+
metadata: row.metadata,
|
|
23
|
+
createdAt: row.created_at,
|
|
24
|
+
publishedAt: row.published_at ?? undefined,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Generate a version string based on timestamp
|
|
29
|
+
*/
|
|
30
|
+
function generateVersion() {
|
|
31
|
+
const now = new Date();
|
|
32
|
+
const year = now.getFullYear();
|
|
33
|
+
const month = String(now.getMonth() + 1).padStart(2, '0');
|
|
34
|
+
const day = String(now.getDate()).padStart(2, '0');
|
|
35
|
+
const hours = String(now.getHours()).padStart(2, '0');
|
|
36
|
+
const minutes = String(now.getMinutes()).padStart(2, '0');
|
|
37
|
+
return `${year}.${month}.${day}-${hours}${minutes}`;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Deployments Repository - manages studio_deployments table
|
|
41
|
+
*/
|
|
42
|
+
export class DeploymentsRepository {
|
|
43
|
+
constructor(supabase) {
|
|
44
|
+
this.supabase = supabase;
|
|
45
|
+
this.TABLE = 'studio_deployments';
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Create a new deployment
|
|
49
|
+
*/
|
|
50
|
+
async create(input) {
|
|
51
|
+
const { data: { user } } = await this.supabase.auth.getUser();
|
|
52
|
+
if (!user) {
|
|
53
|
+
throw new Error('Not authenticated');
|
|
54
|
+
}
|
|
55
|
+
const version = input.version ?? generateVersion();
|
|
56
|
+
const { data, error } = await this.supabase
|
|
57
|
+
.from(this.TABLE)
|
|
58
|
+
.insert({
|
|
59
|
+
project_id: input.projectId,
|
|
60
|
+
user_id: user.id,
|
|
61
|
+
version,
|
|
62
|
+
status: 'pending',
|
|
63
|
+
metadata: input.metadata ?? {},
|
|
64
|
+
})
|
|
65
|
+
.select()
|
|
66
|
+
.single();
|
|
67
|
+
if (error) {
|
|
68
|
+
throw new Error(`Failed to create deployment: ${error.message}`);
|
|
69
|
+
}
|
|
70
|
+
return rowToDeployment(data);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get a deployment by ID
|
|
74
|
+
*/
|
|
75
|
+
async getById(id) {
|
|
76
|
+
const { data, error } = await this.supabase
|
|
77
|
+
.from(this.TABLE)
|
|
78
|
+
.select()
|
|
79
|
+
.eq('id', id)
|
|
80
|
+
.single();
|
|
81
|
+
if (error) {
|
|
82
|
+
if (error.code === 'PGRST116') {
|
|
83
|
+
return null; // Not found
|
|
84
|
+
}
|
|
85
|
+
throw new Error(`Failed to get deployment: ${error.message}`);
|
|
86
|
+
}
|
|
87
|
+
return rowToDeployment(data);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* List deployments with optional filters
|
|
91
|
+
*/
|
|
92
|
+
async list(filters = {}) {
|
|
93
|
+
let query = this.supabase.from(this.TABLE).select();
|
|
94
|
+
// Apply filters
|
|
95
|
+
if (filters.projectId) {
|
|
96
|
+
query = query.eq('project_id', filters.projectId);
|
|
97
|
+
}
|
|
98
|
+
if (filters.status) {
|
|
99
|
+
query = query.eq('status', filters.status);
|
|
100
|
+
}
|
|
101
|
+
// Ordering
|
|
102
|
+
const orderBy = filters.orderBy ?? 'createdAt';
|
|
103
|
+
const orderColumn = orderBy === 'createdAt' ? 'created_at' :
|
|
104
|
+
orderBy === 'publishedAt' ? 'published_at' : 'version';
|
|
105
|
+
const ascending = filters.orderDir === 'asc';
|
|
106
|
+
query = query.order(orderColumn, { ascending, nullsFirst: false });
|
|
107
|
+
// Pagination
|
|
108
|
+
if (filters.limit) {
|
|
109
|
+
query = query.limit(filters.limit);
|
|
110
|
+
}
|
|
111
|
+
if (filters.offset) {
|
|
112
|
+
query = query.range(filters.offset, filters.offset + (filters.limit ?? 50) - 1);
|
|
113
|
+
}
|
|
114
|
+
const { data, error } = await query;
|
|
115
|
+
if (error) {
|
|
116
|
+
throw new Error(`Failed to list deployments: ${error.message}`);
|
|
117
|
+
}
|
|
118
|
+
return data.map(rowToDeployment);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Update a deployment
|
|
122
|
+
*/
|
|
123
|
+
async update(id, input) {
|
|
124
|
+
const updateData = {};
|
|
125
|
+
if (input.status !== undefined) {
|
|
126
|
+
updateData.status = input.status;
|
|
127
|
+
}
|
|
128
|
+
if (input.ossBucket !== undefined) {
|
|
129
|
+
updateData.oss_bucket = input.ossBucket;
|
|
130
|
+
}
|
|
131
|
+
if (input.ossKey !== undefined) {
|
|
132
|
+
updateData.oss_key = input.ossKey;
|
|
133
|
+
}
|
|
134
|
+
if (input.ossUrl !== undefined) {
|
|
135
|
+
updateData.oss_url = input.ossUrl;
|
|
136
|
+
}
|
|
137
|
+
if (input.bundleSizeBytes !== undefined) {
|
|
138
|
+
updateData.bundle_size_bytes = input.bundleSizeBytes;
|
|
139
|
+
}
|
|
140
|
+
if (input.buildLog !== undefined) {
|
|
141
|
+
updateData.build_log = input.buildLog;
|
|
142
|
+
}
|
|
143
|
+
if (input.errorMessage !== undefined) {
|
|
144
|
+
updateData.error_message = input.errorMessage;
|
|
145
|
+
}
|
|
146
|
+
if (input.metadata !== undefined) {
|
|
147
|
+
// Merge with existing metadata
|
|
148
|
+
const existing = await this.getById(id);
|
|
149
|
+
if (!existing) {
|
|
150
|
+
throw new Error('Deployment not found');
|
|
151
|
+
}
|
|
152
|
+
updateData.metadata = { ...existing.metadata, ...input.metadata };
|
|
153
|
+
}
|
|
154
|
+
if (input.publishedAt !== undefined) {
|
|
155
|
+
updateData.published_at = input.publishedAt;
|
|
156
|
+
}
|
|
157
|
+
const { data, error } = await this.supabase
|
|
158
|
+
.from(this.TABLE)
|
|
159
|
+
.update(updateData)
|
|
160
|
+
.eq('id', id)
|
|
161
|
+
.select()
|
|
162
|
+
.single();
|
|
163
|
+
if (error) {
|
|
164
|
+
throw new Error(`Failed to update deployment: ${error.message}`);
|
|
165
|
+
}
|
|
166
|
+
return rowToDeployment(data);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Mark deployment as building
|
|
170
|
+
*/
|
|
171
|
+
async markBuilding(id) {
|
|
172
|
+
return this.update(id, { status: 'building' });
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Mark deployment as uploading
|
|
176
|
+
*/
|
|
177
|
+
async markUploading(id) {
|
|
178
|
+
return this.update(id, { status: 'uploading' });
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Mark deployment as published
|
|
182
|
+
*/
|
|
183
|
+
async markPublished(id, ossInfo) {
|
|
184
|
+
return this.update(id, {
|
|
185
|
+
status: 'published',
|
|
186
|
+
ossBucket: ossInfo.bucket,
|
|
187
|
+
ossKey: ossInfo.key,
|
|
188
|
+
ossUrl: ossInfo.url,
|
|
189
|
+
bundleSizeBytes: ossInfo.sizeBytes,
|
|
190
|
+
publishedAt: new Date().toISOString(),
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Mark deployment as failed
|
|
195
|
+
*/
|
|
196
|
+
async markFailed(id, errorMessage, buildLog) {
|
|
197
|
+
return this.update(id, {
|
|
198
|
+
status: 'failed',
|
|
199
|
+
errorMessage,
|
|
200
|
+
buildLog,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Get the latest successful deployment for a project
|
|
205
|
+
*/
|
|
206
|
+
async getLatestPublished(projectId) {
|
|
207
|
+
const { data, error } = await this.supabase
|
|
208
|
+
.from(this.TABLE)
|
|
209
|
+
.select()
|
|
210
|
+
.eq('project_id', projectId)
|
|
211
|
+
.eq('status', 'published')
|
|
212
|
+
.order('published_at', { ascending: false })
|
|
213
|
+
.limit(1)
|
|
214
|
+
.single();
|
|
215
|
+
if (error) {
|
|
216
|
+
if (error.code === 'PGRST116') {
|
|
217
|
+
return null; // Not found
|
|
218
|
+
}
|
|
219
|
+
throw new Error(`Failed to get latest deployment: ${error.message}`);
|
|
220
|
+
}
|
|
221
|
+
return rowToDeployment(data);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Delete a deployment
|
|
225
|
+
*/
|
|
226
|
+
async delete(id) {
|
|
227
|
+
const { error } = await this.supabase
|
|
228
|
+
.from(this.TABLE)
|
|
229
|
+
.delete()
|
|
230
|
+
.eq('id', id);
|
|
231
|
+
if (error) {
|
|
232
|
+
throw new Error(`Failed to delete deployment: ${error.message}`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Append to build log
|
|
237
|
+
*/
|
|
238
|
+
async appendBuildLog(id, logLine) {
|
|
239
|
+
const existing = await this.getById(id);
|
|
240
|
+
if (!existing) {
|
|
241
|
+
throw new Error('Deployment not found');
|
|
242
|
+
}
|
|
243
|
+
const newLog = existing.buildLog
|
|
244
|
+
? `${existing.buildLog}\n${logLine}`
|
|
245
|
+
: logLine;
|
|
246
|
+
await this.update(id, { buildLog: newLog });
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=deployments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployments.js","sourceRoot":"","sources":["../../src/db/deployments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database module - Supabase client for Studio
|
|
3
|
+
*/
|
|
4
|
+
export { createStudioClient, type StudioClientConfig } from './client';
|
|
5
|
+
export { ProjectsRepository } from './projects';
|
|
6
|
+
export { DeploymentsRepository } from './deployments';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/db/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAA2B,MAAM,UAAU,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Projects Repository
|
|
3
|
+
*
|
|
4
|
+
* CRUD operations for studio_projects table.
|
|
5
|
+
*/
|
|
6
|
+
import { SupabaseClient } from '@supabase/supabase-js';
|
|
7
|
+
import type { StudioProject, CreateProjectInput, UpdateProjectInput, ProjectListFilters } from '../types/project';
|
|
8
|
+
/**
|
|
9
|
+
* Projects Repository - manages studio_projects table
|
|
10
|
+
*/
|
|
11
|
+
export declare class ProjectsRepository {
|
|
12
|
+
private readonly supabase;
|
|
13
|
+
private readonly TABLE;
|
|
14
|
+
constructor(supabase: SupabaseClient);
|
|
15
|
+
/**
|
|
16
|
+
* Create a new project
|
|
17
|
+
*/
|
|
18
|
+
create(input: CreateProjectInput): Promise<StudioProject>;
|
|
19
|
+
/**
|
|
20
|
+
* Get a project by ID
|
|
21
|
+
*/
|
|
22
|
+
getById(id: string): Promise<StudioProject | null>;
|
|
23
|
+
/**
|
|
24
|
+
* Get a project by slug (for current user)
|
|
25
|
+
*/
|
|
26
|
+
getBySlug(slug: string): Promise<StudioProject | null>;
|
|
27
|
+
/**
|
|
28
|
+
* List projects with optional filters
|
|
29
|
+
*/
|
|
30
|
+
list(filters?: ProjectListFilters): Promise<StudioProject[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Update a project
|
|
33
|
+
*/
|
|
34
|
+
update(id: string, input: UpdateProjectInput): Promise<StudioProject>;
|
|
35
|
+
/**
|
|
36
|
+
* Delete a project
|
|
37
|
+
*/
|
|
38
|
+
delete(id: string): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Fork a project (create a copy)
|
|
41
|
+
*/
|
|
42
|
+
fork(id: string, newSlug: string, newRootPath: string): Promise<StudioProject>;
|
|
43
|
+
/**
|
|
44
|
+
* Check if a slug is available for current user
|
|
45
|
+
*/
|
|
46
|
+
isSlugAvailable(slug: string): Promise<boolean>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=projects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/db/projects.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAEnB,MAAM,kBAAkB,CAAC;AAsC1B;;GAEG;AACH,qBAAa,kBAAkB;IAGjB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAFrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;gBAEd,QAAQ,EAAE,cAAc;IAErD;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;IA4B/D;;OAEG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAiBxD;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAiB5D;;OAEG;IACG,IAAI,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAoCtE;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;IAgC3E;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvC;;OAEG;IACG,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAiBpF;;OAEG;IACG,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAItD"}
|