@nebutra/contracts 0.1.2 → 3.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.
@@ -0,0 +1,273 @@
1
+ // src/admin.ts
2
+ import { z } from "zod";
3
+ var ADMIN_CONTRACT_VERSION = "nebutra.admin/v1";
4
+ var AdminStatusSchema = z.enum(["healthy", "degraded", "down", "unknown"]);
5
+ var StaffRoleSchema = z.enum([
6
+ "platform_readonly",
7
+ "platform_support",
8
+ "platform_operator",
9
+ "platform_owner"
10
+ ]);
11
+ var STAFF_ROLE_RANK = {
12
+ platform_readonly: 0,
13
+ platform_support: 1,
14
+ platform_operator: 2,
15
+ platform_owner: 3
16
+ };
17
+ function roleAtLeast(role, required) {
18
+ return STAFF_ROLE_RANK[role] >= STAFF_ROLE_RANK[required];
19
+ }
20
+ var AdminSeveritySchema = z.enum(["info", "warn", "critical"]);
21
+ var AdminDomainIdSchema = z.enum([
22
+ "identity",
23
+ "access",
24
+ "commerce",
25
+ "usage",
26
+ "catalog",
27
+ "operations",
28
+ "integrations",
29
+ "trust",
30
+ "support",
31
+ "growth",
32
+ "settings",
33
+ // Platform-only cross-cutting domain: shared AI supply (router).
34
+ "supply"
35
+ ]);
36
+ var IdSchema = z.string().min(1).max(64).regex(/^[a-z][a-z0-9._-]*$/, "ids are lowercase dotted identifiers");
37
+ var UrlPathSchema = z.string().min(1).regex(/^\//, "contract urls are origin-relative paths");
38
+ var AdminColumnSchema = z.object({
39
+ key: z.string().min(1),
40
+ label: z.string().min(1),
41
+ kind: z.enum(["text", "mono", "status", "badge", "number", "time", "link"]).default("text"),
42
+ /** Right-align numbers; the renderer does not guess from values. */
43
+ align: z.enum(["start", "end"]).default("start")
44
+ });
45
+ var AdminResourceSchema = z.object({
46
+ id: IdSchema,
47
+ label: z.string().min(1),
48
+ /** `GET list` → ResourceList */
49
+ list: UrlPathSchema,
50
+ /** `GET detail` with `{id}` placeholder → one item */
51
+ detail: UrlPathSchema.optional(),
52
+ columns: z.array(AdminColumnSchema).min(1),
53
+ /** Column key that identifies a row. */
54
+ key: z.string().min(1).default("id"),
55
+ search: z.boolean().default(false),
56
+ /** Action ids applicable per row. */
57
+ actions: z.array(IdSchema).default([])
58
+ });
59
+ var AdminActionSchema = z.object({
60
+ id: IdSchema,
61
+ verb: z.string().min(1),
62
+ /** Resource the action belongs to; omitted = domain-level action. */
63
+ resource: IdSchema.optional(),
64
+ /** Minimum staff role. Read-only tier never sees write controls. */
65
+ role: StaffRoleSchema,
66
+ /** `POST url` with ActionRequest (`mode: plan | apply`). */
67
+ url: UrlPathSchema,
68
+ /** Plan step is mandatory; `false` only for idempotent, non-destructive refreshes. */
69
+ plan: z.boolean().default(true),
70
+ destructive: z.boolean().default(false),
71
+ /** JSON Schema for `input`; doubles as the MCP tool inputSchema. */
72
+ input: z.record(z.string(), z.unknown()).optional(),
73
+ description: z.string().optional()
74
+ });
75
+ var AdminSignalSchema = z.object({
76
+ id: IdSchema,
77
+ label: z.string().min(1),
78
+ severity: AdminSeveritySchema,
79
+ /** `GET probe` → SignalReading. Probed, never configured. */
80
+ probe: UrlPathSchema,
81
+ resource: IdSchema.optional(),
82
+ /** Action that resolves the signal when raised. */
83
+ action: IdSchema.optional()
84
+ });
85
+ var AdminPolicySchema = z.object({
86
+ id: IdSchema,
87
+ label: z.string().min(1),
88
+ /** Event name (`nebutra/<domain>.<thing>.<verb>`) that triggers the policy. */
89
+ on: z.string().min(1),
90
+ runs: IdSchema,
91
+ enabled: z.boolean().default(true),
92
+ /** Natural-language intent the policy was compiled from, when it was. */
93
+ intent: z.string().optional()
94
+ });
95
+ var AdminDomainSchema = z.object({
96
+ id: AdminDomainIdSchema,
97
+ label: z.string().min(1),
98
+ resources: z.array(AdminResourceSchema).default([]),
99
+ actions: z.array(AdminActionSchema).default([]),
100
+ signals: z.array(AdminSignalSchema).default([]),
101
+ policies: z.array(AdminPolicySchema).default([]),
102
+ /** Product-owned browser surface for what the generic renderer cannot express. */
103
+ slot: UrlPathSchema.optional()
104
+ });
105
+ var AdminManifestSchema = z.object({
106
+ contract: z.literal(ADMIN_CONTRACT_VERSION),
107
+ product: IdSchema,
108
+ label: z.string().min(1),
109
+ version: z.string().min(1),
110
+ /** Absolute origin every relative url resolves against. */
111
+ origin: z.string().url(),
112
+ graph: z.enum(["core", "runtime", "labs"]),
113
+ status: z.enum(["stable", "foundation", "wip", "experimental"]),
114
+ /** `GET health` → @nebutra/health HealthCheckResult. */
115
+ health: UrlPathSchema,
116
+ /** `GET audit?…` → audit events (nebutra.audit/v1). */
117
+ audit: UrlPathSchema.optional(),
118
+ domains: z.array(AdminDomainSchema).min(1)
119
+ }).superRefine((m, ctx) => {
120
+ for (const d of m.domains) {
121
+ const actionIds = new Set(d.actions.map((a) => a.id));
122
+ const resourceIds = new Set(d.resources.map((r) => r.id));
123
+ for (const r of d.resources) {
124
+ for (const a of r.actions) {
125
+ if (!actionIds.has(a)) {
126
+ ctx.addIssue({
127
+ code: "custom",
128
+ message: `resource ${r.id} references unknown action ${a}`
129
+ });
130
+ }
131
+ }
132
+ }
133
+ for (const s of d.signals) {
134
+ if (s.action && !actionIds.has(s.action)) {
135
+ ctx.addIssue({
136
+ code: "custom",
137
+ message: `signal ${s.id} references unknown action ${s.action}`
138
+ });
139
+ }
140
+ if (s.resource && !resourceIds.has(s.resource)) {
141
+ ctx.addIssue({
142
+ code: "custom",
143
+ message: `signal ${s.id} references unknown resource ${s.resource}`
144
+ });
145
+ }
146
+ }
147
+ for (const p of d.policies) {
148
+ if (!actionIds.has(p.runs)) {
149
+ ctx.addIssue({ code: "custom", message: `policy ${p.id} runs unknown action ${p.runs}` });
150
+ }
151
+ }
152
+ }
153
+ });
154
+ var ResourceListSchema = z.object({
155
+ items: z.array(z.record(z.string(), z.unknown())),
156
+ total: z.number().int().min(0),
157
+ /** When the list was produced from live probes; omitted for pure reads. */
158
+ probedAt: z.string().datetime().optional()
159
+ });
160
+ var ActionRequestSchema = z.discriminatedUnion("mode", [
161
+ z.object({ mode: z.literal("plan"), input: z.record(z.string(), z.unknown()).default({}) }),
162
+ z.object({
163
+ mode: z.literal("apply"),
164
+ input: z.record(z.string(), z.unknown()).default({}),
165
+ /** Required when the action is destructive; ties the apply to a reviewed plan. */
166
+ planId: z.string().min(1).optional()
167
+ })
168
+ ]);
169
+ var PlanDiffEntrySchema = z.object({
170
+ op: z.enum(["add", "remove", "change"]),
171
+ path: z.string().min(1),
172
+ from: z.unknown().optional(),
173
+ to: z.unknown().optional()
174
+ });
175
+ var ActionPlanSchema = z.object({
176
+ planId: z.string().min(1),
177
+ summary: z.string().min(1),
178
+ diff: z.array(PlanDiffEntrySchema),
179
+ affected: z.array(z.object({ resource: IdSchema, id: z.string(), label: z.string().optional() })).default([]),
180
+ warnings: z.array(z.string()).default([]),
181
+ /** Plans expire; an apply after this is refused. */
182
+ expiresAt: z.string().datetime()
183
+ });
184
+ var ActionResultSchema = z.object({
185
+ /** Audit event id written by the product for this apply. */
186
+ auditId: z.string().min(1),
187
+ summary: z.string().min(1),
188
+ result: z.record(z.string(), z.unknown()).optional()
189
+ });
190
+ var SignalReadingSchema = z.object({
191
+ id: IdSchema,
192
+ status: z.enum(["ok", "raised", "unknown"]),
193
+ severity: AdminSeveritySchema,
194
+ probedAt: z.string().datetime(),
195
+ title: z.string().optional(),
196
+ detail: z.string().optional(),
197
+ resource: IdSchema.optional(),
198
+ action: IdSchema.optional(),
199
+ data: z.record(z.string(), z.unknown()).optional()
200
+ });
201
+ var AdminErrorSchema = z.object({
202
+ error: z.object({
203
+ code: z.enum([
204
+ "unauthenticated",
205
+ "forbidden",
206
+ "not_found",
207
+ "invalid_input",
208
+ "plan_required",
209
+ "plan_expired",
210
+ "upstream_unavailable",
211
+ "internal"
212
+ ]),
213
+ message: z.string()
214
+ })
215
+ });
216
+ function assertApplyAllowed(action, request) {
217
+ if (request.mode !== "apply") return null;
218
+ if ((action.destructive || action.plan) && !request.planId) {
219
+ return {
220
+ error: {
221
+ code: "plan_required",
222
+ message: `${action.id} requires a reviewed plan before apply`
223
+ }
224
+ };
225
+ }
226
+ return null;
227
+ }
228
+ function resolveContractUrl(manifest, path) {
229
+ return new URL(path, manifest.origin).toString();
230
+ }
231
+ var ADMIN_ERROR_STATUS = {
232
+ unauthenticated: 401,
233
+ forbidden: 403,
234
+ not_found: 404,
235
+ invalid_input: 400,
236
+ plan_required: 409,
237
+ plan_expired: 409,
238
+ upstream_unavailable: 503,
239
+ internal: 500
240
+ };
241
+ function cdnSafeStatus(status, fallback = 503) {
242
+ if (!status || status === 502 || status === 504 || status < 400 || status > 599) return fallback;
243
+ return status;
244
+ }
245
+
246
+ export {
247
+ ADMIN_CONTRACT_VERSION,
248
+ AdminStatusSchema,
249
+ StaffRoleSchema,
250
+ STAFF_ROLE_RANK,
251
+ roleAtLeast,
252
+ AdminSeveritySchema,
253
+ AdminDomainIdSchema,
254
+ AdminColumnSchema,
255
+ AdminResourceSchema,
256
+ AdminActionSchema,
257
+ AdminSignalSchema,
258
+ AdminPolicySchema,
259
+ AdminDomainSchema,
260
+ AdminManifestSchema,
261
+ ResourceListSchema,
262
+ ActionRequestSchema,
263
+ PlanDiffEntrySchema,
264
+ ActionPlanSchema,
265
+ ActionResultSchema,
266
+ SignalReadingSchema,
267
+ AdminErrorSchema,
268
+ assertApplyAllowed,
269
+ resolveContractUrl,
270
+ ADMIN_ERROR_STATUS,
271
+ cdnSafeStatus
272
+ };
273
+ //# sourceMappingURL=chunk-G65TWQGE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/admin.ts"],"sourcesContent":["import { z } from \"zod\";\n\n/**\n * Admin Contract — `nebutra.admin/v1`.\n *\n * Every Nebutra SaaS exposes one manifest describing the admin surface it\n * owns: resources (nouns), actions (audited verbs, plan → apply), signals\n * (probed facts) and policies (actions the system runs by itself). The\n * platform admin renders any product from its manifest; an agent derives\n * tools from it. Nothing product-specific lives in the renderer.\n *\n * See docs/plans/2026-09-08-admin-of-admins-model.md.\n */\n\nexport const ADMIN_CONTRACT_VERSION = \"nebutra.admin/v1\" as const;\n\n/** One status vocabulary. `unknown` is first-class and never renders green. */\nexport const AdminStatusSchema = z.enum([\"healthy\", \"degraded\", \"down\", \"unknown\"]);\nexport type AdminStatus = z.infer<typeof AdminStatusSchema>;\n\n/** One role ladder; product roles map onto it, staff grants mean the same everywhere. */\nexport const StaffRoleSchema = z.enum([\n \"platform_readonly\",\n \"platform_support\",\n \"platform_operator\",\n \"platform_owner\",\n]);\nexport type StaffRole = z.infer<typeof StaffRoleSchema>;\nexport const STAFF_ROLE_RANK: Record<StaffRole, number> = {\n platform_readonly: 0,\n platform_support: 1,\n platform_operator: 2,\n platform_owner: 3,\n};\nexport function roleAtLeast(role: StaffRole, required: StaffRole): boolean {\n return STAFF_ROLE_RANK[role] >= STAFF_ROLE_RANK[required];\n}\n\nexport const AdminSeveritySchema = z.enum([\"info\", \"warn\", \"critical\"]);\nexport type AdminSeverity = z.infer<typeof AdminSeveritySchema>;\n\n/** The canonical eleven. A product declares the subset it has. */\nexport const AdminDomainIdSchema = z.enum([\n \"identity\",\n \"access\",\n \"commerce\",\n \"usage\",\n \"catalog\",\n \"operations\",\n \"integrations\",\n \"trust\",\n \"support\",\n \"growth\",\n \"settings\",\n // Platform-only cross-cutting domain: shared AI supply (router).\n \"supply\",\n]);\nexport type AdminDomainId = z.infer<typeof AdminDomainIdSchema>;\n\nconst IdSchema = z\n .string()\n .min(1)\n .max(64)\n .regex(/^[a-z][a-z0-9._-]*$/, \"ids are lowercase dotted identifiers\");\nconst UrlPathSchema = z.string().min(1).regex(/^\\//, \"contract urls are origin-relative paths\");\n\nexport const AdminColumnSchema = z.object({\n key: z.string().min(1),\n label: z.string().min(1),\n kind: z.enum([\"text\", \"mono\", \"status\", \"badge\", \"number\", \"time\", \"link\"]).default(\"text\"),\n /** Right-align numbers; the renderer does not guess from values. */\n align: z.enum([\"start\", \"end\"]).default(\"start\"),\n});\nexport type AdminColumn = z.infer<typeof AdminColumnSchema>;\n\nexport const AdminResourceSchema = z.object({\n id: IdSchema,\n label: z.string().min(1),\n /** `GET list` → ResourceList */\n list: UrlPathSchema,\n /** `GET detail` with `{id}` placeholder → one item */\n detail: UrlPathSchema.optional(),\n columns: z.array(AdminColumnSchema).min(1),\n /** Column key that identifies a row. */\n key: z.string().min(1).default(\"id\"),\n search: z.boolean().default(false),\n /** Action ids applicable per row. */\n actions: z.array(IdSchema).default([]),\n});\nexport type AdminResource = z.infer<typeof AdminResourceSchema>;\n\nexport const AdminActionSchema = z.object({\n id: IdSchema,\n verb: z.string().min(1),\n /** Resource the action belongs to; omitted = domain-level action. */\n resource: IdSchema.optional(),\n /** Minimum staff role. Read-only tier never sees write controls. */\n role: StaffRoleSchema,\n /** `POST url` with ActionRequest (`mode: plan | apply`). */\n url: UrlPathSchema,\n /** Plan step is mandatory; `false` only for idempotent, non-destructive refreshes. */\n plan: z.boolean().default(true),\n destructive: z.boolean().default(false),\n /** JSON Schema for `input`; doubles as the MCP tool inputSchema. */\n input: z.record(z.string(), z.unknown()).optional(),\n description: z.string().optional(),\n});\nexport type AdminAction = z.infer<typeof AdminActionSchema>;\n\nexport const AdminSignalSchema = z.object({\n id: IdSchema,\n label: z.string().min(1),\n severity: AdminSeveritySchema,\n /** `GET probe` → SignalReading. Probed, never configured. */\n probe: UrlPathSchema,\n resource: IdSchema.optional(),\n /** Action that resolves the signal when raised. */\n action: IdSchema.optional(),\n});\nexport type AdminSignal = z.infer<typeof AdminSignalSchema>;\n\nexport const AdminPolicySchema = z.object({\n id: IdSchema,\n label: z.string().min(1),\n /** Event name (`nebutra/<domain>.<thing>.<verb>`) that triggers the policy. */\n on: z.string().min(1),\n runs: IdSchema,\n enabled: z.boolean().default(true),\n /** Natural-language intent the policy was compiled from, when it was. */\n intent: z.string().optional(),\n});\nexport type AdminPolicy = z.infer<typeof AdminPolicySchema>;\n\nexport const AdminDomainSchema = z.object({\n id: AdminDomainIdSchema,\n label: z.string().min(1),\n resources: z.array(AdminResourceSchema).default([]),\n actions: z.array(AdminActionSchema).default([]),\n signals: z.array(AdminSignalSchema).default([]),\n policies: z.array(AdminPolicySchema).default([]),\n /** Product-owned browser surface for what the generic renderer cannot express. */\n slot: UrlPathSchema.optional(),\n});\nexport type AdminDomain = z.infer<typeof AdminDomainSchema>;\n\nexport const AdminManifestSchema = z\n .object({\n contract: z.literal(ADMIN_CONTRACT_VERSION),\n product: IdSchema,\n label: z.string().min(1),\n version: z.string().min(1),\n /** Absolute origin every relative url resolves against. */\n origin: z.string().url(),\n graph: z.enum([\"core\", \"runtime\", \"labs\"]),\n status: z.enum([\"stable\", \"foundation\", \"wip\", \"experimental\"]),\n /** `GET health` → @nebutra/health HealthCheckResult. */\n health: UrlPathSchema,\n /** `GET audit?…` → audit events (nebutra.audit/v1). */\n audit: UrlPathSchema.optional(),\n domains: z.array(AdminDomainSchema).min(1),\n })\n .superRefine((m, ctx) => {\n for (const d of m.domains) {\n const actionIds = new Set(d.actions.map((a) => a.id));\n const resourceIds = new Set(d.resources.map((r) => r.id));\n for (const r of d.resources) {\n for (const a of r.actions) {\n if (!actionIds.has(a)) {\n ctx.addIssue({\n code: \"custom\",\n message: `resource ${r.id} references unknown action ${a}`,\n });\n }\n }\n }\n for (const s of d.signals) {\n if (s.action && !actionIds.has(s.action)) {\n ctx.addIssue({\n code: \"custom\",\n message: `signal ${s.id} references unknown action ${s.action}`,\n });\n }\n if (s.resource && !resourceIds.has(s.resource)) {\n ctx.addIssue({\n code: \"custom\",\n message: `signal ${s.id} references unknown resource ${s.resource}`,\n });\n }\n }\n for (const p of d.policies) {\n if (!actionIds.has(p.runs)) {\n ctx.addIssue({ code: \"custom\", message: `policy ${p.id} runs unknown action ${p.runs}` });\n }\n }\n }\n });\nexport type AdminManifest = z.infer<typeof AdminManifestSchema>;\n\n// -----------------------------------------------------------------------------\n// Wire envelopes\n// -----------------------------------------------------------------------------\n\nexport const ResourceListSchema = z.object({\n items: z.array(z.record(z.string(), z.unknown())),\n total: z.number().int().min(0),\n /** When the list was produced from live probes; omitted for pure reads. */\n probedAt: z.string().datetime().optional(),\n});\nexport type ResourceList = z.infer<typeof ResourceListSchema>;\n\nexport const ActionRequestSchema = z.discriminatedUnion(\"mode\", [\n z.object({ mode: z.literal(\"plan\"), input: z.record(z.string(), z.unknown()).default({}) }),\n z.object({\n mode: z.literal(\"apply\"),\n input: z.record(z.string(), z.unknown()).default({}),\n /** Required when the action is destructive; ties the apply to a reviewed plan. */\n planId: z.string().min(1).optional(),\n }),\n]);\nexport type ActionRequest = z.infer<typeof ActionRequestSchema>;\n\nexport const PlanDiffEntrySchema = z.object({\n op: z.enum([\"add\", \"remove\", \"change\"]),\n path: z.string().min(1),\n from: z.unknown().optional(),\n to: z.unknown().optional(),\n});\nexport const ActionPlanSchema = z.object({\n planId: z.string().min(1),\n summary: z.string().min(1),\n diff: z.array(PlanDiffEntrySchema),\n affected: z\n .array(z.object({ resource: IdSchema, id: z.string(), label: z.string().optional() }))\n .default([]),\n warnings: z.array(z.string()).default([]),\n /** Plans expire; an apply after this is refused. */\n expiresAt: z.string().datetime(),\n});\nexport type ActionPlan = z.infer<typeof ActionPlanSchema>;\n\nexport const ActionResultSchema = z.object({\n /** Audit event id written by the product for this apply. */\n auditId: z.string().min(1),\n summary: z.string().min(1),\n result: z.record(z.string(), z.unknown()).optional(),\n});\nexport type ActionResult = z.infer<typeof ActionResultSchema>;\n\nexport const SignalReadingSchema = z.object({\n id: IdSchema,\n status: z.enum([\"ok\", \"raised\", \"unknown\"]),\n severity: AdminSeveritySchema,\n probedAt: z.string().datetime(),\n title: z.string().optional(),\n detail: z.string().optional(),\n resource: IdSchema.optional(),\n action: IdSchema.optional(),\n data: z.record(z.string(), z.unknown()).optional(),\n});\nexport type SignalReading = z.infer<typeof SignalReadingSchema>;\n\n/** Standard error body for contract endpoints. */\nexport const AdminErrorSchema = z.object({\n error: z.object({\n code: z.enum([\n \"unauthenticated\",\n \"forbidden\",\n \"not_found\",\n \"invalid_input\",\n \"plan_required\",\n \"plan_expired\",\n \"upstream_unavailable\",\n \"internal\",\n ]),\n message: z.string(),\n }),\n});\nexport type AdminError = z.infer<typeof AdminErrorSchema>;\n\n/** Validate an apply against its action: destructive applies must reference a plan. */\nexport function assertApplyAllowed(action: AdminAction, request: ActionRequest): AdminError | null {\n if (request.mode !== \"apply\") return null;\n if ((action.destructive || action.plan) && !request.planId) {\n return {\n error: {\n code: \"plan_required\",\n message: `${action.id} requires a reviewed plan before apply`,\n },\n };\n }\n return null;\n}\n\n/** Resolve a contract path against the manifest origin. */\nexport function resolveContractUrl(manifest: Pick<AdminManifest, \"origin\">, path: string): string {\n return new URL(path, manifest.origin).toString();\n}\n\n/**\n * The HTTP status an admin error travels as.\n *\n * Cloudflare sits in front of every admin and product host, and it replaces an\n * origin's `502` or `504` with its own branded HTML error page. The body we\n * wrote — the code and the message the operator needs — is discarded before the\n * browser sees it, so the console can only report `network · HTTP 502`. A\n * contract endpoint therefore never answers with a gateway status: an upstream\n * that failed is `503`, and a fault of our own is `500`. Both reach the client\n * with their JSON envelope intact.\n */\nexport const ADMIN_ERROR_STATUS: Record<AdminError[\"error\"][\"code\"], number> = {\n unauthenticated: 401,\n forbidden: 403,\n not_found: 404,\n invalid_input: 400,\n plan_required: 409,\n plan_expired: 409,\n upstream_unavailable: 503,\n internal: 500,\n};\n\n/**\n * Narrow an arbitrary status to one that survives the CDN, preserving anything\n * already safe. Use it when echoing an upstream contract call's status.\n */\nexport function cdnSafeStatus(status: number | undefined, fallback = 503): number {\n if (!status || status === 502 || status === 504 || status < 400 || status > 599) return fallback;\n return status;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,218 @@
1
+ // src/sleptons.ts
2
+ import { z } from "zod";
3
+ var RESUME_CONTENT_VERSION = 1;
4
+ var ResumeLangSchema = z.enum(["ZH", "EN", "MIX"]);
5
+ var ResumePeriodSchema = z.string().max(40);
6
+ var shortText = z.string().max(200);
7
+ var bullet = z.string().max(600);
8
+ var bullets = z.array(bullet).max(12);
9
+ var tags = z.array(z.string().max(40)).max(20);
10
+ var ResumeLinksSchema = z.object({
11
+ github: z.string().max(200).optional(),
12
+ linkedin: z.string().max(200).optional(),
13
+ twitter: z.string().max(200).optional(),
14
+ personal: z.string().max(200).optional()
15
+ }).partial();
16
+ var ResumeBasicSchema = z.object({
17
+ name: z.string().min(1).max(120),
18
+ name_en: z.string().max(120).optional(),
19
+ email: z.email().optional(),
20
+ phone: z.string().max(40).optional(),
21
+ location: z.string().max(120).optional(),
22
+ website: z.url().optional(),
23
+ links: ResumeLinksSchema.optional()
24
+ });
25
+ var ResumeObjectiveSchema = z.object({
26
+ summary: z.string().max(4e3).optional(),
27
+ // sanitized HTML or plain text
28
+ advantage_tags: z.array(z.string().max(40)).max(8).optional()
29
+ });
30
+ var VentureStageSchema = z.enum([
31
+ "idea",
32
+ "building",
33
+ "launched",
34
+ "scaling",
35
+ "exited",
36
+ "closed"
37
+ ]);
38
+ var ResumeVentureSchema = z.object({
39
+ name: shortText,
40
+ role: shortText.optional(),
41
+ period: ResumePeriodSchema.optional(),
42
+ stage: VentureStageSchema.optional(),
43
+ outcome: z.string().max(600).optional(),
44
+ url: z.url().optional(),
45
+ details: bullets.optional()
46
+ });
47
+ var ExperienceKindSchema = z.enum(["work", "campus", "founder"]);
48
+ var ResumeExperienceSchema = z.object({
49
+ kind: ExperienceKindSchema.default("work"),
50
+ period: ResumePeriodSchema,
51
+ org: shortText,
52
+ title: shortText,
53
+ details: bullets.optional(),
54
+ rich: z.string().max(6e3).optional(),
55
+ tags: tags.optional()
56
+ });
57
+ var ResumeEducationSchema = z.object({
58
+ school: shortText,
59
+ school_en: shortText.optional(),
60
+ major: shortText.optional(),
61
+ degree: shortText.optional(),
62
+ period: ResumePeriodSchema.optional(),
63
+ gpa: z.string().max(40).optional(),
64
+ courses: z.array(z.string().max(80)).max(30).optional()
65
+ });
66
+ var ResumeProjectSchema = z.object({
67
+ name: shortText,
68
+ role: shortText.optional(),
69
+ period: ResumePeriodSchema.optional(),
70
+ stack: tags.optional(),
71
+ details: bullets.optional(),
72
+ links: z.array(z.string().max(300)).max(6).optional()
73
+ });
74
+ var ResumeAchievementSchema = z.object({
75
+ title: shortText,
76
+ level: z.string().max(40).optional(),
77
+ year: z.string().max(10).optional()
78
+ });
79
+ var ResumeCertificateSchema = z.object({
80
+ name: shortText,
81
+ issuer: shortText.optional(),
82
+ year: z.string().max(10).optional()
83
+ });
84
+ var RESUME_SKILL_CATEGORIES = [
85
+ "programming",
86
+ "ai_engineering",
87
+ "ai_theory",
88
+ "data",
89
+ "product",
90
+ "finance",
91
+ "tools",
92
+ "ai_tools",
93
+ "languages"
94
+ ];
95
+ var ResumeSkillsSchema = z.object(
96
+ Object.fromEntries(RESUME_SKILL_CATEGORIES.map((k) => [k, tags.optional()]))
97
+ ).partial();
98
+ var ResumePublicationSchema = z.object({
99
+ title: z.string().max(300),
100
+ venue: shortText.optional(),
101
+ year: z.string().max(10).optional(),
102
+ url: z.string().max(300).optional()
103
+ });
104
+ var ResumePatentSchema = z.object({
105
+ title: z.string().max(300),
106
+ id: z.string().max(60).optional(),
107
+ year: z.string().max(10).optional(),
108
+ status: z.string().max(40).optional()
109
+ });
110
+ var ResumeOpenSourceSchema = z.object({
111
+ repo: z.string().max(200),
112
+ stars: z.number().int().nonnegative().optional(),
113
+ role: shortText.optional(),
114
+ highlights: bullets.optional()
115
+ });
116
+ var ResumeFundingSchema = z.object({
117
+ round: z.string().max(40),
118
+ amount: z.string().max(40).optional(),
119
+ date: z.string().max(20).optional(),
120
+ investors: z.array(shortText).max(20).optional()
121
+ });
122
+ var ResumePressSchema = z.object({
123
+ title: z.string().max(300),
124
+ outlet: shortText.optional(),
125
+ url: z.url().optional(),
126
+ date: z.string().max(20).optional()
127
+ });
128
+ var ResumeVolunteeringSchema = z.object({
129
+ org: shortText,
130
+ role: shortText.optional(),
131
+ period: ResumePeriodSchema.optional(),
132
+ details: bullets.optional()
133
+ });
134
+ var ResumeMarginsSchema = z.object({
135
+ top: z.string().max(10),
136
+ right: z.string().max(10),
137
+ bottom: z.string().max(10),
138
+ left: z.string().max(10)
139
+ });
140
+ var DEFAULT_RESUME_MARGINS = {
141
+ top: "12mm",
142
+ right: "12mm",
143
+ bottom: "12mm",
144
+ left: "12mm"
145
+ };
146
+ var ResumePreferencesSchema = z.object({
147
+ length: z.enum(["1page", "2pages"]).default("1page"),
148
+ show_icons: z.boolean().default(true),
149
+ show_contact_public: z.boolean().default(false),
150
+ paper: z.enum(["A4", "Letter"]).default("A4"),
151
+ margins: ResumeMarginsSchema.default(DEFAULT_RESUME_MARGINS),
152
+ max_bullets_per_entry: z.number().int().min(1).max(8).default(3),
153
+ section_order: z.array(z.string().max(40)).max(30).optional()
154
+ });
155
+ var ResumeContentV1Schema = z.object({
156
+ version: z.literal(RESUME_CONTENT_VERSION).default(RESUME_CONTENT_VERSION),
157
+ basic: ResumeBasicSchema,
158
+ objective: ResumeObjectiveSchema.default({}),
159
+ ventures: z.array(ResumeVentureSchema).max(20).optional(),
160
+ experiences: z.array(ResumeExperienceSchema).max(30).optional(),
161
+ education: z.array(ResumeEducationSchema).max(10).optional(),
162
+ projects: z.array(ResumeProjectSchema).max(30).optional(),
163
+ achievements: z.array(ResumeAchievementSchema).max(30).optional(),
164
+ certificates: z.array(ResumeCertificateSchema).max(30).optional(),
165
+ skills: ResumeSkillsSchema.optional(),
166
+ publications: z.array(ResumePublicationSchema).max(50).optional(),
167
+ patents: z.array(ResumePatentSchema).max(30).optional(),
168
+ opensource: z.array(ResumeOpenSourceSchema).max(30).optional(),
169
+ funding: z.array(ResumeFundingSchema).max(20).optional(),
170
+ press: z.array(ResumePressSchema).max(30).optional(),
171
+ volunteering: z.array(ResumeVolunteeringSchema).max(20).optional(),
172
+ interests: z.array(z.string().max(60)).max(20).optional(),
173
+ preferences: ResumePreferencesSchema.prefault({})
174
+ });
175
+ var ResumeWriteSchema = z.object({
176
+ content: ResumeContentV1Schema,
177
+ is_public: z.boolean().optional(),
178
+ language: ResumeLangSchema.optional()
179
+ });
180
+ var ResumeDerivedSchema = z.object({
181
+ headline: z.string().max(120).nullable(),
182
+ skills_flat: z.array(z.string()),
183
+ highlights: z.array(z.string()).max(3),
184
+ years_active: z.number().int().nonnegative().nullable(),
185
+ completeness: z.number().int().min(0).max(100)
186
+ });
187
+
188
+ export {
189
+ RESUME_CONTENT_VERSION,
190
+ ResumeLangSchema,
191
+ ResumePeriodSchema,
192
+ ResumeLinksSchema,
193
+ ResumeBasicSchema,
194
+ ResumeObjectiveSchema,
195
+ VentureStageSchema,
196
+ ResumeVentureSchema,
197
+ ExperienceKindSchema,
198
+ ResumeExperienceSchema,
199
+ ResumeEducationSchema,
200
+ ResumeProjectSchema,
201
+ ResumeAchievementSchema,
202
+ ResumeCertificateSchema,
203
+ RESUME_SKILL_CATEGORIES,
204
+ ResumeSkillsSchema,
205
+ ResumePublicationSchema,
206
+ ResumePatentSchema,
207
+ ResumeOpenSourceSchema,
208
+ ResumeFundingSchema,
209
+ ResumePressSchema,
210
+ ResumeVolunteeringSchema,
211
+ ResumeMarginsSchema,
212
+ DEFAULT_RESUME_MARGINS,
213
+ ResumePreferencesSchema,
214
+ ResumeContentV1Schema,
215
+ ResumeWriteSchema,
216
+ ResumeDerivedSchema
217
+ };
218
+ //# sourceMappingURL=chunk-PU65L2HQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sleptons.ts"],"sourcesContent":["import { z } from \"zod\";\n\n/**\n * Sleptons résumé content contract (v1).\n *\n * The résumé is the structured \"track record\" attached 1:1 to a Sleptons member\n * profile. It is stored as a JSON document (`sleptons_resumes.content`) and\n * validated against this schema on every write. Derived/query columns are\n * computed by the consumer (apps/sleptons), never stored inside `content`.\n *\n * Design source: docs/superpowers/specs/2026-09-07-sleptons-resume-system-design.md §3.\n * Lineage: adapted from the CVise `Profile` Zod model (legacy, archived 2026-09-07).\n */\n\nexport const RESUME_CONTENT_VERSION = 1 as const;\n\nexport const ResumeLangSchema = z.enum([\"ZH\", \"EN\", \"MIX\"]);\nexport type ResumeLang = z.infer<typeof ResumeLangSchema>;\n\nexport const ResumePeriodSchema = z.string().max(40); // free text, e.g. \"2024.06 – 2025.01\"\n\nconst shortText = z.string().max(200);\nconst bullet = z.string().max(600);\nconst bullets = z.array(bullet).max(12);\nconst tags = z.array(z.string().max(40)).max(20);\n\nexport const ResumeLinksSchema = z\n .object({\n github: z.string().max(200).optional(),\n linkedin: z.string().max(200).optional(),\n twitter: z.string().max(200).optional(),\n personal: z.string().max(200).optional(),\n })\n .partial();\n\nexport const ResumeBasicSchema = z.object({\n name: z.string().min(1).max(120),\n name_en: z.string().max(120).optional(),\n email: z.email().optional(),\n phone: z.string().max(40).optional(),\n location: z.string().max(120).optional(),\n website: z.url().optional(),\n links: ResumeLinksSchema.optional(),\n});\n\nexport const ResumeObjectiveSchema = z.object({\n summary: z.string().max(4000).optional(), // sanitized HTML or plain text\n advantage_tags: z.array(z.string().max(40)).max(8).optional(),\n});\n\nexport const VentureStageSchema = z.enum([\n \"idea\",\n \"building\",\n \"launched\",\n \"scaling\",\n \"exited\",\n \"closed\",\n]);\nexport type VentureStage = z.infer<typeof VentureStageSchema>;\n\nexport const ResumeVentureSchema = z.object({\n name: shortText,\n role: shortText.optional(),\n period: ResumePeriodSchema.optional(),\n stage: VentureStageSchema.optional(),\n outcome: z.string().max(600).optional(),\n url: z.url().optional(),\n details: bullets.optional(),\n});\n\nexport const ExperienceKindSchema = z.enum([\"work\", \"campus\", \"founder\"]);\nexport type ExperienceKind = z.infer<typeof ExperienceKindSchema>;\n\nexport const ResumeExperienceSchema = z.object({\n kind: ExperienceKindSchema.default(\"work\"),\n period: ResumePeriodSchema,\n org: shortText,\n title: shortText,\n details: bullets.optional(),\n rich: z.string().max(6000).optional(),\n tags: tags.optional(),\n});\n\nexport const ResumeEducationSchema = z.object({\n school: shortText,\n school_en: shortText.optional(),\n major: shortText.optional(),\n degree: shortText.optional(),\n period: ResumePeriodSchema.optional(),\n gpa: z.string().max(40).optional(),\n courses: z.array(z.string().max(80)).max(30).optional(),\n});\n\nexport const ResumeProjectSchema = z.object({\n name: shortText,\n role: shortText.optional(),\n period: ResumePeriodSchema.optional(),\n stack: tags.optional(),\n details: bullets.optional(),\n links: z.array(z.string().max(300)).max(6).optional(),\n});\n\nexport const ResumeAchievementSchema = z.object({\n title: shortText,\n level: z.string().max(40).optional(),\n year: z.string().max(10).optional(),\n});\n\nexport const ResumeCertificateSchema = z.object({\n name: shortText,\n issuer: shortText.optional(),\n year: z.string().max(10).optional(),\n});\n\nexport const RESUME_SKILL_CATEGORIES = [\n \"programming\",\n \"ai_engineering\",\n \"ai_theory\",\n \"data\",\n \"product\",\n \"finance\",\n \"tools\",\n \"ai_tools\",\n \"languages\",\n] as const;\nexport type ResumeSkillCategory = (typeof RESUME_SKILL_CATEGORIES)[number];\n\nexport const ResumeSkillsSchema = z\n .object(\n Object.fromEntries(RESUME_SKILL_CATEGORIES.map((k) => [k, tags.optional()])) as Record<\n ResumeSkillCategory,\n z.ZodOptional<typeof tags>\n >,\n )\n .partial();\n\nexport const ResumePublicationSchema = z.object({\n title: z.string().max(300),\n venue: shortText.optional(),\n year: z.string().max(10).optional(),\n url: z.string().max(300).optional(),\n});\n\nexport const ResumePatentSchema = z.object({\n title: z.string().max(300),\n id: z.string().max(60).optional(),\n year: z.string().max(10).optional(),\n status: z.string().max(40).optional(),\n});\n\nexport const ResumeOpenSourceSchema = z.object({\n repo: z.string().max(200),\n stars: z.number().int().nonnegative().optional(),\n role: shortText.optional(),\n highlights: bullets.optional(),\n});\n\nexport const ResumeFundingSchema = z.object({\n round: z.string().max(40),\n amount: z.string().max(40).optional(),\n date: z.string().max(20).optional(),\n investors: z.array(shortText).max(20).optional(),\n});\n\nexport const ResumePressSchema = z.object({\n title: z.string().max(300),\n outlet: shortText.optional(),\n url: z.url().optional(),\n date: z.string().max(20).optional(),\n});\n\nexport const ResumeVolunteeringSchema = z.object({\n org: shortText,\n role: shortText.optional(),\n period: ResumePeriodSchema.optional(),\n details: bullets.optional(),\n});\n\nexport const ResumeMarginsSchema = z.object({\n top: z.string().max(10),\n right: z.string().max(10),\n bottom: z.string().max(10),\n left: z.string().max(10),\n});\n\nexport const DEFAULT_RESUME_MARGINS = {\n top: \"12mm\",\n right: \"12mm\",\n bottom: \"12mm\",\n left: \"12mm\",\n} as const;\n\nexport const ResumePreferencesSchema = z.object({\n length: z.enum([\"1page\", \"2pages\"]).default(\"1page\"),\n show_icons: z.boolean().default(true),\n show_contact_public: z.boolean().default(false),\n paper: z.enum([\"A4\", \"Letter\"]).default(\"A4\"),\n margins: ResumeMarginsSchema.default(DEFAULT_RESUME_MARGINS),\n max_bullets_per_entry: z.number().int().min(1).max(8).default(3),\n section_order: z.array(z.string().max(40)).max(30).optional(),\n});\n\nexport const ResumeContentV1Schema = z.object({\n version: z.literal(RESUME_CONTENT_VERSION).default(RESUME_CONTENT_VERSION),\n basic: ResumeBasicSchema,\n objective: ResumeObjectiveSchema.default({}),\n ventures: z.array(ResumeVentureSchema).max(20).optional(),\n experiences: z.array(ResumeExperienceSchema).max(30).optional(),\n education: z.array(ResumeEducationSchema).max(10).optional(),\n projects: z.array(ResumeProjectSchema).max(30).optional(),\n achievements: z.array(ResumeAchievementSchema).max(30).optional(),\n certificates: z.array(ResumeCertificateSchema).max(30).optional(),\n skills: ResumeSkillsSchema.optional(),\n publications: z.array(ResumePublicationSchema).max(50).optional(),\n patents: z.array(ResumePatentSchema).max(30).optional(),\n opensource: z.array(ResumeOpenSourceSchema).max(30).optional(),\n funding: z.array(ResumeFundingSchema).max(20).optional(),\n press: z.array(ResumePressSchema).max(30).optional(),\n volunteering: z.array(ResumeVolunteeringSchema).max(20).optional(),\n interests: z.array(z.string().max(60)).max(20).optional(),\n preferences: ResumePreferencesSchema.prefault({}),\n});\nexport type ResumeContentV1 = z.infer<typeof ResumeContentV1Schema>;\nexport type ResumeContentV1Input = z.input<typeof ResumeContentV1Schema>;\n\n/** Write payload accepted by `PUT /api/resume`. */\nexport const ResumeWriteSchema = z.object({\n content: ResumeContentV1Schema,\n is_public: z.boolean().optional(),\n language: ResumeLangSchema.optional(),\n});\nexport type ResumeWrite = z.infer<typeof ResumeWriteSchema>;\n\n/** Columns derived from `content` on every save; see apps/sleptons/src/lib/resume/derive.ts. */\nexport const ResumeDerivedSchema = z.object({\n headline: z.string().max(120).nullable(),\n skills_flat: z.array(z.string()),\n highlights: z.array(z.string()).max(3),\n years_active: z.number().int().nonnegative().nullable(),\n completeness: z.number().int().min(0).max(100),\n});\nexport type ResumeDerived = z.infer<typeof ResumeDerivedSchema>;\n"],"mappings":"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","names":[]}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
+ export { ADMIN_CONTRACT_VERSION, ADMIN_ERROR_STATUS, ActionPlan, ActionPlanSchema, ActionRequest, ActionRequestSchema, ActionResult, ActionResultSchema, AdminAction, AdminActionSchema, AdminColumn, AdminColumnSchema, AdminDomain, AdminDomainId, AdminDomainIdSchema, AdminDomainSchema, AdminError, AdminErrorSchema, AdminManifest, AdminManifestSchema, AdminPolicy, AdminPolicySchema, AdminResource, AdminResourceSchema, AdminSeverity, AdminSeveritySchema, AdminSignal, AdminSignalSchema, AdminStatus, AdminStatusSchema, PlanDiffEntrySchema, ResourceList, ResourceListSchema, STAFF_ROLE_RANK, SignalReading, SignalReadingSchema, StaffRole, StaffRoleSchema, assertApplyAllowed, cdnSafeStatus, resolveContractUrl, roleAtLeast } from './admin.js';
1
2
  export { PricingCatalogVersion, PricingCatalogVersionSchema, UsageLedgerEntryInput, UsageLedgerEntryInputSchema, UsageLedgerSourceContract, UsageLedgerSourceContractSchema, UsageTypeContract, UsageTypeContractSchema } from './billing.js';
2
3
  export { EventContext, EventContextSchema, EventEnvelope, EventEnvelopeSchema } from './events.js';
3
4
  export { AuthProvider, AuthProviderSchema, CanonicalIdentity, CanonicalIdentitySchema, CanonicalPlan, CanonicalPlanSchema, CanonicalRole, CanonicalRoleSchema, ExternalAccountLink, ExternalAccountLinkSchema, NebutraOAuthScope, NebutraOAuthScopeSchema, OAuthClientRegistration, OAuthClientRegistrationSchema, OAuthClientType, OAuthClientTypeSchema, TenantHeaderContract, TenantHeaderContractSchema } from './identity.js';
4
5
  export { NotificationChannelContract, NotificationChannelContractSchema, NotificationFrequencyContract, NotificationFrequencyContractSchema, NotificationItemContract, NotificationItemContractSchema, NotificationListQueryContract, NotificationListQueryContractSchema, NotificationListResponseContract, NotificationListResponseContractSchema, NotificationMarkReadRequestContract, NotificationMarkReadRequestContractSchema, NotificationMutationCountResponseContract, NotificationMutationCountResponseContractSchema, NotificationPreferenceContract, NotificationPreferenceContractSchema, NotificationRuntimeStatusContract, NotificationRuntimeStatusContractSchema, NotificationSettingsUpdateRequestContract, NotificationSettingsUpdateRequestContractSchema, NotificationSettingsUpdateResponseContract, NotificationSettingsUpdateResponseContractSchema, NotificationUnreadCountResponseContract, NotificationUnreadCountResponseContractSchema } from './notifications.js';
6
+ export { DEFAULT_RESUME_MARGINS, ExperienceKind, ExperienceKindSchema, RESUME_CONTENT_VERSION, RESUME_SKILL_CATEGORIES, ResumeAchievementSchema, ResumeBasicSchema, ResumeCertificateSchema, ResumeContentV1, ResumeContentV1Input, ResumeContentV1Schema, ResumeDerived, ResumeDerivedSchema, ResumeEducationSchema, ResumeExperienceSchema, ResumeFundingSchema, ResumeLang, ResumeLangSchema, ResumeLinksSchema, ResumeMarginsSchema, ResumeObjectiveSchema, ResumeOpenSourceSchema, ResumePatentSchema, ResumePeriodSchema, ResumePreferencesSchema, ResumePressSchema, ResumeProjectSchema, ResumePublicationSchema, ResumeSkillCategory, ResumeSkillsSchema, ResumeVentureSchema, ResumeVolunteeringSchema, ResumeWrite, ResumeWriteSchema, VentureStage, VentureStageSchema } from './sleptons.js';
5
7
  import 'zod';