@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.
Files changed (88) hide show
  1. package/README.md +96 -0
  2. package/dist/db/client.d.ts +59 -0
  3. package/dist/db/client.d.ts.map +1 -0
  4. package/dist/db/client.js +51 -0
  5. package/dist/db/client.js.map +1 -0
  6. package/dist/db/deployments.d.ts +65 -0
  7. package/dist/db/deployments.d.ts.map +1 -0
  8. package/dist/db/deployments.js +249 -0
  9. package/dist/db/deployments.js.map +1 -0
  10. package/dist/db/index.d.ts +7 -0
  11. package/dist/db/index.d.ts.map +1 -0
  12. package/dist/db/index.js +7 -0
  13. package/dist/db/index.js.map +1 -0
  14. package/dist/db/projects.d.ts +48 -0
  15. package/dist/db/projects.d.ts.map +1 -0
  16. package/dist/db/projects.js +192 -0
  17. package/dist/db/projects.js.map +1 -0
  18. package/dist/index.d.ts +11 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +15 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/oss/client.d.ts +65 -0
  23. package/dist/oss/client.d.ts.map +1 -0
  24. package/dist/oss/client.js +146 -0
  25. package/dist/oss/client.js.map +1 -0
  26. package/dist/oss/index.d.ts +7 -0
  27. package/dist/oss/index.d.ts.map +1 -0
  28. package/dist/oss/index.js +7 -0
  29. package/dist/oss/index.js.map +1 -0
  30. package/dist/oss/types.d.ts +96 -0
  31. package/dist/oss/types.d.ts.map +1 -0
  32. package/dist/oss/types.js +5 -0
  33. package/dist/oss/types.js.map +1 -0
  34. package/dist/oss/uploader.d.ts +72 -0
  35. package/dist/oss/uploader.d.ts.map +1 -0
  36. package/dist/oss/uploader.js +185 -0
  37. package/dist/oss/uploader.js.map +1 -0
  38. package/dist/types/deployment.d.ts +112 -0
  39. package/dist/types/deployment.d.ts.map +1 -0
  40. package/dist/types/deployment.js +7 -0
  41. package/dist/types/deployment.js.map +1 -0
  42. package/dist/types/index.d.ts +8 -0
  43. package/dist/types/index.d.ts.map +1 -0
  44. package/dist/types/index.js +8 -0
  45. package/dist/types/index.js.map +1 -0
  46. package/dist/types/project.d.ts +90 -0
  47. package/dist/types/project.d.ts.map +1 -0
  48. package/dist/types/project.js +8 -0
  49. package/dist/types/project.js.map +1 -0
  50. package/dist/types/user.d.ts +71 -0
  51. package/dist/types/user.d.ts.map +1 -0
  52. package/dist/types/user.js +8 -0
  53. package/dist/types/user.js.map +1 -0
  54. package/dist/types/workspace.d.ts +88 -0
  55. package/dist/types/workspace.d.ts.map +1 -0
  56. package/dist/types/workspace.js +27 -0
  57. package/dist/types/workspace.js.map +1 -0
  58. package/dist/utils/build.d.ts +78 -0
  59. package/dist/utils/build.d.ts.map +1 -0
  60. package/dist/utils/build.js +148 -0
  61. package/dist/utils/build.js.map +1 -0
  62. package/dist/utils/index.d.ts +6 -0
  63. package/dist/utils/index.d.ts.map +1 -0
  64. package/dist/utils/index.js +6 -0
  65. package/dist/utils/index.js.map +1 -0
  66. package/dist/utils/manifest.d.ts +106 -0
  67. package/dist/utils/manifest.d.ts.map +1 -0
  68. package/dist/utils/manifest.js +109 -0
  69. package/dist/utils/manifest.js.map +1 -0
  70. package/package.json +62 -0
  71. package/src/db/client.ts +92 -0
  72. package/src/db/deployments.ts +316 -0
  73. package/src/db/index.ts +7 -0
  74. package/src/db/projects.ts +246 -0
  75. package/src/db/schema.sql +156 -0
  76. package/src/index.ts +18 -0
  77. package/src/oss/client.ts +183 -0
  78. package/src/oss/index.ts +7 -0
  79. package/src/oss/types.ts +126 -0
  80. package/src/oss/uploader.ts +254 -0
  81. package/src/types/deployment.ts +147 -0
  82. package/src/types/index.ts +8 -0
  83. package/src/types/project.ts +114 -0
  84. package/src/types/user.ts +91 -0
  85. package/src/types/workspace.ts +124 -0
  86. package/src/utils/build.ts +199 -0
  87. package/src/utils/index.ts +6 -0
  88. 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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Database module - Supabase client for Studio
3
+ */
4
+ export { createStudioClient } from './client';
5
+ export { ProjectsRepository } from './projects';
6
+ export { DeploymentsRepository } from './deployments';
7
+ //# sourceMappingURL=index.js.map
@@ -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"}