@vxil/feature-configs 0.9.0 → 0.9.1

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.ts CHANGED
@@ -362,7 +362,7 @@ export declare const FilesConfigSchema: import("@sinclair/typebox").TObject<{
362
362
  downloadUrlTtl: import("@sinclair/typebox").TInteger;
363
363
  quotas: import("@sinclair/typebox").TObject<{
364
364
  maxObjectBytes: import("@sinclair/typebox").TInteger;
365
- maxTotalBytes: import("@sinclair/typebox").TInteger;
365
+ maxTotalBytes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
366
366
  maxObjectCount: import("@sinclair/typebox").TInteger;
367
367
  }>;
368
368
  allowedContentTypes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
package/dist/index.js CHANGED
@@ -700,11 +700,16 @@ export const FilesConfigSchema = Type.Object({
700
700
  quotas: Type.Object({
701
701
  // maximum caps are a defense-in-depth ceiling on tenant-editable storage —
702
702
  // object storage is cheap but the database-resident metadata + abuse aren't
703
- // (pricing review 2026-07-10). 5 GiB/object, 1 TiB/tenant absolute; true PER-TIER clamps
704
- // (Free/Dev 10 GB · Team 50 GB · Business 256 GB) are a follow-up needing the
705
- // tenant tier threaded to files-v1 (plan tiers).
703
+ // (pricing review 2026-07-10). 5 GiB/object, 1 TiB/tenant absolute.
706
704
  maxObjectBytes: Type.Integer({ default: 100 * 1024 * 1024, minimum: 1, maximum: 5 * 1024 * 1024 * 1024 }),
707
- maxTotalBytes: Type.Integer({ default: 10 * 1024 * 1024 * 1024, minimum: 1, maximum: 1024 * 1024 * 1024 * 1024 }),
705
+ // NO default (2026-10-04): UNSET means "the plan's storage ceiling"
706
+ // (control-plane plans.ts FILES_MAX_TOTAL_BYTES_BY_TIER — Free/Developer
707
+ // 10 GiB, Team 50 GiB, Business 256 GiB, Enterprise 1 TiB), resolved by
708
+ // files-v1 where the quota is enforced, so a plan change applies at once.
709
+ // A value is the project's own LOWER cap (above the plan → 422 at config
710
+ // write; a downgrade clamps it). It used to default to 10 GiB on every
711
+ // plan, so a Team project that never set it stayed at 10 GiB.
712
+ maxTotalBytes: Type.Optional(Type.Integer({ minimum: 1, maximum: 1024 * 1024 * 1024 * 1024 })),
708
713
  maxObjectCount: Type.Integer({ default: 100000, minimum: 1, maximum: 100_000_000 }),
709
714
  }, { default: {} }),
710
715
  allowedContentTypes: Type.Array(Type.String(), { default: ['*'], maxItems: 100 }),
@@ -726,7 +731,7 @@ export const FilesConfigSchema = Type.Object({
726
731
  enabled: Type.Boolean({ default: false }),
727
732
  // per-bucket default; omitted = never expire by default
728
733
  defaultExpiresInSeconds: Type.Optional(Type.Integer({ minimum: 60 })),
729
- sweepCron: Type.String({ default: '0 * * * *' }), // jobs-v1 TTL sweep schedule
734
+ sweepCron: Type.String({ default: '*/15 * * * *' }), // jobs-v1 TTL sweep schedule (every 15 min since 2026-10-04; was hourly)
730
735
  })),
731
736
  extractText: Type.Optional(Type.Object({
732
737
  enabled: Type.Boolean({ default: false }),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vxil/feature-configs",
3
- "version": "0.9.0",
3
+ "version": "0.9.1",
4
4
  "description": "The per-feature configuration schemas and validators behind vxil.config.ts (published for @vxil/cli and @vxil/config).",
5
5
  "license": "MIT",
6
6
  "homepage": "https://vxil.com",
package/src/index.ts CHANGED
@@ -823,11 +823,16 @@ export const FilesConfigSchema = Type.Object({
823
823
  {
824
824
  // maximum caps are a defense-in-depth ceiling on tenant-editable storage —
825
825
  // object storage is cheap but the database-resident metadata + abuse aren't
826
- // (pricing review 2026-07-10). 5 GiB/object, 1 TiB/tenant absolute; true PER-TIER clamps
827
- // (Free/Dev 10 GB · Team 50 GB · Business 256 GB) are a follow-up needing the
828
- // tenant tier threaded to files-v1 (plan tiers).
826
+ // (pricing review 2026-07-10). 5 GiB/object, 1 TiB/tenant absolute.
829
827
  maxObjectBytes: Type.Integer({ default: 100 * 1024 * 1024, minimum: 1, maximum: 5 * 1024 * 1024 * 1024 }),
830
- maxTotalBytes: Type.Integer({ default: 10 * 1024 * 1024 * 1024, minimum: 1, maximum: 1024 * 1024 * 1024 * 1024 }),
828
+ // NO default (2026-10-04): UNSET means "the plan's storage ceiling"
829
+ // (control-plane plans.ts FILES_MAX_TOTAL_BYTES_BY_TIER — Free/Developer
830
+ // 10 GiB, Team 50 GiB, Business 256 GiB, Enterprise 1 TiB), resolved by
831
+ // files-v1 where the quota is enforced, so a plan change applies at once.
832
+ // A value is the project's own LOWER cap (above the plan → 422 at config
833
+ // write; a downgrade clamps it). It used to default to 10 GiB on every
834
+ // plan, so a Team project that never set it stayed at 10 GiB.
835
+ maxTotalBytes: Type.Optional(Type.Integer({ minimum: 1, maximum: 1024 * 1024 * 1024 * 1024 })),
831
836
  maxObjectCount: Type.Integer({ default: 100000, minimum: 1, maximum: 100_000_000 }),
832
837
  },
833
838
  { default: {} },
@@ -854,7 +859,7 @@ export const FilesConfigSchema = Type.Object({
854
859
  enabled: Type.Boolean({ default: false }),
855
860
  // per-bucket default; omitted = never expire by default
856
861
  defaultExpiresInSeconds: Type.Optional(Type.Integer({ minimum: 60 })),
857
- sweepCron: Type.String({ default: '0 * * * *' }), // jobs-v1 TTL sweep schedule
862
+ sweepCron: Type.String({ default: '*/15 * * * *' }), // jobs-v1 TTL sweep schedule (every 15 min since 2026-10-04; was hourly)
858
863
  })),
859
864
  extractText: Type.Optional(Type.Object({
860
865
  enabled: Type.Boolean({ default: false }),