@selvajs/platform 0.14.3-beta.0 → 0.15.0-beta.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.
Files changed (145) hide show
  1. package/LICENSE +1 -1
  2. package/dist/auth.d.ts +60 -0
  3. package/dist/auth.d.ts.map +1 -0
  4. package/dist/auth.js +12 -0
  5. package/dist/auth.js.map +1 -0
  6. package/dist/compute.d.ts +47 -0
  7. package/dist/compute.d.ts.map +1 -0
  8. package/dist/compute.js +11 -0
  9. package/dist/compute.js.map +1 -0
  10. package/dist/data/interface.d.ts +33 -0
  11. package/dist/data/interface.d.ts.map +1 -1
  12. package/dist/definitions/interface.d.ts +10 -0
  13. package/dist/definitions/interface.d.ts.map +1 -1
  14. package/dist/definitions/schemas.d.ts +1 -0
  15. package/dist/definitions/schemas.d.ts.map +1 -1
  16. package/dist/definitions/schemas.js +3 -0
  17. package/dist/definitions/schemas.js.map +1 -1
  18. package/dist/definitions/service.d.ts +62 -0
  19. package/dist/definitions/service.d.ts.map +1 -0
  20. package/dist/definitions/service.js +149 -0
  21. package/dist/definitions/service.js.map +1 -0
  22. package/dist/definitions/types.d.ts +24 -1
  23. package/dist/definitions/types.d.ts.map +1 -1
  24. package/dist/definitions.d.ts +146 -0
  25. package/dist/definitions.d.ts.map +1 -0
  26. package/dist/definitions.js +23 -0
  27. package/dist/definitions.js.map +1 -0
  28. package/dist/events/interface.d.ts +23 -0
  29. package/dist/events/interface.d.ts.map +1 -1
  30. package/dist/events/interface.js.map +1 -1
  31. package/dist/index.d.ts +3 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +1 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/invites/schemas.d.ts +24 -0
  36. package/dist/invites/schemas.d.ts.map +1 -0
  37. package/dist/invites/schemas.js +17 -0
  38. package/dist/invites/schemas.js.map +1 -0
  39. package/dist/metrics/interface.d.ts +6 -0
  40. package/dist/metrics/interface.d.ts.map +1 -1
  41. package/dist/metrics/interface.js.map +1 -1
  42. package/dist/organizations.d.ts +93 -0
  43. package/dist/organizations.d.ts.map +1 -0
  44. package/dist/organizations.js +14 -0
  45. package/dist/organizations.js.map +1 -0
  46. package/dist/solveCache/interface.d.ts +86 -0
  47. package/dist/solveCache/interface.d.ts.map +1 -0
  48. package/dist/solveCache/interface.js +12 -0
  49. package/dist/solveCache/interface.js.map +1 -0
  50. package/dist/testing/adapterSuite.d.ts +33 -0
  51. package/dist/testing/adapterSuite.d.ts.map +1 -0
  52. package/dist/testing/adapterSuite.js +166 -0
  53. package/dist/testing/adapterSuite.js.map +1 -0
  54. package/dist/testing/suites/definitionStoreSuite.d.ts.map +1 -1
  55. package/dist/testing/suites/definitionStoreSuite.js +57 -0
  56. package/dist/testing/suites/definitionStoreSuite.js.map +1 -1
  57. package/dist/testing/suites/eventSinkSuite.js +1 -0
  58. package/dist/testing/suites/eventSinkSuite.js.map +1 -1
  59. package/dist/testing/suites/platformPermissionStoreSuite.d.ts +9 -0
  60. package/dist/testing/suites/platformPermissionStoreSuite.d.ts.map +1 -1
  61. package/dist/testing/suites/platformPermissionStoreSuite.js +34 -1
  62. package/dist/testing/suites/platformPermissionStoreSuite.js.map +1 -1
  63. package/dist/testing/suites/runner.d.ts +21 -0
  64. package/dist/testing/suites/runner.d.ts.map +1 -0
  65. package/dist/testing/suites/runner.js +7 -0
  66. package/dist/testing/suites/runner.js.map +1 -0
  67. package/package.json +9 -24
  68. package/src/access/index.ts +0 -23
  69. package/src/access/rules.ts +0 -276
  70. package/src/auth/index.ts +0 -8
  71. package/src/auth/interface.ts +0 -279
  72. package/src/auth/types.ts +0 -32
  73. package/src/bindings/index.ts +0 -2
  74. package/src/bindings/interface.ts +0 -61
  75. package/src/computeServer/index.ts +0 -28
  76. package/src/computeServer/interface.ts +0 -73
  77. package/src/computeServer/secrets.ts +0 -102
  78. package/src/computeServer/types.ts +0 -74
  79. package/src/computeServer/utils.ts +0 -112
  80. package/src/config.ts +0 -99
  81. package/src/context.ts +0 -80
  82. package/src/data/index.ts +0 -1
  83. package/src/data/interface.ts +0 -70
  84. package/src/definitions/index.ts +0 -26
  85. package/src/definitions/interface.ts +0 -87
  86. package/src/definitions/paths.ts +0 -31
  87. package/src/definitions/schemas.ts +0 -64
  88. package/src/definitions/types.ts +0 -111
  89. package/src/errors/interface.ts +0 -45
  90. package/src/errors.ts +0 -16
  91. package/src/events/audit.ts +0 -67
  92. package/src/events/index.ts +0 -9
  93. package/src/events/interface.ts +0 -102
  94. package/src/index.ts +0 -247
  95. package/src/invites/index.ts +0 -2
  96. package/src/invites/interface.ts +0 -38
  97. package/src/invites/types.ts +0 -39
  98. package/src/metrics/interface.ts +0 -86
  99. package/src/organizations/index.ts +0 -23
  100. package/src/organizations/interface.ts +0 -68
  101. package/src/organizations/paths.ts +0 -45
  102. package/src/organizations/schemas.ts +0 -61
  103. package/src/organizations/types.ts +0 -41
  104. package/src/pagination.ts +0 -45
  105. package/src/permissions/index.ts +0 -3
  106. package/src/permissions/interface.ts +0 -60
  107. package/src/permissions/types.ts +0 -21
  108. package/src/platformProjects/index.ts +0 -3
  109. package/src/platformProjects/interface.ts +0 -27
  110. package/src/platformProjects/schemas.ts +0 -13
  111. package/src/platformProjects/types.ts +0 -22
  112. package/src/projects/index.ts +0 -4
  113. package/src/projects/interface.ts +0 -58
  114. package/src/projects/schemas.ts +0 -28
  115. package/src/projects/types.ts +0 -36
  116. package/src/shareLinks/index.ts +0 -5
  117. package/src/shareLinks/interface.ts +0 -35
  118. package/src/shareLinks/schemas.ts +0 -21
  119. package/src/shareLinks/types.ts +0 -34
  120. package/src/storage/assetClasses.ts +0 -134
  121. package/src/storage/cacheBust.ts +0 -26
  122. package/src/storage/image.ts +0 -82
  123. package/src/storage/index.ts +0 -12
  124. package/src/storage/interface.ts +0 -27
  125. package/src/testing/index.ts +0 -47
  126. package/src/testing/suites/authProviderSuite.ts +0 -207
  127. package/src/testing/suites/computeServerStoreSuite.ts +0 -195
  128. package/src/testing/suites/definitionStoreSuite.ts +0 -630
  129. package/src/testing/suites/emailLinkAuthSuite.ts +0 -83
  130. package/src/testing/suites/eventSinkSuite.ts +0 -379
  131. package/src/testing/suites/helpers.ts +0 -87
  132. package/src/testing/suites/inviteStoreSuite.ts +0 -143
  133. package/src/testing/suites/orgStoreSuite.ts +0 -429
  134. package/src/testing/suites/platformPermissionStoreSuite.ts +0 -196
  135. package/src/testing/suites/platformProjectGrantStoreSuite.ts +0 -166
  136. package/src/testing/suites/projectStoreSuite.ts +0 -381
  137. package/src/testing/suites/shareLinkStoreSuite.ts +0 -203
  138. package/src/testing/suites/solveMetricSinkSuite.ts +0 -135
  139. package/src/testing/suites/storageProviderSuite.ts +0 -196
  140. package/src/testing/suites/userProfileStoreSuite.ts +0 -134
  141. package/src/userProfile/index.ts +0 -3
  142. package/src/userProfile/interface.ts +0 -48
  143. package/src/userProfile/types.ts +0 -24
  144. package/src/utils/audit.ts +0 -46
  145. package/src/utils/index.ts +0 -2
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 Selva FelixBrunold VektorNode
3
+ Copyright (c) 2025 Selva VektorNode AG
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/dist/auth.d.ts ADDED
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Authentication provider interface.
3
+ *
4
+ * Implement this to plug in any auth backend:
5
+ * - Local HMAC sessions (built-in default)
6
+ * - Firebase Auth
7
+ * - Supabase Auth
8
+ * - AWS Cognito
9
+ * - Any OIDC/JWT provider
10
+ */
11
+ export type UserRole = 'platform_admin' | 'user';
12
+ export interface AuthUser {
13
+ id: string;
14
+ email?: string;
15
+ displayName?: string;
16
+ role: UserRole;
17
+ metadata?: Record<string, unknown>;
18
+ }
19
+ export interface IAuthProvider {
20
+ /**
21
+ * Verify a token string — session cookie value, JWT, Firebase ID token, etc.
22
+ * Returns the authenticated user, or null if the token is invalid or expired.
23
+ */
24
+ verifyToken(token: string): Promise<AuthUser | null>;
25
+ /**
26
+ * Look up a user by their provider-specific ID.
27
+ * Returns null if the user does not exist.
28
+ */
29
+ getUser(id: string): Promise<AuthUser | null>;
30
+ /**
31
+ * Create a new opaque session token for an authenticated user.
32
+ * Stored in a cookie by the transport layer. Format is provider-specific:
33
+ * HMAC string, signed JWT, Firebase custom token, etc.
34
+ */
35
+ createSessionToken(user: AuthUser): Promise<string>;
36
+ /**
37
+ * Verify login credentials (email + password).
38
+ * Returns the authenticated user, or null if credentials are invalid.
39
+ * Email may be an empty string for password-only auth (no users.json configured).
40
+ */
41
+ verifyLoginCredentials(email: string, password: string): Promise<AuthUser | null>;
42
+ /**
43
+ * List all users. Returns null if this provider does not support user management
44
+ * (e.g. single-password mode).
45
+ */
46
+ listUsers(): Promise<AuthUser[] | null>;
47
+ /**
48
+ * Create a new user. Returns null if not supported.
49
+ */
50
+ createUser(email: string, password: string, role: UserRole): Promise<AuthUser | null>;
51
+ /**
52
+ * Update a user's role. Returns false if not supported or user not found.
53
+ */
54
+ updateUserRole(id: string, role: UserRole): Promise<boolean>;
55
+ /**
56
+ * Delete a user by ID. Returns false if not supported or user not found.
57
+ */
58
+ deleteUser(id: string): Promise<boolean>;
59
+ }
60
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,MAAM,QAAQ,GAAG,gBAAgB,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,QAAQ;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,aAAa;IAC7B;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAErD;;;OAGG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAE9C;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpD;;;;OAIG;IACH,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAIlF;;;OAGG;IACH,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC;IAExC;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAEtF;;OAEG;IACH,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE7D;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzC"}
package/dist/auth.js ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Authentication provider interface.
3
+ *
4
+ * Implement this to plug in any auth backend:
5
+ * - Local HMAC sessions (built-in default)
6
+ * - Firebase Auth
7
+ * - Supabase Auth
8
+ * - AWS Cognito
9
+ * - Any OIDC/JWT provider
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Compute server provider interface.
3
+ *
4
+ * Implement to support:
5
+ * - Single server (built-in default)
6
+ * - Server pool with load balancing
7
+ * - Per-definition routing (e.g. definition A always goes to server B)
8
+ * - Dynamic provisioning
9
+ */
10
+ export interface ComputeServerConfig {
11
+ /** UUID v4 primary key */
12
+ id: string;
13
+ /** Human-readable display label */
14
+ label: string;
15
+ /** Base URL of the Rhino.Compute instance, e.g. http://localhost:5000 */
16
+ serverUrl: string;
17
+ /** Optional API key sent as RhinoComputeKey header */
18
+ apiKey?: string;
19
+ /** Request timeout in milliseconds. Default: 30000 */
20
+ timeoutMs?: number;
21
+ /** Number of retries on transient failure. Default: 0 */
22
+ retryCount?: number;
23
+ }
24
+ export interface ComputeConfig {
25
+ servers: ComputeServerConfig[];
26
+ /** UUID of the server to use when no routing rule matches. Falls back to servers[0]. */
27
+ defaultServerId?: string;
28
+ }
29
+ export interface SolveRequest {
30
+ /** GUID of the definition being solved — enables per-definition routing */
31
+ definitionGuid?: string;
32
+ /** Arbitrary hints for routing decisions (e.g. required plugin versions) */
33
+ hints?: Record<string, string>;
34
+ }
35
+ export interface IComputeServerProvider {
36
+ /** Resolve which compute server to use for a given solve request. */
37
+ getServer(request?: SolveRequest): Promise<ComputeServerConfig>;
38
+ /** Return the default server, or undefined if none configured. */
39
+ getDefaultServer(): Promise<ComputeServerConfig | undefined>;
40
+ /** Look up a specific server by its UUID. Returns undefined if not found. */
41
+ getServerById(id: string): Promise<ComputeServerConfig | undefined>;
42
+ /** Return the full config. Used by the admin UI. */
43
+ getConfig(): Promise<ComputeConfig>;
44
+ /** Replace the full config atomically. Used by the admin UI. */
45
+ saveConfig(config: ComputeConfig): Promise<void>;
46
+ }
47
+ //# sourceMappingURL=compute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute.d.ts","sourceRoot":"","sources":["../src/compute.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,mBAAmB;IACnC,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,wFAAwF;IACxF,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC5B,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACtC,qEAAqE;IACrE,SAAS,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAEhE,kEAAkE;IAClE,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAAC;IAE7D,6EAA6E;IAC7E,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAAC;IAEpE,oDAAoD;IACpD,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IAEpC,gEAAgE;IAChE,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Compute server provider interface.
3
+ *
4
+ * Implement to support:
5
+ * - Single server (built-in default)
6
+ * - Server pool with load balancing
7
+ * - Per-definition routing (e.g. definition A always goes to server B)
8
+ * - Dynamic provisioning
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=compute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute.js","sourceRoot":"","sources":["../src/compute.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -21,7 +21,21 @@ import type { IInviteStore } from '../invites/interface.js';
21
21
  import type { IUserProfileStore } from '../userProfile/interface.js';
22
22
  import type { IPlatformPermissionStore } from '../permissions/interface.js';
23
23
  import type { IAuditQuery } from '../events/audit.js';
24
+ import type { IEventSink } from '../events/interface.js';
24
25
  import type { RequestContext } from '../context.js';
26
+ /**
27
+ * Result of the app↔DB schema handshake (audit O3). `expected` is the
28
+ * migration head the running app was built against; `actual` is what the
29
+ * database reports (`null` when the database can't even answer — e.g. the
30
+ * handshake function itself was never migrated in).
31
+ */
32
+ export interface SchemaVersionReport {
33
+ ok: boolean;
34
+ expected: string;
35
+ actual: string | null;
36
+ /** Operator-facing explanation + recovery hint when not ok. */
37
+ message?: string;
38
+ }
25
39
  export interface IDataProvider {
26
40
  orgs: IOrgStore;
27
41
  projects: IProjectStore;
@@ -38,6 +52,25 @@ export interface IDataProvider {
38
52
  * `/admin/audit` UI degrades to its "no backend wired" state.
39
53
  */
40
54
  auditQuery?: IAuditQuery;
55
+ /**
56
+ * The write-side event sink this provider's stores emit into. Optional —
57
+ * exposed so app code with no store mutation to piggyback on (e.g. the
58
+ * self-update route, audit O2) can emit domain events into the same log.
59
+ * Callers fall back to `NoopEventSink` when absent.
60
+ */
61
+ events?: IEventSink;
62
+ /**
63
+ * App↔DB schema handshake (audit O3). Optional — implemented by adapters
64
+ * whose schema is migrated out-of-band (Supabase: `supabase db push` is a
65
+ * manual operator step the app can't run itself). Boot health calls this
66
+ * structurally (same pattern as `IComputeServerStore.verifySecrets`) and
67
+ * drives `/api/health` to 503 when the database is behind the app, so
68
+ * monitoring — and the self-update runner's health probe — catch schema
69
+ * skew instead of surfacing it as per-request store errors.
70
+ *
71
+ * MUST NOT throw: report failure via `ok: false`.
72
+ */
73
+ verifySchemaVersion?(): Promise<SchemaVersionReport>;
41
74
  /**
42
75
  * Idempotently register a user in the data layer. Called by `hooks.server.ts`
43
76
  * after `verifyToken` succeeds, so the data layer always has a row for the
@@ -1 +1 @@
1
- {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/data/interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AACnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,aAAa,EAAE,mBAAmB,CAAC;IACnC,OAAO,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,eAAe,CAAC;IAC5B,WAAW,EAAE,iBAAiB,CAAC;IAC/B,WAAW,EAAE,wBAAwB,CAAC;IACtC,qBAAqB,EAAE,0BAA0B,CAAC;IAClD;;;;OAIG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC;IAEzB;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/D;;;;;;;;;;OAUG;IACH,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE"}
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/data/interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AACnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,aAAa,EAAE,mBAAmB,CAAC;IACnC,OAAO,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,eAAe,CAAC;IAC5B,WAAW,EAAE,iBAAiB,CAAC;IAC/B,WAAW,EAAE,wBAAwB,CAAC;IACtC,qBAAqB,EAAE,0BAA0B,CAAC;IAClD;;;;OAIG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IAEpB;;;;;;;;;;OAUG;IACH,mBAAmB,CAAC,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAErD;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/D;;;;;;;;;;OAUG;IACH,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE"}
@@ -32,6 +32,16 @@ export interface IDefinitionStore {
32
32
  deleteByProject(ctx: RequestContext, projectId: string): Promise<void>;
33
33
  /** Atomic +1 on the solve counter. No-op if the record doesn't exist. */
34
34
  incrementSolveCount(ctx: RequestContext, guid: string): Promise<void>;
35
+ /**
36
+ * Atomically reserve the next `versionNumber` for a new version: returns the
37
+ * current `nextVersionNumber` and advances the counter by 1 in a single
38
+ * operation (so concurrent uploads never collide on a number/fileKey). The
39
+ * counter is monotonic and NEVER decremented — deleting the latest version
40
+ * does not free its number, so a delete-then-reupload mints a fresh number and
41
+ * fresh `fileKey` instead of overwriting the deleted blob's key. Throws if the
42
+ * definition doesn't exist.
43
+ */
44
+ reserveNextVersionNumber(ctx: RequestContext, guid: string): Promise<number>;
35
45
  createVersion(ctx: RequestContext, version: DefinitionVersion): Promise<void>;
36
46
  /** Newest first by `versionNumber`. */
37
47
  listVersions(ctx: RequestContext, definitionId: string, opts?: ListOptions): Promise<Page<DefinitionVersion>>;
@@ -1 +1 @@
1
- {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/definitions/interface.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/definitions/interface.ts"],"names":[],"mappings":"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"}
@@ -54,6 +54,7 @@ export declare const UpdateMetadataInputSchema: z.ZodObject<{
54
54
  tags: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString>>>;
55
55
  projectId: z.ZodOptional<z.ZodString>;
56
56
  computeServerId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
57
+ solveCacheLimit: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
57
58
  status: z.ZodOptional<z.ZodEnum<{
58
59
  draft: "draft";
59
60
  published: "published";
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/definitions/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,UAAU,QAAoE,CAAC;AAE5F,eAAO,MAAM,UAAU,aAAsD,CAAC;AAE9E,eAAO,MAAM,sBAAsB;;;;EAA6C,CAAC;AAEjF,eAAO,MAAM,uBAAuB;;;EAAwB,CAAC;AAE7D,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;iBAclC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;EAA4B,CAAC;AAEjE,oDAAoD;AACpD,eAAO,MAAM,2BAA2B;;;;;;;;iBAQtC,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;iBASpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,uDAAuD;AACvD,eAAO,MAAM,yBAAyB;;kBAIzB,CAAC"}
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/definitions/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,UAAU,QAAoE,CAAC;AAE5F,eAAO,MAAM,UAAU,aAAsD,CAAC;AAE9E,eAAO,MAAM,sBAAsB;;;;EAA6C,CAAC;AAEjF,eAAO,MAAM,uBAAuB;;;EAAwB,CAAC;AAE7D,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;iBAclC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;EAA4B,CAAC;AAEjE,oDAAoD;AACpD,eAAO,MAAM,2BAA2B;;;;;;;;iBAQtC,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;iBAYpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,uDAAuD;AACvD,eAAO,MAAM,yBAAyB;;kBAIzB,CAAC"}
@@ -43,6 +43,9 @@ export const UpdateMetadataInputSchema = z.object({
43
43
  tags: z.array(z.string().max(64)).max(20).nullable().optional(),
44
44
  projectId: GuidSchema.optional(),
45
45
  computeServerId: GuidSchema.nullable().optional(),
46
+ // L2 cache quota (R9): 0 = off, N = per-definition entry cap, null = inherit
47
+ // the global default. Bounded so a settings typo can't request a runaway quota.
48
+ solveCacheLimit: z.number().int().min(0).max(100_000).nullable().optional(),
46
49
  status: DefinitionStatusSchema.optional()
47
50
  });
48
51
  /** Body for `POST /api/definitions/[guid]/publish`. */
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/definitions/schemas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/definitions/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import type { IDataProvider } from '../data/interface.js';
2
+ import type { IStorageProvider } from '../storage/interface.js';
3
+ import type { RequestContext } from '../context.js';
4
+ import type { DefinitionRecord, DefinitionFileExt, DefinitionMeta } from './types.js';
5
+ import type { UpdateMetadataInput } from './schemas.js';
6
+ export interface CreateDefinitionInput {
7
+ guid: string;
8
+ projectId: string;
9
+ ownerId: string;
10
+ fileExt: DefinitionFileExt;
11
+ meta: DefinitionMeta;
12
+ computeServerId?: string;
13
+ maxHistory?: number;
14
+ }
15
+ /**
16
+ * Default age threshold after which a 'pending' record is considered stale.
17
+ * Conservative — covers slow uploads over weak connections.
18
+ */
19
+ export declare const PENDING_GC_AGE_MS: number;
20
+ /**
21
+ * Orchestrates writes that span IDataProvider + IStorageProvider.
22
+ *
23
+ * Ordering rules (see Phase 4 of the provider refactor):
24
+ *
25
+ * create — metadata-first:
26
+ * 1. Write record with status='pending'
27
+ * 2. Upload blob
28
+ * 3. Flip status to 'ready'
29
+ * If step 2 fails the record stays 'pending' with no blob. List queries
30
+ * filter 'pending' by default, so no consumer sees the half-written state.
31
+ * The janitor (gcStalePending) sweeps records older than PENDING_GC_AGE_MS.
32
+ *
33
+ * updateFile — best-effort with retry-safe shape:
34
+ * 1. Archive current file to history blob
35
+ * 2. Append history entry to record
36
+ * 3. Write new file to the active blob path
37
+ * 4. Prune history beyond maxHistory
38
+ * A failure between 2 and 3 leaves the record pointing at a missing active
39
+ * blob. The operation is idempotent — retrying with the same file restores
40
+ * a consistent state. This is an acknowledged limitation; the create path
41
+ * is where orphan risk is highest and is the one we fully guard.
42
+ */
43
+ export declare class DefinitionService {
44
+ private data;
45
+ private storage;
46
+ constructor(data: IDataProvider, storage: IStorageProvider);
47
+ create(ctx: RequestContext, input: CreateDefinitionInput, file: Uint8Array): Promise<DefinitionRecord>;
48
+ updateFile(ctx: RequestContext, guid: string, file: Uint8Array, ext: DefinitionFileExt, originalName: string): Promise<void>;
49
+ updateMeta(ctx: RequestContext, guid: string, patch: UpdateMetadataInput): Promise<void>;
50
+ saveCoverImage(ctx: RequestContext, guid: string, imageData: Uint8Array): Promise<void>;
51
+ revertToVersion(ctx: RequestContext, guid: string, ref: string): Promise<void>;
52
+ delete(ctx: RequestContext, guid: string): Promise<void>;
53
+ /**
54
+ * Janitor — delete records stuck in 'pending' for longer than ageMs and
55
+ * any blobs they may have written. Safe to run on a schedule.
56
+ * Runs under SYSTEM_CONTEXT; callers don't pass one.
57
+ *
58
+ * @returns Number of records reclaimed.
59
+ */
60
+ gcStalePending(ageMs?: number): Promise<number>;
61
+ }
62
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/definitions/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EACX,gBAAgB,EAEhB,iBAAiB,EACjB,cAAc,EACd,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,QAAiB,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,iBAAiB;IAE5B,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,OAAO;gBADP,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,gBAAgB;IAG5B,MAAM,CACX,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,qBAAqB,EAC5B,IAAI,EAAE,UAAU,GACd,OAAO,CAAC,gBAAgB,CAAC;IAiCtB,UAAU,CACf,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,iBAAiB,EACtB,YAAY,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAwCV,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxF,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvF,eAAe,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9E,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9D;;;;;;OAMG;IACG,cAAc,CAAC,KAAK,GAAE,MAA0B,GAAG,OAAO,CAAC,MAAM,CAAC;CASxE"}
@@ -0,0 +1,149 @@
1
+ import { SYSTEM_CONTEXT } from '../context.js';
2
+ import { ProviderError } from '../errors.js';
3
+ import { definitionPaths } from './paths.js';
4
+ /**
5
+ * Default age threshold after which a 'pending' record is considered stale.
6
+ * Conservative — covers slow uploads over weak connections.
7
+ */
8
+ export const PENDING_GC_AGE_MS = 30 * 60 * 1000; // 30 minutes
9
+ /**
10
+ * Orchestrates writes that span IDataProvider + IStorageProvider.
11
+ *
12
+ * Ordering rules (see Phase 4 of the provider refactor):
13
+ *
14
+ * create — metadata-first:
15
+ * 1. Write record with status='pending'
16
+ * 2. Upload blob
17
+ * 3. Flip status to 'ready'
18
+ * If step 2 fails the record stays 'pending' with no blob. List queries
19
+ * filter 'pending' by default, so no consumer sees the half-written state.
20
+ * The janitor (gcStalePending) sweeps records older than PENDING_GC_AGE_MS.
21
+ *
22
+ * updateFile — best-effort with retry-safe shape:
23
+ * 1. Archive current file to history blob
24
+ * 2. Append history entry to record
25
+ * 3. Write new file to the active blob path
26
+ * 4. Prune history beyond maxHistory
27
+ * A failure between 2 and 3 leaves the record pointing at a missing active
28
+ * blob. The operation is idempotent — retrying with the same file restores
29
+ * a consistent state. This is an acknowledged limitation; the create path
30
+ * is where orphan risk is highest and is the one we fully guard.
31
+ */
32
+ export class DefinitionService {
33
+ data;
34
+ storage;
35
+ constructor(data, storage) {
36
+ this.data = data;
37
+ this.storage = storage;
38
+ }
39
+ async create(ctx, input, file) {
40
+ const now = new Date().toISOString();
41
+ const record = {
42
+ guid: input.guid,
43
+ projectId: input.projectId,
44
+ ownerId: input.ownerId,
45
+ fileExt: input.fileExt,
46
+ meta: input.meta,
47
+ computeServerId: input.computeServerId,
48
+ history: [],
49
+ maxHistory: input.maxHistory ?? 10,
50
+ status: 'pending',
51
+ runCount: 0,
52
+ createdAt: now,
53
+ updatedAt: now
54
+ };
55
+ // 1. Metadata first — if this fails there's nothing to clean up.
56
+ await this.data.definitions.create(ctx, record);
57
+ // 2. Blob upload — if this fails the record stays 'pending' for the janitor.
58
+ await this.storage.put(definitionPaths.file(input.guid, input.fileExt), file, 'application/octet-stream');
59
+ // 3. Flip to draft — the record is now visible to editors.
60
+ await this.data.definitions.update(ctx, input.guid, { status: 'draft' });
61
+ return { ...record, status: 'draft' };
62
+ }
63
+ async updateFile(ctx, guid, file, ext, originalName) {
64
+ const existing = await this.data.definitions.get(ctx, guid);
65
+ if (!existing)
66
+ throw new ProviderError(`Definition not found: ${guid}`, 404);
67
+ const now = new Date().toISOString();
68
+ // UUID-based ref avoids collisions from identical timestamps or special chars in filenames.
69
+ const ref = `${crypto.randomUUID()}_${originalName.replace(/[^a-zA-Z0-9._-]/g, '_')}`;
70
+ // Archive the current file before overwriting
71
+ const currentFile = await this.storage.get(definitionPaths.file(guid, existing.fileExt));
72
+ if (currentFile) {
73
+ await this.storage.put(definitionPaths.archive(guid, ref), currentFile, 'application/octet-stream');
74
+ await this.data.definitions.addHistoryEntry(ctx, guid, {
75
+ ref,
76
+ originalName,
77
+ archivedAt: now
78
+ });
79
+ }
80
+ await this.storage.put(definitionPaths.file(guid, ext), file, 'application/octet-stream');
81
+ if (ext !== existing.fileExt) {
82
+ await this.storage.delete(definitionPaths.file(guid, existing.fileExt));
83
+ }
84
+ await this.data.definitions.update(ctx, guid, { fileExt: ext });
85
+ // Prune history if maxHistory is set
86
+ const updated = await this.data.definitions.get(ctx, guid);
87
+ if (updated && updated.maxHistory > 0 && updated.history.length > updated.maxHistory) {
88
+ const toRemove = updated.history.slice(updated.maxHistory);
89
+ for (const entry of toRemove) {
90
+ await this.storage.delete(definitionPaths.archive(guid, entry.ref));
91
+ await this.data.definitions.removeHistoryEntry(ctx, guid, entry.ref);
92
+ }
93
+ }
94
+ }
95
+ async updateMeta(ctx, guid, patch) {
96
+ const { maxHistory, projectId, computeServerId, ...metaFields } = patch;
97
+ const meta = Object.keys(metaFields).length > 0 ? metaFields : undefined;
98
+ const recordPatch = {
99
+ ...(meta !== undefined && { meta }),
100
+ ...(maxHistory !== undefined && { maxHistory }),
101
+ ...(projectId !== undefined && { projectId }),
102
+ ...(computeServerId !== undefined && { computeServerId })
103
+ };
104
+ await this.data.definitions.update(ctx, guid, recordPatch);
105
+ }
106
+ async saveCoverImage(ctx, guid, imageData) {
107
+ const path = definitionPaths.image(guid);
108
+ await this.storage.put(path, imageData, 'image/webp');
109
+ const url = this.storage.getPublicUrl(path);
110
+ await this.data.definitions.update(ctx, guid, { meta: { coverImage: url } });
111
+ }
112
+ async revertToVersion(ctx, guid, ref) {
113
+ const existing = await this.data.definitions.get(ctx, guid);
114
+ if (!existing)
115
+ throw new ProviderError(`Definition not found: ${guid}`, 404);
116
+ const entry = existing.history.find((h) => h.ref === ref);
117
+ if (!entry)
118
+ throw new ProviderError(`History entry not found: ${ref}`, 404);
119
+ const archived = await this.storage.get(definitionPaths.archive(guid, ref));
120
+ if (!archived)
121
+ throw new ProviderError(`Archived file not found for ref: ${ref}`, 404);
122
+ // Archive the current file first, then restore the old one
123
+ await this.updateFile(ctx, guid, archived, existing.fileExt, entry.originalName);
124
+ }
125
+ async delete(ctx, guid) {
126
+ // Blobs first — if this fails, record remains and retry is safe.
127
+ // If record delete fails after, the record points at nothing; the
128
+ // next get() returns null-payload semantics and the janitor cleans up.
129
+ await this.storage.deletePrefix(definitionPaths.prefix(guid));
130
+ await this.data.definitions.delete(ctx, guid);
131
+ }
132
+ /**
133
+ * Janitor — delete records stuck in 'pending' for longer than ageMs and
134
+ * any blobs they may have written. Safe to run on a schedule.
135
+ * Runs under SYSTEM_CONTEXT; callers don't pass one.
136
+ *
137
+ * @returns Number of records reclaimed.
138
+ */
139
+ async gcStalePending(ageMs = PENDING_GC_AGE_MS) {
140
+ const cutoff = new Date(Date.now() - ageMs).toISOString();
141
+ const stale = await this.data.definitions.listStalePending(SYSTEM_CONTEXT, cutoff);
142
+ for (const record of stale) {
143
+ await this.storage.deletePrefix(definitionPaths.prefix(record.guid));
144
+ await this.data.definitions.delete(SYSTEM_CONTEXT, record.guid);
145
+ }
146
+ return stale.length;
147
+ }
148
+ }
149
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/definitions/service.ts"],"names":[],"mappings":"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"}
@@ -24,7 +24,11 @@ export type DefinitionStatus = 'pending' | 'draft' | 'published' | 'archived';
24
24
  export interface DefinitionVersion {
25
25
  id: string;
26
26
  definitionId: string;
27
- /** Monotonic integer starting at 1; never reused. */
27
+ /**
28
+ * Monotonic integer starting at 1; NEVER reused — allocated from the parent
29
+ * record's `nextVersionNumber` counter, which only ever advances. Deleting the
30
+ * latest version does not free its number, so `fileKey`s never collide.
31
+ */
28
32
  versionNumber: number;
29
33
  fileExt: DefinitionFileExt;
30
34
  /** Full storage key. Opaque to callers. */
@@ -53,6 +57,13 @@ export interface DefinitionRecord {
53
57
  updatedBy: string;
54
58
  /** Falls back to the org default, then the platform default. */
55
59
  computeServerId?: string;
60
+ /**
61
+ * Durable L2 solve-cache quota for this definition (H1/R9). Absent = inherit
62
+ * the global default (`SOLVE_CACHE_DEFAULT_MAX_ENTRIES`); `0` = caching off
63
+ * (the non-determinism / wide-input-space escape hatch); `N` = keep at most N
64
+ * cached solves for this definition. One number, one settings input.
65
+ */
66
+ solveCacheLimit?: number;
56
67
  displayName: string;
57
68
  description?: string;
58
69
  category?: string;
@@ -61,6 +72,16 @@ export interface DefinitionRecord {
61
72
  coverImage?: string;
62
73
  status: DefinitionStatus;
63
74
  solveCount: number;
75
+ /**
76
+ * Monotonic version-number allocator. The next `uploadVersion` reserves this
77
+ * value for the new version's `versionNumber` (and `fileKey`) then advances
78
+ * the counter — it is NEVER decremented, so delete-latest-then-reupload mints
79
+ * a FRESH number and a FRESH `fileKey` rather than reusing the deleted one.
80
+ * Reusing a `fileKey` would let a stale storage blob (or any layer keying on
81
+ * the key) serve the old version's bytes for the new content. Starts at 2
82
+ * after v1 is created.
83
+ */
84
+ nextVersionNumber: number;
64
85
  /**
65
86
  * Both null only during the brief `pending` window between metadata create
66
87
  * and v1 upload; otherwise both reference live `DefinitionVersion` rows.
@@ -89,6 +110,8 @@ export interface DefinitionRecordPatch {
89
110
  coverImage?: string | null;
90
111
  projectId?: string;
91
112
  computeServerId?: string | null;
113
+ /** L2 cache quota (see {@link DefinitionRecord.solveCacheLimit}); `null` clears to inherit. */
114
+ solveCacheLimit?: number | null;
92
115
  status?: DefinitionStatus;
93
116
  /** Ownership transfer. */
94
117
  ownerId?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/definitions/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,KAAK,CAAC;AAE7C,eAAO,MAAM,aAAa,EAAE,MAAM,EAAoB,CAAC;AACvD,eAAO,MAAM,sBAAsB,EAAE,MAAM,EAA+C,CAAC;AAC3F,eAAO,MAAM,yBAAyB,EAAE,MAAM,EAAkD,CAAC;AAEjG,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAM5D,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,CAAC;AAE9E;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,oDAAoD;IACpD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,qBAAqB;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,0BAA0B;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,kCAAkC;AAClC,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/definitions/types.ts"],"names":[],"mappings":"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"}