@productcraft/social 0.5.0 → 0.6.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/dist/index.d.cts CHANGED
@@ -737,7 +737,7 @@ interface paths {
737
737
  };
738
738
  get?: never;
739
739
  put?: never;
740
- /** Upload an image. Processed synchronously (EXIF stripped, renditions generated) and stored in a private bucket. Returns the asset id + status. */
740
+ /** Upload media. Images (multipart): processed synchronously, returns ready. Videos (JSON, kind:'video' + declared content_type/byte_size): returns an `uploading` asset with a presigned PUT — upload the bytes, then POST /assets/:id/complete. */
741
741
  post: operations["AssetController_upload"];
742
742
  delete?: never;
743
743
  options?: never;
@@ -763,6 +763,23 @@ interface paths {
763
763
  patch?: never;
764
764
  trace?: never;
765
765
  };
766
+ "/v1/communities/{communityId}/assets/{assetId}/complete": {
767
+ parameters: {
768
+ query?: never;
769
+ header?: never;
770
+ path?: never;
771
+ cookie?: never;
772
+ };
773
+ get?: never;
774
+ put?: never;
775
+ /** Finalize a presigned-PUT video upload. Verifies the stored object (existence, size, container magic bytes) and enqueues the transcode. Replaying on a finalized asset returns its current status without re-enqueueing. */
776
+ post: operations["AssetController_complete"];
777
+ delete?: never;
778
+ options?: never;
779
+ head?: never;
780
+ patch?: never;
781
+ trace?: never;
782
+ };
766
783
  "/v1/communities/{communityId}/blocks": {
767
784
  parameters: {
768
785
  query?: never;
@@ -2862,21 +2879,27 @@ interface components {
2862
2879
  byte_size: number;
2863
2880
  /** @example image/jpeg */
2864
2881
  content_type: string;
2865
- /** @example 960 */
2866
- height: number;
2867
2882
  /**
2868
- * @description Ladder rung.
2883
+ * @description Null on the un-probed video original.
2884
+ * @example 960
2885
+ */
2886
+ height: number | null;
2887
+ /**
2888
+ * @description Ladder rung — original/medium/thumb for images, original/video/poster for videos.
2869
2889
  * @example medium
2870
2890
  * @enum {string}
2871
2891
  */
2872
- name: "original" | "medium" | "thumb";
2892
+ name: "original" | "medium" | "thumb" | "video" | "poster";
2873
2893
  /**
2874
2894
  * @description Short-lived presigned GET URL (re-minted each read).
2875
2895
  * @example https://…r2.cloudflarestorage.com/…?X-Amz-Signature=…
2876
2896
  */
2877
2897
  url: string;
2878
- /** @example 1280 */
2879
- width: number;
2898
+ /**
2899
+ * @description Null on the un-probed video original.
2900
+ * @example 1280
2901
+ */
2902
+ width: number | null;
2880
2903
  };
2881
2904
  AssetResponseDto: {
2882
2905
  /**
@@ -2890,23 +2913,64 @@ interface components {
2890
2913
  content_type: string;
2891
2914
  /** @example 2026-05-01T12:00:00.000Z */
2892
2915
  created_at: string;
2916
+ /**
2917
+ * @description Output duration in seconds — ready videos only.
2918
+ * @example 12.48
2919
+ */
2920
+ duration_s: number | null;
2921
+ /**
2922
+ * @description Stable code when status='failed' — ASSET_TOO_LARGE, ASSET_INVALID_CONTAINER, ASSET_DURATION_EXCEEDED, ASSET_TRANSCODE_FAILED, ASSET_PROCESSING_FAILED.
2923
+ * @example null
2924
+ */
2925
+ failure_reason: string | null;
2893
2926
  /** @example 4032 */
2894
2927
  height: number | null;
2895
2928
  /** @example eeeeeeee-0000-0000-0000-000000000001 */
2896
2929
  id: string;
2930
+ /**
2931
+ * @example image
2932
+ * @enum {string}
2933
+ */
2934
+ kind: "image" | "video";
2897
2935
  /** @example aaaaaaaa-0000-0000-0000-000000000001 */
2898
2936
  owner_actor_id: string;
2899
2937
  renditions: components["schemas"]["AssetRenditionDto"][];
2900
2938
  /**
2939
+ * @description Videos: uploading → processing → ready | failed. Images never enter 'uploading'.
2901
2940
  * @example ready
2902
2941
  * @enum {string}
2903
2942
  */
2904
- status: "processing" | "ready" | "failed";
2943
+ status: "uploading" | "processing" | "ready" | "failed";
2905
2944
  /** @example 2026-05-01T12:00:00.000Z */
2906
2945
  updated_at: string;
2907
2946
  /** @example 3024 */
2908
2947
  width: number | null;
2909
2948
  };
2949
+ AssetUploadDto: {
2950
+ /**
2951
+ * @description Signature expiry — finish the PUT before this.
2952
+ * @example 2026-05-01T12:15:00.000Z
2953
+ */
2954
+ expires_at: string;
2955
+ /**
2956
+ * @description Headers the PUT must carry — they are bound into the signature. Keys arrive lowercase (HTTP header names are case-insensitive).
2957
+ * @example {
2958
+ * "content-length": "10485760",
2959
+ * "content-type": "video/mp4"
2960
+ * }
2961
+ */
2962
+ headers: Record<string, never>;
2963
+ /**
2964
+ * @example PUT
2965
+ * @enum {string}
2966
+ */
2967
+ method: "PUT";
2968
+ /**
2969
+ * @description Presigned PUT URL — upload the raw bytes here.
2970
+ * @example https://…r2.cloudflarestorage.com/…?X-Amz-Signature=…
2971
+ */
2972
+ url: string;
2973
+ };
2910
2974
  AuditListResponseDto: {
2911
2975
  data: components["schemas"]["ModerationActionResponseDto"][];
2912
2976
  pagination: components["schemas"]["PaginationResponseDto"];
@@ -6222,7 +6286,9 @@ interface components {
6222
6286
  * @example ready
6223
6287
  * @enum {string}
6224
6288
  */
6225
- status: "processing" | "ready" | "failed";
6289
+ status: "uploading" | "processing" | "ready" | "failed";
6290
+ /** @description Present only on video creation — PUT the bytes here, then POST /assets/:id/complete. */
6291
+ upload?: components["schemas"]["AssetUploadDto"];
6226
6292
  };
6227
6293
  UpsertActorDto: {
6228
6294
  /**
@@ -8500,7 +8566,10 @@ interface operations {
8500
8566
  AssetController_upload: {
8501
8567
  parameters: {
8502
8568
  query?: never;
8503
- header?: never;
8569
+ header?: {
8570
+ /** @description Makes retries safe. */
8571
+ "Idempotency-Key"?: string;
8572
+ };
8504
8573
  path: {
8505
8574
  /** @description Community UUID. */
8506
8575
  communityId: string;
@@ -8509,19 +8578,54 @@ interface operations {
8509
8578
  };
8510
8579
  requestBody: {
8511
8580
  content: {
8581
+ "application/json": {
8582
+ /** @description Video path: declared size in bytes (≤512 MB). */
8583
+ byte_size?: number;
8584
+ /**
8585
+ * @description Video path: declared container type.
8586
+ * @enum {string}
8587
+ */
8588
+ content_type?: "video/mp4" | "video/quicktime" | "video/webm";
8589
+ /**
8590
+ * Format: binary
8591
+ * @description PNG / JPEG / WEBP, ≤10 MB — image path (multipart) only.
8592
+ */
8593
+ file?: string;
8594
+ /**
8595
+ * @description Pass 'video' (JSON body) for the presigned-PUT flow.
8596
+ * @default image
8597
+ * @enum {string}
8598
+ */
8599
+ kind?: "image" | "video";
8600
+ /** Format: uuid */
8601
+ owner_actor_id: string;
8602
+ };
8512
8603
  "multipart/form-data": {
8604
+ /** @description Video path: declared size in bytes (≤512 MB). */
8605
+ byte_size?: number;
8606
+ /**
8607
+ * @description Video path: declared container type.
8608
+ * @enum {string}
8609
+ */
8610
+ content_type?: "video/mp4" | "video/quicktime" | "video/webm";
8513
8611
  /**
8514
8612
  * Format: binary
8515
- * @description PNG / JPEG / WEBP, ≤10 MB.
8613
+ * @description PNG / JPEG / WEBP, ≤10 MB — image path (multipart) only.
8516
8614
  */
8517
- file: string;
8615
+ file?: string;
8616
+ /**
8617
+ * @description Pass 'video' (JSON body) for the presigned-PUT flow.
8618
+ * @default image
8619
+ * @enum {string}
8620
+ */
8621
+ kind?: "image" | "video";
8518
8622
  /** Format: uuid */
8519
8623
  owner_actor_id: string;
8520
8624
  };
8521
8625
  };
8522
8626
  };
8523
8627
  responses: {
8524
- /** @description Asset stored and ready. */
8628
+ /** @description Image stored and ready, or video created in `uploading` with `upload` instructions. */
8525
8629
  201: {
8526
8630
  headers: {
8527
8631
  [name: string]: unknown;
@@ -8530,7 +8634,7 @@ interface operations {
8530
8634
  "application/json": components["schemas"]["UploadAssetResponseDto"];
8531
8635
  };
8532
8636
  };
8533
- /** @description Missing/oversize/wrong-type file, or the bytes do not match the declared image type. */
8637
+ /** @description Missing/oversize/wrong-type file or declaration, or the bytes do not match the declared image type. */
8534
8638
  400: {
8535
8639
  headers: {
8536
8640
  [name: string]: unknown;
@@ -8566,6 +8670,15 @@ interface operations {
8566
8670
  "application/json": components["schemas"]["ErrorResponseDto"];
8567
8671
  };
8568
8672
  };
8673
+ /** @description `TOO_MANY_ACTIVE_UPLOADS` — the community already has the max videos uploading/processing. */
8674
+ 429: {
8675
+ headers: {
8676
+ [name: string]: unknown;
8677
+ };
8678
+ content: {
8679
+ "application/json": components["schemas"]["ErrorResponseDto"];
8680
+ };
8681
+ };
8569
8682
  };
8570
8683
  };
8571
8684
  AssetController_get: {
@@ -8650,6 +8763,61 @@ interface operations {
8650
8763
  };
8651
8764
  };
8652
8765
  };
8766
+ AssetController_complete: {
8767
+ parameters: {
8768
+ query?: never;
8769
+ header?: {
8770
+ /** @description Makes retries safe. */
8771
+ "Idempotency-Key"?: string;
8772
+ };
8773
+ path: {
8774
+ /** @description Community UUID. */
8775
+ communityId: string;
8776
+ /** @description Video asset UUID (status `uploading`). */
8777
+ assetId: string;
8778
+ };
8779
+ cookie?: never;
8780
+ };
8781
+ requestBody?: never;
8782
+ responses: {
8783
+ /** @description Finalized (`processing`) — or the current status on replay. */
8784
+ 200: {
8785
+ headers: {
8786
+ [name: string]: unknown;
8787
+ };
8788
+ content: {
8789
+ "application/json": components["schemas"]["UploadAssetResponseDto"];
8790
+ };
8791
+ };
8792
+ /** @description PAK lacks `social.assets.write`. */
8793
+ 403: {
8794
+ headers: {
8795
+ [name: string]: unknown;
8796
+ };
8797
+ content: {
8798
+ "application/json": components["schemas"]["ErrorResponseDto"];
8799
+ };
8800
+ };
8801
+ /** @description Asset not found in this community. */
8802
+ 404: {
8803
+ headers: {
8804
+ [name: string]: unknown;
8805
+ };
8806
+ content: {
8807
+ "application/json": components["schemas"]["ErrorResponseDto"];
8808
+ };
8809
+ };
8810
+ /** @description `ASSET_UPLOAD_INCOMPLETE` (no object / size mismatch — still retryable), `ASSET_TOO_LARGE` or `ASSET_INVALID_CONTAINER` (upload failed + object deleted), or `ASSET_NOT_VIDEO`. */
8811
+ 422: {
8812
+ headers: {
8813
+ [name: string]: unknown;
8814
+ };
8815
+ content: {
8816
+ "application/json": components["schemas"]["ErrorResponseDto"];
8817
+ };
8818
+ };
8819
+ };
8820
+ };
8653
8821
  EdgeController_block: {
8654
8822
  parameters: {
8655
8823
  query?: never;
package/dist/index.d.ts CHANGED
@@ -737,7 +737,7 @@ interface paths {
737
737
  };
738
738
  get?: never;
739
739
  put?: never;
740
- /** Upload an image. Processed synchronously (EXIF stripped, renditions generated) and stored in a private bucket. Returns the asset id + status. */
740
+ /** Upload media. Images (multipart): processed synchronously, returns ready. Videos (JSON, kind:'video' + declared content_type/byte_size): returns an `uploading` asset with a presigned PUT — upload the bytes, then POST /assets/:id/complete. */
741
741
  post: operations["AssetController_upload"];
742
742
  delete?: never;
743
743
  options?: never;
@@ -763,6 +763,23 @@ interface paths {
763
763
  patch?: never;
764
764
  trace?: never;
765
765
  };
766
+ "/v1/communities/{communityId}/assets/{assetId}/complete": {
767
+ parameters: {
768
+ query?: never;
769
+ header?: never;
770
+ path?: never;
771
+ cookie?: never;
772
+ };
773
+ get?: never;
774
+ put?: never;
775
+ /** Finalize a presigned-PUT video upload. Verifies the stored object (existence, size, container magic bytes) and enqueues the transcode. Replaying on a finalized asset returns its current status without re-enqueueing. */
776
+ post: operations["AssetController_complete"];
777
+ delete?: never;
778
+ options?: never;
779
+ head?: never;
780
+ patch?: never;
781
+ trace?: never;
782
+ };
766
783
  "/v1/communities/{communityId}/blocks": {
767
784
  parameters: {
768
785
  query?: never;
@@ -2862,21 +2879,27 @@ interface components {
2862
2879
  byte_size: number;
2863
2880
  /** @example image/jpeg */
2864
2881
  content_type: string;
2865
- /** @example 960 */
2866
- height: number;
2867
2882
  /**
2868
- * @description Ladder rung.
2883
+ * @description Null on the un-probed video original.
2884
+ * @example 960
2885
+ */
2886
+ height: number | null;
2887
+ /**
2888
+ * @description Ladder rung — original/medium/thumb for images, original/video/poster for videos.
2869
2889
  * @example medium
2870
2890
  * @enum {string}
2871
2891
  */
2872
- name: "original" | "medium" | "thumb";
2892
+ name: "original" | "medium" | "thumb" | "video" | "poster";
2873
2893
  /**
2874
2894
  * @description Short-lived presigned GET URL (re-minted each read).
2875
2895
  * @example https://…r2.cloudflarestorage.com/…?X-Amz-Signature=…
2876
2896
  */
2877
2897
  url: string;
2878
- /** @example 1280 */
2879
- width: number;
2898
+ /**
2899
+ * @description Null on the un-probed video original.
2900
+ * @example 1280
2901
+ */
2902
+ width: number | null;
2880
2903
  };
2881
2904
  AssetResponseDto: {
2882
2905
  /**
@@ -2890,23 +2913,64 @@ interface components {
2890
2913
  content_type: string;
2891
2914
  /** @example 2026-05-01T12:00:00.000Z */
2892
2915
  created_at: string;
2916
+ /**
2917
+ * @description Output duration in seconds — ready videos only.
2918
+ * @example 12.48
2919
+ */
2920
+ duration_s: number | null;
2921
+ /**
2922
+ * @description Stable code when status='failed' — ASSET_TOO_LARGE, ASSET_INVALID_CONTAINER, ASSET_DURATION_EXCEEDED, ASSET_TRANSCODE_FAILED, ASSET_PROCESSING_FAILED.
2923
+ * @example null
2924
+ */
2925
+ failure_reason: string | null;
2893
2926
  /** @example 4032 */
2894
2927
  height: number | null;
2895
2928
  /** @example eeeeeeee-0000-0000-0000-000000000001 */
2896
2929
  id: string;
2930
+ /**
2931
+ * @example image
2932
+ * @enum {string}
2933
+ */
2934
+ kind: "image" | "video";
2897
2935
  /** @example aaaaaaaa-0000-0000-0000-000000000001 */
2898
2936
  owner_actor_id: string;
2899
2937
  renditions: components["schemas"]["AssetRenditionDto"][];
2900
2938
  /**
2939
+ * @description Videos: uploading → processing → ready | failed. Images never enter 'uploading'.
2901
2940
  * @example ready
2902
2941
  * @enum {string}
2903
2942
  */
2904
- status: "processing" | "ready" | "failed";
2943
+ status: "uploading" | "processing" | "ready" | "failed";
2905
2944
  /** @example 2026-05-01T12:00:00.000Z */
2906
2945
  updated_at: string;
2907
2946
  /** @example 3024 */
2908
2947
  width: number | null;
2909
2948
  };
2949
+ AssetUploadDto: {
2950
+ /**
2951
+ * @description Signature expiry — finish the PUT before this.
2952
+ * @example 2026-05-01T12:15:00.000Z
2953
+ */
2954
+ expires_at: string;
2955
+ /**
2956
+ * @description Headers the PUT must carry — they are bound into the signature. Keys arrive lowercase (HTTP header names are case-insensitive).
2957
+ * @example {
2958
+ * "content-length": "10485760",
2959
+ * "content-type": "video/mp4"
2960
+ * }
2961
+ */
2962
+ headers: Record<string, never>;
2963
+ /**
2964
+ * @example PUT
2965
+ * @enum {string}
2966
+ */
2967
+ method: "PUT";
2968
+ /**
2969
+ * @description Presigned PUT URL — upload the raw bytes here.
2970
+ * @example https://…r2.cloudflarestorage.com/…?X-Amz-Signature=…
2971
+ */
2972
+ url: string;
2973
+ };
2910
2974
  AuditListResponseDto: {
2911
2975
  data: components["schemas"]["ModerationActionResponseDto"][];
2912
2976
  pagination: components["schemas"]["PaginationResponseDto"];
@@ -6222,7 +6286,9 @@ interface components {
6222
6286
  * @example ready
6223
6287
  * @enum {string}
6224
6288
  */
6225
- status: "processing" | "ready" | "failed";
6289
+ status: "uploading" | "processing" | "ready" | "failed";
6290
+ /** @description Present only on video creation — PUT the bytes here, then POST /assets/:id/complete. */
6291
+ upload?: components["schemas"]["AssetUploadDto"];
6226
6292
  };
6227
6293
  UpsertActorDto: {
6228
6294
  /**
@@ -8500,7 +8566,10 @@ interface operations {
8500
8566
  AssetController_upload: {
8501
8567
  parameters: {
8502
8568
  query?: never;
8503
- header?: never;
8569
+ header?: {
8570
+ /** @description Makes retries safe. */
8571
+ "Idempotency-Key"?: string;
8572
+ };
8504
8573
  path: {
8505
8574
  /** @description Community UUID. */
8506
8575
  communityId: string;
@@ -8509,19 +8578,54 @@ interface operations {
8509
8578
  };
8510
8579
  requestBody: {
8511
8580
  content: {
8581
+ "application/json": {
8582
+ /** @description Video path: declared size in bytes (≤512 MB). */
8583
+ byte_size?: number;
8584
+ /**
8585
+ * @description Video path: declared container type.
8586
+ * @enum {string}
8587
+ */
8588
+ content_type?: "video/mp4" | "video/quicktime" | "video/webm";
8589
+ /**
8590
+ * Format: binary
8591
+ * @description PNG / JPEG / WEBP, ≤10 MB — image path (multipart) only.
8592
+ */
8593
+ file?: string;
8594
+ /**
8595
+ * @description Pass 'video' (JSON body) for the presigned-PUT flow.
8596
+ * @default image
8597
+ * @enum {string}
8598
+ */
8599
+ kind?: "image" | "video";
8600
+ /** Format: uuid */
8601
+ owner_actor_id: string;
8602
+ };
8512
8603
  "multipart/form-data": {
8604
+ /** @description Video path: declared size in bytes (≤512 MB). */
8605
+ byte_size?: number;
8606
+ /**
8607
+ * @description Video path: declared container type.
8608
+ * @enum {string}
8609
+ */
8610
+ content_type?: "video/mp4" | "video/quicktime" | "video/webm";
8513
8611
  /**
8514
8612
  * Format: binary
8515
- * @description PNG / JPEG / WEBP, ≤10 MB.
8613
+ * @description PNG / JPEG / WEBP, ≤10 MB — image path (multipart) only.
8516
8614
  */
8517
- file: string;
8615
+ file?: string;
8616
+ /**
8617
+ * @description Pass 'video' (JSON body) for the presigned-PUT flow.
8618
+ * @default image
8619
+ * @enum {string}
8620
+ */
8621
+ kind?: "image" | "video";
8518
8622
  /** Format: uuid */
8519
8623
  owner_actor_id: string;
8520
8624
  };
8521
8625
  };
8522
8626
  };
8523
8627
  responses: {
8524
- /** @description Asset stored and ready. */
8628
+ /** @description Image stored and ready, or video created in `uploading` with `upload` instructions. */
8525
8629
  201: {
8526
8630
  headers: {
8527
8631
  [name: string]: unknown;
@@ -8530,7 +8634,7 @@ interface operations {
8530
8634
  "application/json": components["schemas"]["UploadAssetResponseDto"];
8531
8635
  };
8532
8636
  };
8533
- /** @description Missing/oversize/wrong-type file, or the bytes do not match the declared image type. */
8637
+ /** @description Missing/oversize/wrong-type file or declaration, or the bytes do not match the declared image type. */
8534
8638
  400: {
8535
8639
  headers: {
8536
8640
  [name: string]: unknown;
@@ -8566,6 +8670,15 @@ interface operations {
8566
8670
  "application/json": components["schemas"]["ErrorResponseDto"];
8567
8671
  };
8568
8672
  };
8673
+ /** @description `TOO_MANY_ACTIVE_UPLOADS` — the community already has the max videos uploading/processing. */
8674
+ 429: {
8675
+ headers: {
8676
+ [name: string]: unknown;
8677
+ };
8678
+ content: {
8679
+ "application/json": components["schemas"]["ErrorResponseDto"];
8680
+ };
8681
+ };
8569
8682
  };
8570
8683
  };
8571
8684
  AssetController_get: {
@@ -8650,6 +8763,61 @@ interface operations {
8650
8763
  };
8651
8764
  };
8652
8765
  };
8766
+ AssetController_complete: {
8767
+ parameters: {
8768
+ query?: never;
8769
+ header?: {
8770
+ /** @description Makes retries safe. */
8771
+ "Idempotency-Key"?: string;
8772
+ };
8773
+ path: {
8774
+ /** @description Community UUID. */
8775
+ communityId: string;
8776
+ /** @description Video asset UUID (status `uploading`). */
8777
+ assetId: string;
8778
+ };
8779
+ cookie?: never;
8780
+ };
8781
+ requestBody?: never;
8782
+ responses: {
8783
+ /** @description Finalized (`processing`) — or the current status on replay. */
8784
+ 200: {
8785
+ headers: {
8786
+ [name: string]: unknown;
8787
+ };
8788
+ content: {
8789
+ "application/json": components["schemas"]["UploadAssetResponseDto"];
8790
+ };
8791
+ };
8792
+ /** @description PAK lacks `social.assets.write`. */
8793
+ 403: {
8794
+ headers: {
8795
+ [name: string]: unknown;
8796
+ };
8797
+ content: {
8798
+ "application/json": components["schemas"]["ErrorResponseDto"];
8799
+ };
8800
+ };
8801
+ /** @description Asset not found in this community. */
8802
+ 404: {
8803
+ headers: {
8804
+ [name: string]: unknown;
8805
+ };
8806
+ content: {
8807
+ "application/json": components["schemas"]["ErrorResponseDto"];
8808
+ };
8809
+ };
8810
+ /** @description `ASSET_UPLOAD_INCOMPLETE` (no object / size mismatch — still retryable), `ASSET_TOO_LARGE` or `ASSET_INVALID_CONTAINER` (upload failed + object deleted), or `ASSET_NOT_VIDEO`. */
8811
+ 422: {
8812
+ headers: {
8813
+ [name: string]: unknown;
8814
+ };
8815
+ content: {
8816
+ "application/json": components["schemas"]["ErrorResponseDto"];
8817
+ };
8818
+ };
8819
+ };
8820
+ };
8653
8821
  EdgeController_block: {
8654
8822
  parameters: {
8655
8823
  query?: never;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@productcraft/social",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Social-as-a-service backend — communities, posts, ranked feeds, stories, direct conversations, notifications, moderation, flags via ProductCraft Social. Generated from the production OpenAPI spec.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",