@asturiu/v0-sdk 0.0.0-stage → 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 (239) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +5 -0
  4. package/README.md +82 -2
  5. package/contract/assertion-vectors.json +90 -0
  6. package/contract/schemas/branding.schema.json +46 -0
  7. package/contract/schemas/definitions.schema.json +376 -0
  8. package/contract/schemas/portal.schema.json +56 -0
  9. package/contract/tenant-api-routes.json +165 -0
  10. package/dist/branding.d.ts +131 -0
  11. package/dist/branding.d.ts.map +1 -0
  12. package/dist/branding.js +206 -0
  13. package/dist/branding.js.map +1 -0
  14. package/dist/changesets.d.ts +58 -0
  15. package/dist/changesets.d.ts.map +1 -0
  16. package/dist/changesets.js +18 -0
  17. package/dist/changesets.js.map +1 -0
  18. package/dist/cli/bin.d.ts +3 -0
  19. package/dist/cli/bin.d.ts.map +1 -0
  20. package/dist/cli/bin.js +12 -0
  21. package/dist/cli/bin.js.map +1 -0
  22. package/dist/cli/changesets.d.ts +14 -0
  23. package/dist/cli/changesets.d.ts.map +1 -0
  24. package/dist/cli/changesets.js +252 -0
  25. package/dist/cli/changesets.js.map +1 -0
  26. package/dist/cli/cli.d.ts +37 -0
  27. package/dist/cli/cli.d.ts.map +1 -0
  28. package/dist/cli/cli.js +415 -0
  29. package/dist/cli/cli.js.map +1 -0
  30. package/dist/cli/context.d.ts +147 -0
  31. package/dist/cli/context.d.ts.map +1 -0
  32. package/dist/cli/context.js +258 -0
  33. package/dist/cli/context.js.map +1 -0
  34. package/dist/cli/engine.d.ts +59 -0
  35. package/dist/cli/engine.d.ts.map +1 -0
  36. package/dist/cli/engine.js +85 -0
  37. package/dist/cli/engine.js.map +1 -0
  38. package/dist/cli/feedback.d.ts +40 -0
  39. package/dist/cli/feedback.d.ts.map +1 -0
  40. package/dist/cli/feedback.js +420 -0
  41. package/dist/cli/feedback.js.map +1 -0
  42. package/dist/cli/files.d.ts +83 -0
  43. package/dist/cli/files.d.ts.map +1 -0
  44. package/dist/cli/files.js +389 -0
  45. package/dist/cli/files.js.map +1 -0
  46. package/dist/cli/index.d.ts +8 -0
  47. package/dist/cli/index.d.ts.map +1 -0
  48. package/dist/cli/index.js +8 -0
  49. package/dist/cli/index.js.map +1 -0
  50. package/dist/cli/overview.d.ts +6 -0
  51. package/dist/cli/overview.d.ts.map +1 -0
  52. package/dist/cli/overview.js +379 -0
  53. package/dist/cli/overview.js.map +1 -0
  54. package/dist/cli/parts.d.ts +5 -0
  55. package/dist/cli/parts.d.ts.map +1 -0
  56. package/dist/cli/parts.js +414 -0
  57. package/dist/cli/parts.js.map +1 -0
  58. package/dist/cli/sources.d.ts +37 -0
  59. package/dist/cli/sources.d.ts.map +1 -0
  60. package/dist/cli/sources.js +91 -0
  61. package/dist/cli/sources.js.map +1 -0
  62. package/dist/cli/terminal.d.ts +135 -0
  63. package/dist/cli/terminal.d.ts.map +1 -0
  64. package/dist/cli/terminal.js +353 -0
  65. package/dist/cli/terminal.js.map +1 -0
  66. package/dist/cli/ui-page.d.ts +8 -0
  67. package/dist/cli/ui-page.d.ts.map +1 -0
  68. package/dist/cli/ui-page.js +216 -0
  69. package/dist/cli/ui-page.js.map +1 -0
  70. package/dist/cli/ui.d.ts +54 -0
  71. package/dist/cli/ui.d.ts.map +1 -0
  72. package/dist/cli/ui.js +251 -0
  73. package/dist/cli/ui.js.map +1 -0
  74. package/dist/client.d.ts +88 -0
  75. package/dist/client.d.ts.map +1 -0
  76. package/dist/client.js +165 -0
  77. package/dist/client.js.map +1 -0
  78. package/dist/contacts.d.ts +43 -0
  79. package/dist/contacts.d.ts.map +1 -0
  80. package/dist/contacts.js +46 -0
  81. package/dist/contacts.js.map +1 -0
  82. package/dist/definition-set.d.ts +731 -0
  83. package/dist/definition-set.d.ts.map +1 -0
  84. package/dist/definition-set.js +659 -0
  85. package/dist/definition-set.js.map +1 -0
  86. package/dist/definitions.d.ts +42 -0
  87. package/dist/definitions.d.ts.map +1 -0
  88. package/dist/definitions.js +154 -0
  89. package/dist/definitions.js.map +1 -0
  90. package/dist/enrolment.d.ts +9 -0
  91. package/dist/enrolment.d.ts.map +1 -0
  92. package/dist/enrolment.js +8 -0
  93. package/dist/enrolment.js.map +1 -0
  94. package/dist/fill.d.ts +73 -0
  95. package/dist/fill.d.ts.map +1 -0
  96. package/dist/fill.js +46 -0
  97. package/dist/fill.js.map +1 -0
  98. package/dist/index.d.ts +39 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +39 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/notifications.d.ts +33 -0
  103. package/dist/notifications.d.ts.map +1 -0
  104. package/dist/notifications.js +36 -0
  105. package/dist/notifications.js.map +1 -0
  106. package/dist/oidc.d.ts +122 -0
  107. package/dist/oidc.d.ts.map +1 -0
  108. package/dist/oidc.js +150 -0
  109. package/dist/oidc.js.map +1 -0
  110. package/dist/overlay.d.ts +109 -0
  111. package/dist/overlay.d.ts.map +1 -0
  112. package/dist/overlay.js +58 -0
  113. package/dist/overlay.js.map +1 -0
  114. package/dist/passes.d.ts +95 -0
  115. package/dist/passes.d.ts.map +1 -0
  116. package/dist/passes.js +140 -0
  117. package/dist/passes.js.map +1 -0
  118. package/dist/portal-options.d.ts +65 -0
  119. package/dist/portal-options.d.ts.map +1 -0
  120. package/dist/portal-options.js +120 -0
  121. package/dist/portal-options.js.map +1 -0
  122. package/dist/reads.d.ts +41 -0
  123. package/dist/reads.d.ts.map +1 -0
  124. package/dist/reads.js +44 -0
  125. package/dist/reads.js.map +1 -0
  126. package/dist/recovery-words.d.ts +8 -0
  127. package/dist/recovery-words.d.ts.map +1 -0
  128. package/dist/recovery-words.js +136 -0
  129. package/dist/recovery-words.js.map +1 -0
  130. package/dist/recovery.d.ts +198 -0
  131. package/dist/recovery.d.ts.map +1 -0
  132. package/dist/recovery.js +112 -0
  133. package/dist/recovery.js.map +1 -0
  134. package/dist/reveal.d.ts +35 -0
  135. package/dist/reveal.d.ts.map +1 -0
  136. package/dist/reveal.js +66 -0
  137. package/dist/reveal.js.map +1 -0
  138. package/dist/seal.d.ts +15 -0
  139. package/dist/seal.d.ts.map +1 -0
  140. package/dist/seal.js +0 -0
  141. package/dist/seal.js.map +1 -0
  142. package/dist/session.d.ts +66 -0
  143. package/dist/session.d.ts.map +1 -0
  144. package/dist/session.js +61 -0
  145. package/dist/session.js.map +1 -0
  146. package/dist/signing-in-mark.d.ts +14 -0
  147. package/dist/signing-in-mark.d.ts.map +1 -0
  148. package/dist/signing-in-mark.js +24 -0
  149. package/dist/signing-in-mark.js.map +1 -0
  150. package/dist/signing-in.d.ts +22 -0
  151. package/dist/signing-in.d.ts.map +1 -0
  152. package/dist/signing-in.js +203 -0
  153. package/dist/signing-in.js.map +1 -0
  154. package/dist/tags.d.ts +96 -0
  155. package/dist/tags.d.ts.map +1 -0
  156. package/dist/tags.js +88 -0
  157. package/dist/tags.js.map +1 -0
  158. package/dist/tenant-subscription.d.ts +47 -0
  159. package/dist/tenant-subscription.d.ts.map +1 -0
  160. package/dist/tenant-subscription.js +7 -0
  161. package/dist/tenant-subscription.js.map +1 -0
  162. package/dist/testing/index.d.ts +125 -0
  163. package/dist/testing/index.d.ts.map +1 -0
  164. package/dist/testing/index.js +320 -0
  165. package/dist/testing/index.js.map +1 -0
  166. package/dist/theme.d.ts +237 -0
  167. package/dist/theme.d.ts.map +1 -0
  168. package/dist/theme.js +504 -0
  169. package/dist/theme.js.map +1 -0
  170. package/dist/tickets.d.ts +152 -0
  171. package/dist/tickets.d.ts.map +1 -0
  172. package/dist/tickets.js +65 -0
  173. package/dist/tickets.js.map +1 -0
  174. package/dist/tiers.d.ts +168 -0
  175. package/dist/tiers.d.ts.map +1 -0
  176. package/dist/tiers.js +341 -0
  177. package/dist/tiers.js.map +1 -0
  178. package/dist/types.d.ts +885 -0
  179. package/dist/types.d.ts.map +1 -0
  180. package/dist/types.js +12 -0
  181. package/dist/types.js.map +1 -0
  182. package/dist/urlid.d.ts +50 -0
  183. package/dist/urlid.d.ts.map +1 -0
  184. package/dist/urlid.js +78 -0
  185. package/dist/urlid.js.map +1 -0
  186. package/dist/version.d.ts +15 -0
  187. package/dist/version.d.ts.map +1 -0
  188. package/dist/version.js +15 -0
  189. package/dist/version.js.map +1 -0
  190. package/make/asturiu.mk +43 -0
  191. package/package.json +63 -4
  192. package/src/branding.ts +221 -0
  193. package/src/changesets.ts +61 -0
  194. package/src/cli/bin.ts +12 -0
  195. package/src/cli/changesets.ts +233 -0
  196. package/src/cli/cli.ts +425 -0
  197. package/src/cli/context.ts +299 -0
  198. package/src/cli/engine.ts +112 -0
  199. package/src/cli/feedback.ts +406 -0
  200. package/src/cli/files.ts +371 -0
  201. package/src/cli/index.ts +7 -0
  202. package/src/cli/overview.ts +343 -0
  203. package/src/cli/parts.ts +371 -0
  204. package/src/cli/sources.ts +111 -0
  205. package/src/cli/terminal.ts +384 -0
  206. package/src/cli/ui-page.ts +215 -0
  207. package/src/cli/ui.ts +266 -0
  208. package/src/client.ts +202 -0
  209. package/src/contacts.ts +61 -0
  210. package/src/definition-set.ts +965 -0
  211. package/src/definitions.ts +156 -0
  212. package/src/enrolment.ts +10 -0
  213. package/src/fill.ts +83 -0
  214. package/src/index.ts +38 -0
  215. package/src/notifications.ts +55 -0
  216. package/src/oidc.ts +199 -0
  217. package/src/overlay.ts +137 -0
  218. package/src/passes.ts +168 -0
  219. package/src/portal-options.ts +125 -0
  220. package/src/reads.ts +71 -0
  221. package/src/recovery-words.ts +137 -0
  222. package/src/recovery.ts +269 -0
  223. package/src/reveal.ts +72 -0
  224. package/src/seal.ts +0 -0
  225. package/src/session.ts +93 -0
  226. package/src/signing-in-mark.ts +23 -0
  227. package/src/signing-in.ts +213 -0
  228. package/src/tags.ts +146 -0
  229. package/src/tenant-subscription.ts +44 -0
  230. package/src/testing/index.ts +337 -0
  231. package/src/theme.ts +628 -0
  232. package/src/tickets.ts +195 -0
  233. package/src/tiers.ts +397 -0
  234. package/src/types.ts +847 -0
  235. package/src/urlid.ts +77 -0
  236. package/src/version.ts +15 -0
  237. package/templates/asturiu/branding.json +4 -0
  238. package/templates/asturiu/definitions.json +23 -0
  239. package/templates/asturiu/portal.json +16 -0
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Tickets and announcements (ADR-058). A Ticket (`tkt`) is a conversation
3
+ * with a status between a Customer and its Tenant, a Tenant and the platform,
4
+ * or a User and the platform on the account page. An announcement is a ticket
5
+ * of its own primary type: one-to-many, to an audience of tags, with a
6
+ * lifecycle of its own. Pure and dependency-free: the Operations API decides,
7
+ * every surface reads the same words.
8
+ */
9
+ import type { TagSelector } from "./tags.js";
10
+ export declare const PRIMARY_TYPES: readonly ["issue", "request", "feedback", "announcement"];
11
+ export type PrimaryType = (typeof PRIMARY_TYPES)[number];
12
+ /** Who opened it and who answers (§2). Announcements go one way, to an audience. */
13
+ export declare const DIRECTIONS: readonly ["customer_tenant", "tenant_customer", "tenant_platform", "platform_tenant", "user_platform", "platform_user", "tenant_customers", "platform_tenants", "platform_users"];
14
+ export type Direction = (typeof DIRECTIONS)[number];
15
+ export declare const TICKET_STATUSES: readonly ["new", "acknowledged", "in_progress", "waiting", "on_hold", "resolved", "canceled"];
16
+ export type TicketStatus = (typeof TICKET_STATUSES)[number];
17
+ export declare const ANNOUNCEMENT_STATUSES: readonly ["draft", "scheduled", "published", "expired", "withdrawn"];
18
+ export type AnnouncementStatus = (typeof ANNOUNCEMENT_STATUSES)[number];
19
+ export type AnyStatus = TicketStatus | AnnouncementStatus;
20
+ export declare const PRIORITIES: readonly ["low", "normal", "high", "urgent"];
21
+ export type Priority = (typeof PRIORITIES)[number];
22
+ export type Side = "requester" | "handling";
23
+ export declare function statusesOf(primary: PrimaryType): readonly AnyStatus[];
24
+ /** Where a ticket may go from here, for the handling side; the requester may only cancel, resolve or reopen its own. */
25
+ export declare function nextStatuses(primary: PrimaryType, from: TicketStatus, who: Side): TicketStatus[];
26
+ /** A resolved ticket reopens within this many days; later, or canceled, a new ticket links the old one (§4). */
27
+ export declare const REOPEN_DAYS = 14;
28
+ /** The Operator archives a closed ticket this many days after it closed (§4). */
29
+ export declare const ARCHIVE_DAYS = 30;
30
+ /** The words every surface shows for a status and a priority. */
31
+ export declare const STATUS_LABELS: Record<AnyStatus, string>;
32
+ export declare const PRIORITY_LABELS: Record<Priority, string>;
33
+ /** A Tenant's own type of ticket for its Customers (§3): a permanent key, the name a Customer reads, its primary type, the role that answers. */
34
+ export interface TenantTicketType {
35
+ key: string;
36
+ name: string;
37
+ primary: "issue" | "request" | "feedback";
38
+ handled_by: string;
39
+ }
40
+ /** Open: still work for someone. Closed tickets count toward nobody's open limit. */
41
+ export declare function isOpenStatus(s: AnyStatus): boolean;
42
+ export declare const TENANT_PLATFORM_TYPES: readonly ["engine_defect", "engine_limitation", "engine_question", "changeset", "billing", "onboarding", "security", "notice", "other"];
43
+ /** A party (§5): a person, a role binding, the Tenant's servers. */
44
+ export interface PartyView {
45
+ /** `customer:<cst>`, `user:<usr>`, `role:<group>` or `tenant:<tnt>`. */
46
+ ref: string;
47
+ kind: "person" | "role" | "tenant";
48
+ side: Side;
49
+ access: "ro" | "rw";
50
+ place: "requester" | "assignee" | "watcher";
51
+ /** How the reader sees it: a name for someone of their own side, "<Tenant> · Support" or "Asturiu · Support" for the other (§7). */
52
+ label: string;
53
+ }
54
+ /** A post as a reader sees it (§6, §7). */
55
+ export interface PostView {
56
+ id: string;
57
+ at: string;
58
+ side: Side;
59
+ visibility: "all" | "side";
60
+ author: {
61
+ label: string;
62
+ mine: boolean;
63
+ };
64
+ body: string;
65
+ refs: string[];
66
+ }
67
+ export interface TicketLink {
68
+ ticket: string;
69
+ relation: "escalated_from" | "escalated_to" | "duplicate_of" | "relates_to";
70
+ }
71
+ /** A ticket in a list. */
72
+ export interface TicketSummary {
73
+ arid: string;
74
+ scope: "platform" | "tenant";
75
+ tenant?: string;
76
+ direction: Direction;
77
+ primary: PrimaryType;
78
+ secondary: string | null;
79
+ /** The type's name, as the reader reads it. */
80
+ type_label: string;
81
+ subject: string;
82
+ status: AnyStatus;
83
+ priority: Priority;
84
+ archived: boolean;
85
+ created_at: string;
86
+ updated_at: string;
87
+ /** Which side the reader is on, or `audience` when they read it as one of many. */
88
+ side: Side | "audience";
89
+ unread: boolean;
90
+ /** Who it is with, from the reader's side: "<Tenant> · Support", a Customer's name, "Asturiu". */
91
+ with_label: string;
92
+ }
93
+ /** One ticket, whole, as a reader may see it. */
94
+ export interface TicketView extends TicketSummary {
95
+ parties: PartyView[];
96
+ posts: PostView[];
97
+ links: TicketLink[];
98
+ refs: string[];
99
+ audience: TagSelector | null;
100
+ hold_until: string | null;
101
+ closed_at: string | null;
102
+ /** What the reader may do now. */
103
+ can: {
104
+ post: boolean;
105
+ note: boolean;
106
+ triage: boolean;
107
+ statuses: TicketStatus[];
108
+ reopen: boolean;
109
+ };
110
+ /** Announcements: languages and the rest; absent for a ticket. */
111
+ announcement?: AnnouncementFields;
112
+ /** Changesets and feedback (ADR-059): what the ticket is about beyond its text. */
113
+ changeset?: {
114
+ number: number;
115
+ title: string;
116
+ date: string;
117
+ deadline: string | null;
118
+ url: string | null;
119
+ applied_version: string | null;
120
+ reason: string | null;
121
+ };
122
+ feedback?: {
123
+ area: string | null;
124
+ };
125
+ }
126
+ export interface AnnouncementFields {
127
+ languages: Record<string, {
128
+ subject: string;
129
+ body: string;
130
+ }>;
131
+ default_language: string;
132
+ publish_at: string | null;
133
+ expires_at: string | null;
134
+ pinned: boolean;
135
+ severity: "info" | "warning";
136
+ replies: boolean;
137
+ }
138
+ /** An announcement in a reader's inbox, in the reader's language or the default. */
139
+ export interface AnnouncementItem {
140
+ arid: string;
141
+ subject: string;
142
+ body: string;
143
+ published_at: string;
144
+ expires_at: string | null;
145
+ pinned: boolean;
146
+ severity: "info" | "warning";
147
+ replies: boolean;
148
+ read: boolean;
149
+ /** Who it is from: the Tenant's name, or the platform's. */
150
+ from: string;
151
+ }
152
+ //# sourceMappingURL=tickets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tickets.d.ts","sourceRoot":"","sources":["../src/tickets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Tickets and announcements (ADR-058). A Ticket (`tkt`) is a conversation
3
+ * with a status between a Customer and its Tenant, a Tenant and the platform,
4
+ * or a User and the platform on the account page. An announcement is a ticket
5
+ * of its own primary type: one-to-many, to an audience of tags, with a
6
+ * lifecycle of its own. Pure and dependency-free: the Operations API decides,
7
+ * every surface reads the same words.
8
+ */
9
+ export const PRIMARY_TYPES = ["issue", "request", "feedback", "announcement"];
10
+ /** Who opened it and who answers (§2). Announcements go one way, to an audience. */
11
+ export const DIRECTIONS = ["customer_tenant", "tenant_customer", "tenant_platform", "platform_tenant", "user_platform", "platform_user", "tenant_customers", "platform_tenants", "platform_users"];
12
+ export const TICKET_STATUSES = ["new", "acknowledged", "in_progress", "waiting", "on_hold", "resolved", "canceled"];
13
+ export const ANNOUNCEMENT_STATUSES = ["draft", "scheduled", "published", "expired", "withdrawn"];
14
+ export const PRIORITIES = ["low", "normal", "high", "urgent"];
15
+ /** The moves a ticket's status makes (§4, the state diagram). A requester's reply to `waiting` and a reopen are moves too. */
16
+ const MOVES = {
17
+ new: ["acknowledged", "in_progress", "canceled"],
18
+ acknowledged: ["in_progress", "resolved", "canceled"],
19
+ in_progress: ["waiting", "on_hold", "resolved", "canceled"],
20
+ waiting: ["in_progress", "canceled"],
21
+ on_hold: ["in_progress", "canceled"],
22
+ resolved: ["in_progress"],
23
+ canceled: [],
24
+ };
25
+ /** Feedback keeps a subset (§4): it is seen, answered and closed, never worked on. */
26
+ const FEEDBACK_STATUSES = ["new", "acknowledged", "resolved", "canceled"];
27
+ export function statusesOf(primary) {
28
+ if (primary === "announcement")
29
+ return ANNOUNCEMENT_STATUSES;
30
+ return primary === "feedback" ? FEEDBACK_STATUSES : TICKET_STATUSES;
31
+ }
32
+ /** Where a ticket may go from here, for the handling side; the requester may only cancel, resolve or reopen its own. */
33
+ export function nextStatuses(primary, from, who) {
34
+ const allowed = statusesOf(primary);
35
+ const moves = MOVES[from].filter((s) => allowed.includes(s));
36
+ if (who === "handling")
37
+ return moves.filter((s) => s !== "in_progress" || from !== "resolved");
38
+ return moves.filter((s) => s === "canceled" || s === "resolved" || (from === "resolved" && s === "in_progress"));
39
+ }
40
+ /** A resolved ticket reopens within this many days; later, or canceled, a new ticket links the old one (§4). */
41
+ export const REOPEN_DAYS = 14;
42
+ /** The Operator archives a closed ticket this many days after it closed (§4). */
43
+ export const ARCHIVE_DAYS = 30;
44
+ /** The words every surface shows for a status and a priority. */
45
+ export const STATUS_LABELS = {
46
+ new: "New",
47
+ acknowledged: "Seen",
48
+ in_progress: "In progress",
49
+ waiting: "Waiting for you",
50
+ on_hold: "On hold",
51
+ resolved: "Resolved",
52
+ canceled: "Canceled",
53
+ draft: "Draft",
54
+ scheduled: "Scheduled",
55
+ published: "Published",
56
+ expired: "Expired",
57
+ withdrawn: "Withdrawn",
58
+ };
59
+ export const PRIORITY_LABELS = { low: "Low", normal: "Normal", high: "High", urgent: "Urgent" };
60
+ /** Open: still work for someone. Closed tickets count toward nobody's open limit. */
61
+ export function isOpenStatus(s) {
62
+ return s !== "resolved" && s !== "canceled" && s !== "draft" && s !== "expired" && s !== "withdrawn";
63
+ }
64
+ export const TENANT_PLATFORM_TYPES = ["engine_defect", "engine_limitation", "engine_question", "changeset", "billing", "onboarding", "security", "notice", "other"];
65
+ //# sourceMappingURL=tickets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tickets.js","sourceRoot":"","sources":["../src/tickets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Tiers (ADR-061). A tier is a named set of features. Engine features come
3
+ * from the closed catalogue below and the Engine enforces them; Tenant
4
+ * features are the Tenant's own, and the Engine stores and returns them
5
+ * without reading them. Dependency-free, so the Admin UI, the Customer Portal
6
+ * and a Tenant's application draw from the same list the Interface API
7
+ * enforces.
8
+ */
9
+ export declare const TIER_LIMITS: {
10
+ readonly tiers: 32;
11
+ readonly label: 120;
12
+ /** Tenant features on one tier. */
13
+ readonly tenantFeatures: 64;
14
+ readonly tenantFeatureString: 200;
15
+ readonly graceDays: 365;
16
+ /** A file removal gives a person time to act (§6). */
17
+ readonly storageGraceDaysMin: 30;
18
+ };
19
+ export declare const TIER_KEY_PATTERN: RegExp;
20
+ export declare const TENANT_FEATURE_KEY_PATTERN: RegExp;
21
+ /** `false` or `0`: off. `true`: on, no limit. A positive number: on, up to that number (§2). */
22
+ export type FeatureValue = boolean | number;
23
+ export type EngineFeatureKind = "toggle" | "stock" | "monthly" | "window" | "size";
24
+ export interface EngineFeature {
25
+ key: string;
26
+ kind: EngineFeatureKind;
27
+ /** What a number counts; `null` for a toggle. */
28
+ unit: "count" | "bytes" | "days" | "people" | null;
29
+ /** What a tier that does not name it gets. These keep the behaviour from before tiers. */
30
+ default: FeatureValue;
31
+ /** What a limit is counted over. */
32
+ scope: "vault" | "customer" | "wallet" | "upload" | null;
33
+ /** On a group plan the number is a total for the group (ADR-063 §6). */
34
+ pooled: boolean;
35
+ /** The highest number a tier may set; absent: no ceiling here. */
36
+ max?: number;
37
+ label: string;
38
+ }
39
+ /** ADR-061 §4. A feature joins this list when the Engine can enforce it. */
40
+ export declare const ENGINE_FEATURES: readonly EngineFeature[];
41
+ export declare function engineFeature(key: string): EngineFeature | undefined;
42
+ export type TenantFeatureValue = boolean | number | string;
43
+ export interface TierDefinition {
44
+ label?: string;
45
+ /** Wallet type keys (ADR-029) or `"*"`. A key not in the Definition set is skipped when read. */
46
+ wallet_types: string[];
47
+ engine_features?: Record<string, FeatureValue>;
48
+ tenant_features?: Record<string, TenantFeatureValue>;
49
+ }
50
+ export type Tiers = Record<string, TierDefinition>;
51
+ export declare const TRIGGER_RULE_MODES: readonly ["freeze", "pause"];
52
+ export type TriggerRuleMode = (typeof TRIGGER_RULE_MODES)[number];
53
+ export declare const STORAGE_RULE_MODES: readonly ["keep", "remove"];
54
+ export type StorageRuleMode = (typeof STORAGE_RULE_MODES)[number];
55
+ /** What happens to what a Customer has above a lower tier (ADR-061 §6). */
56
+ export interface TierRules {
57
+ triggers: {
58
+ mode: TriggerRuleMode;
59
+ grace_days: number;
60
+ };
61
+ storage: {
62
+ mode: StorageRuleMode;
63
+ grace_days: number;
64
+ };
65
+ /** When a Tenant last lowered a limit these rules act on; set by the Operations API. */
66
+ changed_at?: string;
67
+ }
68
+ export interface TenantTierSet {
69
+ tiers: Tiers;
70
+ default_tier: string;
71
+ tier_rules: TierRules;
72
+ }
73
+ export declare function defaultTierRules(): TierRules;
74
+ /** What a Tenant record with no tiers reads as (§3): one tier that creates from every Wallet type. */
75
+ export declare function defaultTierSet(): TenantTierSet;
76
+ /** The fields tiers replace, as records written before ADR-061 keep them. */
77
+ export interface LegacyTierFields {
78
+ scoping?: unknown;
79
+ customization?: unknown;
80
+ passes?: unknown;
81
+ billing?: unknown;
82
+ definitions?: unknown;
83
+ }
84
+ /**
85
+ * Tiers from the four fields they replace (§11). Each default is the one the
86
+ * old field had, so nothing changes for a Customer. ARIDs in `scoping` become
87
+ * Wallet type keys through the Tenant's Definition map; one the map does not
88
+ * know stays an ARID, which `walletTypeArids` still honours.
89
+ */
90
+ export declare function tiersFromLegacy(raw: LegacyTierFields): TenantTierSet;
91
+ /** A Tenant's tiers, from `tiers` when the record has them, otherwise from the fields they replace. */
92
+ export declare function tierSetOf(raw: LegacyTierFields & {
93
+ tiers?: unknown;
94
+ default_tier?: unknown;
95
+ tier_rules?: unknown;
96
+ }): TenantTierSet;
97
+ /** The tier in force: the stored key, or `default_tier` when there is none or it no longer exists (§3). */
98
+ export declare function tierKeyOf(set: TenantTierSet, stored: string | null | undefined): string;
99
+ export declare function tierOf(set: TenantTierSet, stored: string | null | undefined): TierDefinition;
100
+ /** A feature's value on a tier: as written, or the catalogue's default. */
101
+ export declare function featureValue(tier: TierDefinition, key: string): FeatureValue;
102
+ /** `null`: no limit. `0`: off. Otherwise the number (§2). */
103
+ export declare function featureLimit(value: FeatureValue): number | null;
104
+ /** Whether a Customer may use a feature at all. */
105
+ export declare function featureIsOn(value: FeatureValue): boolean;
106
+ /** The Wallet type ARIDs a tier may create from. `map` is the Tenant's Definition map; a key not in it is skipped (§3). */
107
+ export declare function walletTypeArids(tier: TierDefinition, map: Record<string, string>, all: readonly string[]): Set<string>;
108
+ /** Whether any tier switches a Wallet overlay feature on: the Tenant has customisation at all (ADR-028). */
109
+ export declare function overlaysOn(set: TenantTierSet): boolean;
110
+ /** What a tier may add to a Wallet overlay, in the shape the overlay code checks against. */
111
+ export declare function overlayLimitsOf(tier: TierDefinition): {
112
+ rename: boolean;
113
+ arrange: boolean;
114
+ extra_fields: number;
115
+ secret_fields: boolean;
116
+ searchable_fields: number;
117
+ };
118
+ export interface TierProblem {
119
+ path: (string | number)[];
120
+ message: string;
121
+ }
122
+ /** Strict checks on a block being written (§3). One entry per problem, with its path. */
123
+ export declare function tierProblems(raw: {
124
+ tiers?: unknown;
125
+ default_tier?: unknown;
126
+ tier_rules?: unknown;
127
+ }): TierProblem[];
128
+ /** Features whose value falls between two tier sets, on tiers that exist in both: what the Admin UI warns about (§12), and what starts a grace period (§6). */
129
+ export declare function loweredFeatures(before: Tiers, after: Tiers): {
130
+ tier: string;
131
+ feature: string;
132
+ from: FeatureValue;
133
+ to: FeatureValue;
134
+ }[];
135
+ /** One Engine feature as a Customer has it (§9). */
136
+ export interface EntitledFeature {
137
+ value: FeatureValue;
138
+ /** Present for stock and monthly limits. On a group plan, the group's total. */
139
+ used?: number;
140
+ /** On a group plan, the caller's share. */
141
+ own?: number;
142
+ }
143
+ /** `GET /v0/customer/entitlements`, and the Tenant API's read of one Customer (§9). */
144
+ export interface CustomerEntitlements {
145
+ tier: string;
146
+ label: string;
147
+ /** Wallet type keys or `"*"`. */
148
+ wallet_types: string[];
149
+ engine_features: Record<string, EntitledFeature>;
150
+ tenant_features: Record<string, TenantFeatureValue>;
151
+ /** While files are due to be removed (§6). */
152
+ storage_review?: {
153
+ at: string;
154
+ over_bytes: number;
155
+ };
156
+ }
157
+ export declare function entitlementsOf(set: TenantTierSet, stored: string | null | undefined, used?: Record<string, {
158
+ used?: number;
159
+ own?: number;
160
+ }>): CustomerEntitlements;
161
+ /** A feature read for showing: whether it is on, its limit, what is used and what is left. */
162
+ export declare function featureOf(entitlements: CustomerEntitlements, key: string): {
163
+ on: boolean;
164
+ limit: number | null;
165
+ used: number | null;
166
+ left: number | null;
167
+ };
168
+ //# sourceMappingURL=tiers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiers.d.ts","sourceRoot":"","sources":["../src/tiers.ts"],"names":[],"mappings":"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"}