@runlot/api 0.1.0-rc.34 → 0.1.0-rc.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/schema.d.ts CHANGED
@@ -100,6 +100,34 @@ export interface paths {
100
100
  patch?: never;
101
101
  trace?: never;
102
102
  };
103
+ "/v1/hooks/polar": {
104
+ parameters: {
105
+ query?: never;
106
+ header?: never;
107
+ path?: never;
108
+ cookie?: never;
109
+ };
110
+ get?: never;
111
+ put?: never;
112
+ /**
113
+ * Polar 결제 웹훅 (docs/billing.md)
114
+ * @description 사용자가 부르는 경로가 아니다. Polar 가 구독 사건을 여기에 배달한다.
115
+ * 인증은 토큰이 아니라 **Standard Webhooks 서명**이다 — `webhook-id`·
116
+ * `webhook-timestamp`·`webhook-signature` 셋과 서버의
117
+ * `RUNLOT_POLAR_WEBHOOK_SECRET` 으로 검증한다 (아니면 403, 시각 ±5 분).
118
+ * 같은 `webhook-id` 는 한 번만 적용한다 (재전달은 200 이고 무시).
119
+ *
120
+ * `orgs.plan` 을 바꾸는 유일한 자리다: `subscription.active`·`updated` 의
121
+ * status `active`/`trialing`/`past_due` 는 pro, 그 밖(`canceled`·`unpaid`…)은
122
+ * free. 서버에 토큰이 없으면 501. 클라이언트 라이브러리는 부르지 않는다.
123
+ */
124
+ post: operations["polarHook"];
125
+ delete?: never;
126
+ options?: never;
127
+ head?: never;
128
+ patch?: never;
129
+ trace?: never;
130
+ };
103
131
  "/v1/me": {
104
132
  parameters: {
105
133
  query?: never;
@@ -184,6 +212,36 @@ export interface paths {
184
212
  patch?: never;
185
213
  trace?: never;
186
214
  };
215
+ "/v1/orgs/{orgSlug}/projects/{projectName}/overview": {
216
+ parameters: {
217
+ query?: never;
218
+ header?: never;
219
+ path: {
220
+ orgSlug: components["parameters"]["OrgSlug"];
221
+ projectName: components["parameters"]["ProjectName"];
222
+ };
223
+ cookie?: never;
224
+ };
225
+ /**
226
+ * 프로젝트 개요 (대시보드 첫 화면)
227
+ * @description 프로젝트를 열었을 때 첫 화면이 한 번에 받는 것 — 지금 서비스 중인 배포와
228
+ * 누가 올렸는지, 최근 배포 몇 개, 데이터베이스의 마지막 백업, 선언으로 켠
229
+ * 자원의 부여 여부, 이 프로젝트의 최근 알림. "지금 어떤가" 의 답이지
230
+ * 이력이 아니다 — 전부는 각 탭이 준다.
231
+ *
232
+ * 사용량은 여기 없다. 그것은 cp-core 가 창을 계산하는 값이라 `getUsage` 를
233
+ * 나란히 부른다 — 한 응답에 묶으면 cp-core 가 느린 날 첫 화면 전체가
234
+ * 그만큼 늦게 선다. viewer 이상.
235
+ */
236
+ get: operations["getProjectOverview"];
237
+ put?: never;
238
+ post?: never;
239
+ delete?: never;
240
+ options?: never;
241
+ head?: never;
242
+ patch?: never;
243
+ trace?: never;
244
+ };
187
245
  "/v1/orgs/{orgSlug}/projects/{projectName}/deployments": {
188
246
  parameters: {
189
247
  query?: never;
@@ -218,6 +276,15 @@ export interface paths {
218
276
  * 읽히려면 그 사건이 각각 남아야 한다.
219
277
  *
220
278
  * 업로드가 성공하면 새 배포가 즉시 live 가 된다.
279
+ *
280
+ * **출처 헤더** (선택). 본문이 번들 그 자체라 메타는 헤더로 온다. CLI 가
281
+ * 배포하는 폴더의 git 을 읽어 싣고, git 이 없으면 안 싣는다. CP 는 검증할
282
+ * 수 없으므로 표시용이다 — 인가·배치의 근거가 되지 않는다.
283
+ *
284
+ * X-Runlot-Git-Commit HEAD 해시 (16 진수 7~64)
285
+ * X-Runlot-Git-Message 커밋 메시지 첫 줄, percent-encoded (200 자에서 자른다)
286
+ * X-Runlot-Git-Branch 브랜치 이름, percent-encoded
287
+ * X-Runlot-Git-Dirty `true`|`false` — 커밋 안 된 변경이 있었는가
221
288
  */
222
289
  post: operations["createDeployment"];
223
290
  delete?: never;
@@ -1186,6 +1253,87 @@ export interface paths {
1186
1253
  patch?: never;
1187
1254
  trace?: never;
1188
1255
  };
1256
+ "/v1/orgs/{orgSlug}/billing": {
1257
+ parameters: {
1258
+ query?: never;
1259
+ header?: never;
1260
+ path: {
1261
+ orgSlug: components["parameters"]["OrgSlug"];
1262
+ };
1263
+ cookie?: never;
1264
+ };
1265
+ /**
1266
+ * 조직의 요금제와 결제 상태 (docs/billing.md)
1267
+ * @description 요금제(`plan`)와, 프로면 그 상태(`status`: active · past_due · canceled)와
1268
+ * 현재 기간의 끝(`periodEnd`)을 준다. `enabled` 가 거짓이면 이 배치에
1269
+ * 결제가 설정되지 않은 것이다 — 화면은 문의 주소만 둔다. `sandbox` 가 참이면
1270
+ * Polar 의 테스트 환경이라 실제 청구가 없다.
1271
+ *
1272
+ * `limits` 는 두 요금제의 한도 표다 (cp/internal/plan). 화면에 숫자를 두지
1273
+ * 않는 이유는 `OrgMembership.projectLimit` 과 같다. viewer 이상.
1274
+ */
1275
+ get: operations["getBilling"];
1276
+ put?: never;
1277
+ post?: never;
1278
+ delete?: never;
1279
+ options?: never;
1280
+ head?: never;
1281
+ patch?: never;
1282
+ trace?: never;
1283
+ };
1284
+ "/v1/orgs/{orgSlug}/billing/checkout": {
1285
+ parameters: {
1286
+ query?: never;
1287
+ header?: never;
1288
+ path: {
1289
+ orgSlug: components["parameters"]["OrgSlug"];
1290
+ };
1291
+ cookie?: never;
1292
+ };
1293
+ get?: never;
1294
+ put?: never;
1295
+ /**
1296
+ * 프로 요금제 체크아웃 세션을 만든다
1297
+ * @description Polar 체크아웃 세션 하나를 만들고 그 `url` 을 준다 — 브라우저가 거기로
1298
+ * 간다. 결제가 끝나면 `returnTo` 로 돌아오지만 **그 되돌아옴이 요금제를
1299
+ * 바꾸지는 않는다**: 요금제는 웹훅(`/v1/hooks/polar`)이 바꾼다. 화면은
1300
+ * 돌아온 뒤 상태를 다시 읽는다.
1301
+ *
1302
+ * `returnTo` 는 서버의 `RUNLOT_PUBLIC_URL` 아래여야 한다 (아니면 400).
1303
+ * 이미 프로면 409 `already_pro` — 포털을 열어야 한다. admin.
1304
+ */
1305
+ post: operations["createBillingCheckout"];
1306
+ delete?: never;
1307
+ options?: never;
1308
+ head?: never;
1309
+ patch?: never;
1310
+ trace?: never;
1311
+ };
1312
+ "/v1/orgs/{orgSlug}/billing/portal": {
1313
+ parameters: {
1314
+ query?: never;
1315
+ header?: never;
1316
+ path: {
1317
+ orgSlug: components["parameters"]["OrgSlug"];
1318
+ };
1319
+ cookie?: never;
1320
+ };
1321
+ get?: never;
1322
+ put?: never;
1323
+ /**
1324
+ * 고객 포털 세션을 만든다 (결제 수단·영수증·해지)
1325
+ * @description Polar 고객 포털의 일회용 `url` 을 준다. 결제 수단 변경·영수증·해지는
1326
+ * 전부 거기서 한다 — 우리 화면에 그 폼을 두지 않는다 (카드 번호가 우리
1327
+ * 서버를 지나지 않는 것이 MoR 의 값이다). 한 번도 결제한 적 없는 org 는
1328
+ * 404. admin.
1329
+ */
1330
+ post: operations["createBillingPortal"];
1331
+ delete?: never;
1332
+ options?: never;
1333
+ head?: never;
1334
+ patch?: never;
1335
+ trace?: never;
1336
+ };
1189
1337
  "/v1/orgs/{orgSlug}/members": {
1190
1338
  parameters: {
1191
1339
  query?: never;
@@ -2380,6 +2528,61 @@ export interface components {
2380
2528
  */
2381
2529
  suspended: boolean;
2382
2530
  };
2531
+ /** @description 프로젝트 첫 화면 (getProjectOverview). */
2532
+ ProjectOverview: {
2533
+ /** @description 지금 서비스 중인 배포. 첫 배포 전에는 null 이다. */
2534
+ live: components["schemas"]["OverviewDeployment"] | null;
2535
+ /** @description 최근 배포, 최신이 먼저. 최대 5 개 — 전부는 `listDeployments`. */
2536
+ deployments: components["schemas"]["OverviewDeployment"][];
2537
+ /**
2538
+ * Format: int64
2539
+ * @description 이 프로젝트의 배포 수 전체.
2540
+ */
2541
+ deploymentCount: number;
2542
+ database: components["schemas"]["OverviewDatabase"];
2543
+ features: components["schemas"]["OverviewFeatures"];
2544
+ /**
2545
+ * Format: int64
2546
+ * @description 커스텀 도메인 행의 수. 검증 중인 것도 센다.
2547
+ */
2548
+ customHostnames: number;
2549
+ /**
2550
+ * Format: int64
2551
+ * @description 이 프로젝트의 저장소 수.
2552
+ */
2553
+ repos: number;
2554
+ /** @description 이 프로젝트의 최근 알림, 최신이 먼저. 최대 5 개. */
2555
+ notifications: components["schemas"]["Notification"][];
2556
+ };
2557
+ /** @description 개요의 배포 행. `Deployment` 와 같은 모양이다 (`actor` 포함). */
2558
+ OverviewDeployment: components["schemas"]["Deployment"];
2559
+ OverviewDatabase: {
2560
+ /** @description `"database": true` 로 켜졌는가 */
2561
+ granted: boolean;
2562
+ /**
2563
+ * Format: date-time
2564
+ * @description 마지막 세대의 시각. 세대가 없으면 없다.
2565
+ */
2566
+ lastBackupAt?: string;
2567
+ /**
2568
+ * Format: date-time
2569
+ * @description 무변경 스킵의 마지막 하트비트 (`DatabaseGenerations.lastCheckedAt`).
2570
+ * 세대가 안 늘어도 이 값이 움직이면 백업은 살아 있다.
2571
+ */
2572
+ lastCheckedAt?: string;
2573
+ /**
2574
+ * Format: int64
2575
+ * @description 세대 수
2576
+ */
2577
+ generations: number;
2578
+ };
2579
+ /** @description 선언으로 켜는 자원의 부여 여부 (docs/provisioning.md). 첫 화면의 "다음 단계" 가 이것으로 안 켠 것을 고른다. */
2580
+ OverviewFeatures: {
2581
+ database: boolean;
2582
+ storage: boolean;
2583
+ email: boolean;
2584
+ auth: boolean;
2585
+ };
2383
2586
  Deployment: {
2384
2587
  /** Format: uuid */
2385
2588
  deploymentId: string;
@@ -2391,6 +2594,28 @@ export interface components {
2391
2594
  /** Format: uuid */
2392
2595
  createdBy?: string | null;
2393
2596
  live: boolean;
2597
+ /**
2598
+ * @description 배포한 사람의 표시 이름 (이름 → 이메일 → 프로바이더 subject 순).
2599
+ * `createdBy` 는 uuid 라 화면이 사람으로 못 바꾼다. 목록·개요에만
2600
+ * 실리고, 사용자 행이 없으면 비어 있다.
2601
+ */
2602
+ actor?: string;
2603
+ /** @description 검증을 통과한 매니페스트 그대로. 0040 이전의 배포에는 없다. */
2604
+ manifest?: components["schemas"]["Manifest"];
2605
+ /**
2606
+ * Format: int64
2607
+ * @description 푼 뒤의 번들 크기. 압축 크기가 아니다.
2608
+ */
2609
+ bundleBytes?: number;
2610
+ /** @description 번들 항목 수 (파일 + 디렉토리). */
2611
+ bundleFiles?: number;
2612
+ /** @description CLI 가 보낸 HEAD 해시. 표시용 — CP 는 검증하지 않는다. */
2613
+ gitCommit?: string;
2614
+ /** @description 커밋 메시지 첫 줄, 200 자까지. */
2615
+ gitMessage?: string;
2616
+ gitBranch?: string;
2617
+ /** @description 커밋 안 된 변경을 품고 배포했는가. 참이면 `gitCommit` 이 곧 코드가 아니다. */
2618
+ gitDirty?: boolean;
2394
2619
  };
2395
2620
  DatabaseEndpoint: {
2396
2621
  host: string;
@@ -2937,6 +3162,40 @@ export interface components {
2937
3162
  /** @description 이 org 의 보관 일수 */
2938
3163
  keepDays: number;
2939
3164
  };
3165
+ BillingStatus: {
3166
+ /** @description 이 배치에 결제가 설정돼 있다 */
3167
+ enabled: boolean;
3168
+ /** @description Polar 테스트 환경 — 실제 청구 없음 */
3169
+ sandbox: boolean;
3170
+ /** @enum {string} */
3171
+ plan: "free" | "pro";
3172
+ /**
3173
+ * @description 프로의 상태. canceled 는 기간 끝까지 프로. free 는 없다
3174
+ * @enum {string}
3175
+ */
3176
+ status?: "active" | "past_due" | "canceled";
3177
+ /**
3178
+ * Format: date-time
3179
+ * @description 현재 결제 기간의 끝
3180
+ */
3181
+ periodEnd?: string;
3182
+ /** @description 결제 이력이 있어 포털을 열 수 있다 */
3183
+ hasPortal: boolean;
3184
+ limits: {
3185
+ free: components["schemas"]["PlanLimits"];
3186
+ pro: components["schemas"]["PlanLimits"];
3187
+ };
3188
+ };
3189
+ /** @description 요금제 하나의 한도 (docs/limits.md §1) */
3190
+ PlanLimits: {
3191
+ projects: number;
3192
+ /** Format: int64 */
3193
+ storageBytes: number;
3194
+ /** @description 보존 세대 수 (= 시간) */
3195
+ backupKeep: number;
3196
+ crons: number;
3197
+ mailPerHour: number;
3198
+ };
2940
3199
  /**
2941
3200
  * @description 프로젝트 전용 오브젝트 스토리지 상태다 (docs/storage.md §7).
2942
3201
  *
@@ -3559,6 +3818,43 @@ export interface operations {
3559
3818
  };
3560
3819
  };
3561
3820
  };
3821
+ polarHook: {
3822
+ parameters: {
3823
+ query?: never;
3824
+ header?: never;
3825
+ path?: never;
3826
+ cookie?: never;
3827
+ };
3828
+ requestBody: {
3829
+ content: {
3830
+ "application/json": Record<string, never>;
3831
+ };
3832
+ };
3833
+ responses: {
3834
+ /** @description 받았다 (`applied` 가 참이면 요금제를 바꿨다) */
3835
+ 200: {
3836
+ headers: {
3837
+ [name: string]: unknown;
3838
+ };
3839
+ content?: never;
3840
+ };
3841
+ 400: components["responses"]["BadRequest"];
3842
+ /** @description 서명이 맞지 않는다 */
3843
+ 403: {
3844
+ headers: {
3845
+ [name: string]: unknown;
3846
+ };
3847
+ content?: never;
3848
+ };
3849
+ /** @description 결제가 꺼져 있다 */
3850
+ 501: {
3851
+ headers: {
3852
+ [name: string]: unknown;
3853
+ };
3854
+ content?: never;
3855
+ };
3856
+ };
3857
+ };
3562
3858
  getMe: {
3563
3859
  parameters: {
3564
3860
  query?: never;
@@ -3732,6 +4028,31 @@ export interface operations {
3732
4028
  404: components["responses"]["NotFound"];
3733
4029
  };
3734
4030
  };
4031
+ getProjectOverview: {
4032
+ parameters: {
4033
+ query?: never;
4034
+ header?: never;
4035
+ path: {
4036
+ orgSlug: components["parameters"]["OrgSlug"];
4037
+ projectName: components["parameters"]["ProjectName"];
4038
+ };
4039
+ cookie?: never;
4040
+ };
4041
+ requestBody?: never;
4042
+ responses: {
4043
+ /** @description 개요 */
4044
+ 200: {
4045
+ headers: {
4046
+ [name: string]: unknown;
4047
+ };
4048
+ content: {
4049
+ "application/json": components["schemas"]["ProjectOverview"];
4050
+ };
4051
+ };
4052
+ 403: components["responses"]["Forbidden"];
4053
+ 404: components["responses"]["NotFound"];
4054
+ };
4055
+ };
3735
4056
  listDeployments: {
3736
4057
  parameters: {
3737
4058
  query?: never;
@@ -3764,7 +4085,12 @@ export interface operations {
3764
4085
  createDeployment: {
3765
4086
  parameters: {
3766
4087
  query?: never;
3767
- header?: never;
4088
+ header?: {
4089
+ "X-Runlot-Git-Commit"?: string;
4090
+ "X-Runlot-Git-Message"?: string;
4091
+ "X-Runlot-Git-Branch"?: string;
4092
+ "X-Runlot-Git-Dirty"?: boolean;
4093
+ };
3768
4094
  path: {
3769
4095
  orgSlug: components["parameters"]["OrgSlug"];
3770
4096
  projectName: components["parameters"]["ProjectName"];
@@ -5265,6 +5591,138 @@ export interface operations {
5265
5591
  404: components["responses"]["NotFound"];
5266
5592
  };
5267
5593
  };
5594
+ getBilling: {
5595
+ parameters: {
5596
+ query?: never;
5597
+ header?: never;
5598
+ path: {
5599
+ orgSlug: components["parameters"]["OrgSlug"];
5600
+ };
5601
+ cookie?: never;
5602
+ };
5603
+ requestBody?: never;
5604
+ responses: {
5605
+ /** @description 결제 상태 */
5606
+ 200: {
5607
+ headers: {
5608
+ [name: string]: unknown;
5609
+ };
5610
+ content: {
5611
+ "application/json": components["schemas"]["BillingStatus"];
5612
+ };
5613
+ };
5614
+ 403: components["responses"]["Forbidden"];
5615
+ 404: components["responses"]["NotFound"];
5616
+ };
5617
+ };
5618
+ createBillingCheckout: {
5619
+ parameters: {
5620
+ query?: never;
5621
+ header?: never;
5622
+ path: {
5623
+ orgSlug: components["parameters"]["OrgSlug"];
5624
+ };
5625
+ cookie?: never;
5626
+ };
5627
+ requestBody: {
5628
+ content: {
5629
+ "application/json": {
5630
+ /** Format: uri */
5631
+ returnTo: string;
5632
+ };
5633
+ };
5634
+ };
5635
+ responses: {
5636
+ /** @description 체크아웃 세션 */
5637
+ 200: {
5638
+ headers: {
5639
+ [name: string]: unknown;
5640
+ };
5641
+ content: {
5642
+ "application/json": {
5643
+ /** Format: uri */
5644
+ url: string;
5645
+ checkoutId: string;
5646
+ };
5647
+ };
5648
+ };
5649
+ 400: components["responses"]["BadRequest"];
5650
+ 403: components["responses"]["Forbidden"];
5651
+ 404: components["responses"]["NotFound"];
5652
+ /** @description `already_pro` */
5653
+ 409: {
5654
+ headers: {
5655
+ [name: string]: unknown;
5656
+ };
5657
+ content: {
5658
+ "application/json": components["schemas"]["Error"];
5659
+ };
5660
+ };
5661
+ /** @description `billing_off` — 결제가 설정되지 않았다 */
5662
+ 501: {
5663
+ headers: {
5664
+ [name: string]: unknown;
5665
+ };
5666
+ content?: never;
5667
+ };
5668
+ /** @description `billing_unavailable` — Polar 가 응답하지 않는다 */
5669
+ 502: {
5670
+ headers: {
5671
+ [name: string]: unknown;
5672
+ };
5673
+ content?: never;
5674
+ };
5675
+ };
5676
+ };
5677
+ createBillingPortal: {
5678
+ parameters: {
5679
+ query?: never;
5680
+ header?: never;
5681
+ path: {
5682
+ orgSlug: components["parameters"]["OrgSlug"];
5683
+ };
5684
+ cookie?: never;
5685
+ };
5686
+ requestBody: {
5687
+ content: {
5688
+ "application/json": {
5689
+ /** Format: uri */
5690
+ returnTo: string;
5691
+ };
5692
+ };
5693
+ };
5694
+ responses: {
5695
+ /** @description 포털 세션 */
5696
+ 200: {
5697
+ headers: {
5698
+ [name: string]: unknown;
5699
+ };
5700
+ content: {
5701
+ "application/json": {
5702
+ /** Format: uri */
5703
+ url: string;
5704
+ };
5705
+ };
5706
+ };
5707
+ 400: components["responses"]["BadRequest"];
5708
+ 403: components["responses"]["Forbidden"];
5709
+ 404: components["responses"]["NotFound"];
5710
+ /** @description `billing_off` */
5711
+ 501: {
5712
+ headers: {
5713
+ [name: string]: unknown;
5714
+ };
5715
+ content?: never;
5716
+ };
5717
+ /** @description `billing_unavailable` */
5718
+ 502: {
5719
+ headers: {
5720
+ [name: string]: unknown;
5721
+ };
5722
+ content?: never;
5723
+ };
5724
+ };
5725
+ };
5268
5726
  listMembers: {
5269
5727
  parameters: {
5270
5728
  query?: never;