@bestagentkits/render 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/LICENSE +21 -0
- package/README.md +166 -0
- package/dist/cli.d.ts +18 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +336 -0
- package/dist/cli.js.map +1 -0
- package/dist/diagnostics.d.ts +45 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +57 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/diagram/adapter.d.ts +71 -0
- package/dist/diagram/adapter.d.ts.map +1 -0
- package/dist/diagram/adapter.js +87 -0
- package/dist/diagram/adapter.js.map +1 -0
- package/dist/errors.d.ts +37 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +42 -0
- package/dist/errors.js.map +1 -0
- package/dist/hash.d.ts +14 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +27 -0
- package/dist/hash.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/yaml-error.d.ts +14 -0
- package/dist/internal/yaml-error.d.ts.map +1 -0
- package/dist/internal/yaml-error.js +12 -0
- package/dist/internal/yaml-error.js.map +1 -0
- package/dist/ir.d.ts +77 -0
- package/dist/ir.d.ts.map +1 -0
- package/dist/ir.js +20 -0
- package/dist/ir.js.map +1 -0
- package/dist/json.d.ts +23 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +47 -0
- package/dist/json.js.map +1 -0
- package/dist/registry/actions.d.ts +48 -0
- package/dist/registry/actions.d.ts.map +1 -0
- package/dist/registry/actions.js +274 -0
- package/dist/registry/actions.js.map +1 -0
- package/dist/registry/prop-schema.d.ts +108 -0
- package/dist/registry/prop-schema.d.ts.map +1 -0
- package/dist/registry/prop-schema.js +400 -0
- package/dist/registry/prop-schema.js.map +1 -0
- package/dist/registry/registry.d.ts +47 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +201 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/registry/roster.d.ts +53 -0
- package/dist/registry/roster.d.ts.map +1 -0
- package/dist/registry/roster.js +692 -0
- package/dist/registry/roster.js.map +1 -0
- package/dist/render/blocks.d.ts +41 -0
- package/dist/render/blocks.d.ts.map +1 -0
- package/dist/render/blocks.js +749 -0
- package/dist/render/blocks.js.map +1 -0
- package/dist/render/charts.d.ts +29 -0
- package/dist/render/charts.d.ts.map +1 -0
- package/dist/render/charts.js +235 -0
- package/dist/render/charts.js.map +1 -0
- package/dist/render/document.d.ts +40 -0
- package/dist/render/document.d.ts.map +1 -0
- package/dist/render/document.js +90 -0
- package/dist/render/document.js.map +1 -0
- package/dist/render/escape.d.ts +46 -0
- package/dist/render/escape.d.ts.map +1 -0
- package/dist/render/escape.js +108 -0
- package/dist/render/escape.js.map +1 -0
- package/dist/render/render.d.ts +52 -0
- package/dist/render/render.d.ts.map +1 -0
- package/dist/render/render.js +216 -0
- package/dist/render/render.js.map +1 -0
- package/dist/render/runtime.d.ts +25 -0
- package/dist/render/runtime.d.ts.map +1 -0
- package/dist/render/runtime.js +451 -0
- package/dist/render/runtime.js.map +1 -0
- package/dist/render/styles.d.ts +15 -0
- package/dist/render/styles.d.ts.map +1 -0
- package/dist/render/styles.js +163 -0
- package/dist/render/styles.js.map +1 -0
- package/dist/render/verify.d.ts +25 -0
- package/dist/render/verify.d.ts.map +1 -0
- package/dist/render/verify.js +168 -0
- package/dist/render/verify.js.map +1 -0
- package/dist/spec/bindings.d.ts +19 -0
- package/dist/spec/bindings.d.ts.map +1 -0
- package/dist/spec/bindings.js +51 -0
- package/dist/spec/bindings.js.map +1 -0
- package/dist/spec/bounds.d.ts +43 -0
- package/dist/spec/bounds.d.ts.map +1 -0
- package/dist/spec/bounds.js +144 -0
- package/dist/spec/bounds.js.map +1 -0
- package/dist/spec/forbidden.d.ts +27 -0
- package/dist/spec/forbidden.d.ts.map +1 -0
- package/dist/spec/forbidden.js +91 -0
- package/dist/spec/forbidden.js.map +1 -0
- package/dist/spec/migrate.d.ts +33 -0
- package/dist/spec/migrate.d.ts.map +1 -0
- package/dist/spec/migrate.js +113 -0
- package/dist/spec/migrate.js.map +1 -0
- package/dist/spec/normalize.d.ts +29 -0
- package/dist/spec/normalize.d.ts.map +1 -0
- package/dist/spec/normalize.js +649 -0
- package/dist/spec/normalize.js.map +1 -0
- package/dist/spec/parse.d.ts +22 -0
- package/dist/spec/parse.d.ts.map +1 -0
- package/dist/spec/parse.js +62 -0
- package/dist/spec/parse.js.map +1 -0
- package/dist/spec/providers.d.ts +30 -0
- package/dist/spec/providers.d.ts.map +1 -0
- package/dist/spec/providers.js +64 -0
- package/dist/spec/providers.js.map +1 -0
- package/dist/spec/validate.d.ts +28 -0
- package/dist/spec/validate.d.ts.map +1 -0
- package/dist/spec/validate.js +68 -0
- package/dist/spec/validate.js.map +1 -0
- package/dist/theme/load-theme.d.ts +55 -0
- package/dist/theme/load-theme.d.ts.map +1 -0
- package/dist/theme/load-theme.js +219 -0
- package/dist/theme/load-theme.js.map +1 -0
- package/dist/theme/presets.d.ts +50 -0
- package/dist/theme/presets.d.ts.map +1 -0
- package/dist/theme/presets.js +304 -0
- package/dist/theme/presets.js.map +1 -0
- package/dist/theme/theme-catalog.d.ts +68 -0
- package/dist/theme/theme-catalog.d.ts.map +1 -0
- package/dist/theme/theme-catalog.js +198 -0
- package/dist/theme/theme-catalog.js.map +1 -0
- package/dist/theme/tokens.d.ts +38 -0
- package/dist/theme/tokens.d.ts.map +1 -0
- package/dist/theme/tokens.js +190 -0
- package/dist/theme/tokens.js.map +1 -0
- package/dist/version.d.ts +12 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +12 -0
- package/dist/version.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Declarative property schemas.
|
|
3
|
+
*
|
|
4
|
+
* One source of truth serves three consumers: runtime validation (with stable
|
|
5
|
+
* JSON paths), the published JSON Schema, and the compact `catalog()` /
|
|
6
|
+
* `describe()` contracts. Keeping them derived from one definition is what
|
|
7
|
+
* stops the documentation from drifting away from the validator.
|
|
8
|
+
*/
|
|
9
|
+
import { DiagnosticBag, pathIndex, pathKey } from '../diagnostics.js';
|
|
10
|
+
import { isPlainObject } from '../json.js';
|
|
11
|
+
export const DEFAULT_URL_SCHEMES = ['https', 'http', 'mailto'];
|
|
12
|
+
export const NODE_ID_PATTERN = /^[a-z0-9][a-z0-9-]{0,63}$/;
|
|
13
|
+
function isRelativeReference(value) {
|
|
14
|
+
if (value === '')
|
|
15
|
+
return false;
|
|
16
|
+
if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(value))
|
|
17
|
+
return false;
|
|
18
|
+
return !value.startsWith('//');
|
|
19
|
+
}
|
|
20
|
+
function validateUrl(schema, value, path, bag) {
|
|
21
|
+
if (isRelativeReference(value))
|
|
22
|
+
return true;
|
|
23
|
+
const schemes = schema.schemes ?? DEFAULT_URL_SCHEMES;
|
|
24
|
+
let parsed;
|
|
25
|
+
try {
|
|
26
|
+
parsed = new URL(value);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
bag.add({
|
|
30
|
+
code: 'SPEC_VALIDATION_ERROR',
|
|
31
|
+
path,
|
|
32
|
+
message: `"${value}" is neither a relative reference nor an absolute URL`,
|
|
33
|
+
});
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
const scheme = parsed.protocol.replace(':', '').toLowerCase();
|
|
37
|
+
if (!schemes.includes(scheme)) {
|
|
38
|
+
bag.add({
|
|
39
|
+
code: 'POLICY_VIOLATION',
|
|
40
|
+
path,
|
|
41
|
+
message: `URL scheme "${scheme}" is not allowed here (allowed: ${schemes.join(', ')})`,
|
|
42
|
+
details: { scheme, allowed: [...schemes] },
|
|
43
|
+
});
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
function defaultFor(schema) {
|
|
49
|
+
switch (schema.kind) {
|
|
50
|
+
case 'string':
|
|
51
|
+
case 'text':
|
|
52
|
+
case 'url':
|
|
53
|
+
return schema.default;
|
|
54
|
+
case 'number':
|
|
55
|
+
return schema.default;
|
|
56
|
+
case 'boolean':
|
|
57
|
+
return schema.default;
|
|
58
|
+
case 'list':
|
|
59
|
+
return schema.required === true ? undefined : [];
|
|
60
|
+
case 'record':
|
|
61
|
+
return schema.required === true ? undefined : {};
|
|
62
|
+
default:
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Validate one property value against its schema, appending diagnostics and
|
|
68
|
+
* returning the normalized value (or `undefined` when absent/optional).
|
|
69
|
+
*/
|
|
70
|
+
export function validateProp(schema, value, path, bag) {
|
|
71
|
+
if (value === undefined) {
|
|
72
|
+
if (schema.required === true) {
|
|
73
|
+
bag.add({ code: 'SPEC_VALIDATION_ERROR', path, message: 'required value is missing' });
|
|
74
|
+
}
|
|
75
|
+
return defaultFor(schema);
|
|
76
|
+
}
|
|
77
|
+
switch (schema.kind) {
|
|
78
|
+
case 'string': {
|
|
79
|
+
if (typeof value !== 'string') {
|
|
80
|
+
bag.add({ code: 'SPEC_VALIDATION_ERROR', path, message: 'expected a string' });
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
const maxLength = schema.maxLength ?? 2_000;
|
|
84
|
+
if (value.length > maxLength) {
|
|
85
|
+
bag.add({
|
|
86
|
+
code: 'SPEC_BOUNDS_ERROR',
|
|
87
|
+
path,
|
|
88
|
+
message: `string is ${value.length} characters, limit is ${maxLength}`,
|
|
89
|
+
});
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
if (schema.id === true && !NODE_ID_PATTERN.test(value)) {
|
|
93
|
+
bag.add({
|
|
94
|
+
code: 'SPEC_VALIDATION_ERROR',
|
|
95
|
+
path,
|
|
96
|
+
message: `"${value}" is not a valid id (lowercase letters, digits and dashes, 64 max)`,
|
|
97
|
+
});
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
if (schema.enum !== undefined && !schema.enum.includes(value)) {
|
|
101
|
+
bag.add({
|
|
102
|
+
code: 'SPEC_VALIDATION_ERROR',
|
|
103
|
+
path,
|
|
104
|
+
message: `"${value}" is not one of: ${schema.enum.join(', ')}`,
|
|
105
|
+
details: { allowed: [...schema.enum] },
|
|
106
|
+
});
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
if (value.includes('\u0000')) {
|
|
110
|
+
bag.add({
|
|
111
|
+
code: 'SPEC_VALIDATION_ERROR',
|
|
112
|
+
path,
|
|
113
|
+
message: 'string contains a NUL character',
|
|
114
|
+
});
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
return value;
|
|
118
|
+
}
|
|
119
|
+
case 'text': {
|
|
120
|
+
if (typeof value !== 'string') {
|
|
121
|
+
bag.add({ code: 'SPEC_VALIDATION_ERROR', path, message: 'expected multiline text' });
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
const maxLength = schema.maxLength ?? 50_000;
|
|
125
|
+
if (value.length > maxLength) {
|
|
126
|
+
bag.add({
|
|
127
|
+
code: 'SPEC_BOUNDS_ERROR',
|
|
128
|
+
path,
|
|
129
|
+
message: `text is ${value.length} characters, limit is ${maxLength}`,
|
|
130
|
+
});
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
return value;
|
|
134
|
+
}
|
|
135
|
+
case 'number': {
|
|
136
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
137
|
+
bag.add({ code: 'SPEC_VALIDATION_ERROR', path, message: 'expected a finite number' });
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
if (schema.integer === true && !Number.isInteger(value)) {
|
|
141
|
+
bag.add({ code: 'SPEC_VALIDATION_ERROR', path, message: 'expected an integer' });
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
if (schema.min !== undefined && value < schema.min) {
|
|
145
|
+
bag.add({
|
|
146
|
+
code: 'SPEC_VALIDATION_ERROR',
|
|
147
|
+
path,
|
|
148
|
+
message: `${value} is below the minimum ${schema.min}`,
|
|
149
|
+
});
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
if (schema.max !== undefined && value > schema.max) {
|
|
153
|
+
bag.add({
|
|
154
|
+
code: 'SPEC_VALIDATION_ERROR',
|
|
155
|
+
path,
|
|
156
|
+
message: `${value} is above the maximum ${schema.max}`,
|
|
157
|
+
});
|
|
158
|
+
return undefined;
|
|
159
|
+
}
|
|
160
|
+
return value;
|
|
161
|
+
}
|
|
162
|
+
case 'boolean': {
|
|
163
|
+
if (typeof value !== 'boolean') {
|
|
164
|
+
bag.add({ code: 'SPEC_VALIDATION_ERROR', path, message: 'expected a boolean' });
|
|
165
|
+
return undefined;
|
|
166
|
+
}
|
|
167
|
+
return value;
|
|
168
|
+
}
|
|
169
|
+
case 'url': {
|
|
170
|
+
if (typeof value !== 'string') {
|
|
171
|
+
bag.add({
|
|
172
|
+
code: 'SPEC_VALIDATION_ERROR',
|
|
173
|
+
path,
|
|
174
|
+
message: 'expected a URL or relative path',
|
|
175
|
+
});
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
return validateUrl(schema, value, path, bag) ? value : undefined;
|
|
179
|
+
}
|
|
180
|
+
case 'list': {
|
|
181
|
+
if (!Array.isArray(value)) {
|
|
182
|
+
bag.add({ code: 'SPEC_VALIDATION_ERROR', path, message: 'expected a list' });
|
|
183
|
+
return undefined;
|
|
184
|
+
}
|
|
185
|
+
if (schema.minItems !== undefined && value.length < schema.minItems) {
|
|
186
|
+
bag.add({
|
|
187
|
+
code: 'SPEC_VALIDATION_ERROR',
|
|
188
|
+
path,
|
|
189
|
+
message: `list has ${value.length} items, minimum is ${schema.minItems}`,
|
|
190
|
+
});
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
if (schema.maxItems !== undefined && value.length > schema.maxItems) {
|
|
194
|
+
bag.add({
|
|
195
|
+
code: 'SPEC_BOUNDS_ERROR',
|
|
196
|
+
path,
|
|
197
|
+
message: `list has ${value.length} items, limit is ${schema.maxItems}`,
|
|
198
|
+
});
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
const result = [];
|
|
202
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
203
|
+
const item = validateProp(schema.of, value[index], pathIndex(path, index), bag);
|
|
204
|
+
if (item !== undefined)
|
|
205
|
+
result.push(item);
|
|
206
|
+
}
|
|
207
|
+
return result;
|
|
208
|
+
}
|
|
209
|
+
case 'object': {
|
|
210
|
+
if (!isPlainObject(value)) {
|
|
211
|
+
bag.add({ code: 'SPEC_VALIDATION_ERROR', path, message: 'expected an object' });
|
|
212
|
+
return undefined;
|
|
213
|
+
}
|
|
214
|
+
const result = {};
|
|
215
|
+
for (const [key, field] of Object.entries(schema.fields)) {
|
|
216
|
+
const fieldValue = validateProp(field, value[key], pathKey(path, key), bag);
|
|
217
|
+
if (fieldValue !== undefined)
|
|
218
|
+
result[key] = fieldValue;
|
|
219
|
+
}
|
|
220
|
+
for (const key of Object.keys(value)) {
|
|
221
|
+
if (!(key in schema.fields)) {
|
|
222
|
+
bag.add({
|
|
223
|
+
code: 'SPEC_VALIDATION_ERROR',
|
|
224
|
+
path: pathKey(path, key),
|
|
225
|
+
message: `unknown property "${key}"`,
|
|
226
|
+
details: { allowed: Object.keys(schema.fields) },
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return result;
|
|
231
|
+
}
|
|
232
|
+
case 'record': {
|
|
233
|
+
if (!isPlainObject(value)) {
|
|
234
|
+
bag.add({ code: 'SPEC_VALIDATION_ERROR', path, message: 'expected an object' });
|
|
235
|
+
return undefined;
|
|
236
|
+
}
|
|
237
|
+
const keys = Object.keys(value);
|
|
238
|
+
const maxKeys = schema.maxKeys ?? 200;
|
|
239
|
+
if (keys.length > maxKeys) {
|
|
240
|
+
bag.add({
|
|
241
|
+
code: 'SPEC_BOUNDS_ERROR',
|
|
242
|
+
path,
|
|
243
|
+
message: `object has ${keys.length} keys, limit is ${maxKeys}`,
|
|
244
|
+
});
|
|
245
|
+
return undefined;
|
|
246
|
+
}
|
|
247
|
+
const result = {};
|
|
248
|
+
for (const key of keys) {
|
|
249
|
+
if (key.length > 128) {
|
|
250
|
+
bag.add({
|
|
251
|
+
code: 'SPEC_BOUNDS_ERROR',
|
|
252
|
+
path: pathKey(path, key),
|
|
253
|
+
message: 'key is longer than 128 characters',
|
|
254
|
+
});
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
const item = validateProp(schema.of, value[key], pathKey(path, key), bag);
|
|
258
|
+
if (item !== undefined)
|
|
259
|
+
result[key] = item;
|
|
260
|
+
}
|
|
261
|
+
return result;
|
|
262
|
+
}
|
|
263
|
+
case 'oneOf': {
|
|
264
|
+
// Each option is attempted with its own diagnostics: a failed attempt must
|
|
265
|
+
// not poison the next candidate.
|
|
266
|
+
for (const option of schema.options) {
|
|
267
|
+
const attempt = new DiagnosticBag();
|
|
268
|
+
const candidate = validateProp(option, value, path, attempt);
|
|
269
|
+
if (!attempt.hasErrors)
|
|
270
|
+
return candidate;
|
|
271
|
+
}
|
|
272
|
+
bag.add({
|
|
273
|
+
code: 'SPEC_VALIDATION_ERROR',
|
|
274
|
+
path,
|
|
275
|
+
message: `value does not match any allowed shape (${schema.options.length} options)`,
|
|
276
|
+
});
|
|
277
|
+
return undefined;
|
|
278
|
+
}
|
|
279
|
+
case 'json': {
|
|
280
|
+
let serialized;
|
|
281
|
+
try {
|
|
282
|
+
serialized = JSON.stringify(value) ?? '';
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
bag.add({ code: 'SPEC_VALIDATION_ERROR', path, message: 'value is not JSON-serializable' });
|
|
286
|
+
return undefined;
|
|
287
|
+
}
|
|
288
|
+
const maxBytes = schema.maxBytes ?? 200_000;
|
|
289
|
+
if (serialized.length > maxBytes) {
|
|
290
|
+
bag.add({
|
|
291
|
+
code: 'SPEC_BOUNDS_ERROR',
|
|
292
|
+
path,
|
|
293
|
+
message: `payload is ${serialized.length} bytes, limit is ${maxBytes}`,
|
|
294
|
+
});
|
|
295
|
+
return undefined;
|
|
296
|
+
}
|
|
297
|
+
return value;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Validate a props object against a block's property schema. Unknown keys are
|
|
303
|
+
* errors: a silently ignored prop is a silent authoring mistake.
|
|
304
|
+
*/
|
|
305
|
+
export function validateProps(fields, value, path, bag) {
|
|
306
|
+
if (!isPlainObject(value)) {
|
|
307
|
+
bag.add({ code: 'SPEC_VALIDATION_ERROR', path, message: 'expected a block object' });
|
|
308
|
+
return {};
|
|
309
|
+
}
|
|
310
|
+
const result = {};
|
|
311
|
+
for (const [key, field] of Object.entries(fields)) {
|
|
312
|
+
const validated = validateProp(field, value[key], pathKey(path, key), bag);
|
|
313
|
+
if (validated !== undefined)
|
|
314
|
+
result[key] = validated;
|
|
315
|
+
}
|
|
316
|
+
for (const key of Object.keys(value)) {
|
|
317
|
+
if (!(key in fields)) {
|
|
318
|
+
bag.add({
|
|
319
|
+
code: 'SPEC_VALIDATION_ERROR',
|
|
320
|
+
path: pathKey(path, key),
|
|
321
|
+
message: `unknown property "${key}" for this block`,
|
|
322
|
+
details: { allowed: Object.keys(fields) },
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
return result;
|
|
327
|
+
}
|
|
328
|
+
/** Project a prop schema into JSON Schema for the published spec contract. */
|
|
329
|
+
export function propSchemaToJsonSchema(schema) {
|
|
330
|
+
switch (schema.kind) {
|
|
331
|
+
case 'string': {
|
|
332
|
+
const out = { type: 'string' };
|
|
333
|
+
if (schema.maxLength !== undefined)
|
|
334
|
+
out.maxLength = schema.maxLength;
|
|
335
|
+
else
|
|
336
|
+
out.maxLength = 2_000;
|
|
337
|
+
if (schema.enum !== undefined)
|
|
338
|
+
out.enum = [...schema.enum];
|
|
339
|
+
if (schema.id === true)
|
|
340
|
+
out.pattern = NODE_ID_PATTERN.source;
|
|
341
|
+
return out;
|
|
342
|
+
}
|
|
343
|
+
case 'text':
|
|
344
|
+
return { type: 'string', maxLength: schema.maxLength ?? 50_000 };
|
|
345
|
+
case 'number': {
|
|
346
|
+
const out = { type: schema.integer === true ? 'integer' : 'number' };
|
|
347
|
+
if (schema.min !== undefined)
|
|
348
|
+
out.minimum = schema.min;
|
|
349
|
+
if (schema.max !== undefined)
|
|
350
|
+
out.maximum = schema.max;
|
|
351
|
+
return out;
|
|
352
|
+
}
|
|
353
|
+
case 'boolean':
|
|
354
|
+
return { type: 'boolean' };
|
|
355
|
+
case 'url':
|
|
356
|
+
return {
|
|
357
|
+
type: 'string',
|
|
358
|
+
description: 'Relative path (local asset) or an absolute URL with an allowlisted scheme.',
|
|
359
|
+
};
|
|
360
|
+
case 'list': {
|
|
361
|
+
const out = {
|
|
362
|
+
type: 'array',
|
|
363
|
+
items: propSchemaToJsonSchema(schema.of),
|
|
364
|
+
};
|
|
365
|
+
if (schema.minItems !== undefined)
|
|
366
|
+
out.minItems = schema.minItems;
|
|
367
|
+
if (schema.maxItems !== undefined)
|
|
368
|
+
out.maxItems = schema.maxItems;
|
|
369
|
+
return out;
|
|
370
|
+
}
|
|
371
|
+
case 'object': {
|
|
372
|
+
const properties = {};
|
|
373
|
+
const required = [];
|
|
374
|
+
for (const [key, field] of Object.entries(schema.fields)) {
|
|
375
|
+
properties[key] = propSchemaToJsonSchema(field);
|
|
376
|
+
if (field.required === true)
|
|
377
|
+
required.push(key);
|
|
378
|
+
}
|
|
379
|
+
const out = {
|
|
380
|
+
type: 'object',
|
|
381
|
+
properties,
|
|
382
|
+
additionalProperties: false,
|
|
383
|
+
};
|
|
384
|
+
if (required.length > 0)
|
|
385
|
+
out.required = required;
|
|
386
|
+
return out;
|
|
387
|
+
}
|
|
388
|
+
case 'record':
|
|
389
|
+
return { type: 'object', additionalProperties: propSchemaToJsonSchema(schema.of) };
|
|
390
|
+
case 'oneOf':
|
|
391
|
+
return { oneOf: schema.options.map((option) => propSchemaToJsonSchema(option)) };
|
|
392
|
+
case 'json': {
|
|
393
|
+
const out = { description: schema.description };
|
|
394
|
+
if (schema.schemaRef !== undefined)
|
|
395
|
+
out.$ref = schema.schemaRef;
|
|
396
|
+
return out;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
//# sourceMappingURL=prop-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prop-schema.js","sourceRoot":"","sources":["../../src/registry/prop-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry and discovery surfaces.
|
|
3
|
+
*
|
|
4
|
+
* `catalog()` is the compact, token-cheap listing an agent can afford to load
|
|
5
|
+
* up front. `describe(type)` is the full contract, paid for only for the blocks
|
|
6
|
+
* that were actually selected. The published JSON Schema is generated from the
|
|
7
|
+
* same definitions, so a documented prop and a validated prop cannot disagree.
|
|
8
|
+
*/
|
|
9
|
+
import { type ActionType } from './actions.js';
|
|
10
|
+
import { type BlockDefinition } from './roster.js';
|
|
11
|
+
/** Page Spec schema version implemented by this compiler. */
|
|
12
|
+
export declare const SPEC_SCHEMA_VERSION = 1;
|
|
13
|
+
export interface CatalogEntry {
|
|
14
|
+
type: string;
|
|
15
|
+
kind: 'semantic' | 'primitive';
|
|
16
|
+
version: number;
|
|
17
|
+
summary: string;
|
|
18
|
+
}
|
|
19
|
+
export interface Catalog {
|
|
20
|
+
schemaVersion: number;
|
|
21
|
+
blockCount: number;
|
|
22
|
+
blocks: CatalogEntry[];
|
|
23
|
+
actions: {
|
|
24
|
+
type: ActionType;
|
|
25
|
+
summary: string;
|
|
26
|
+
}[];
|
|
27
|
+
}
|
|
28
|
+
export declare function getBlockDefinition(type: string): BlockDefinition | undefined;
|
|
29
|
+
export declare function blockTypes(): string[];
|
|
30
|
+
/** Compact discovery surface: names, kinds, and one-line summaries. */
|
|
31
|
+
export declare function catalog(): Catalog;
|
|
32
|
+
/**
|
|
33
|
+
* Full contract for one block type.
|
|
34
|
+
*
|
|
35
|
+
* Returns a deep copy so a caller cannot mutate the registry through the
|
|
36
|
+
* contract object.
|
|
37
|
+
*/
|
|
38
|
+
export declare function describe(type: string): BlockDefinition;
|
|
39
|
+
/**
|
|
40
|
+
* The canonical Page Spec JSON Schema (JSON Schema draft 2020-12).
|
|
41
|
+
*
|
|
42
|
+
* Generated, never hand-maintained: `tests/unit/json-schema.test.ts` regenerates
|
|
43
|
+
* it, compares against `schema/page-spec.v1.json`, and validates the fixture
|
|
44
|
+
* corpus with an independent validator.
|
|
45
|
+
*/
|
|
46
|
+
export declare function buildPageSpecJsonSchema(): Record<string, unknown>;
|
|
47
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAsB,KAAK,UAAU,EAAkC,MAAM,cAAc,CAAC;AAEnG,OAAO,EAAqC,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAEtF,6DAA6D;AAC7D,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,GAAG,WAAW,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,OAAO,EAAE;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAClD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAE5E;AAED,wBAAgB,UAAU,IAAI,MAAM,EAAE,CAErC;AAED,uEAAuE;AACvE,wBAAgB,OAAO,IAAI,OAAO,CAYjC;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAStD;AAuED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA+EjE"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry and discovery surfaces.
|
|
3
|
+
*
|
|
4
|
+
* `catalog()` is the compact, token-cheap listing an agent can afford to load
|
|
5
|
+
* up front. `describe(type)` is the full contract, paid for only for the blocks
|
|
6
|
+
* that were actually selected. The published JSON Schema is generated from the
|
|
7
|
+
* same definitions, so a documented prop and a validated prop cannot disagree.
|
|
8
|
+
*/
|
|
9
|
+
import { RenderError } from '../errors.js';
|
|
10
|
+
import { LIMITS } from '../spec/bounds.js';
|
|
11
|
+
import { ACTION_DEFINITIONS, ALLOWED_EVENTS, actionsCatalog } from './actions.js';
|
|
12
|
+
import { propSchemaToJsonSchema } from './prop-schema.js';
|
|
13
|
+
import { BLOCK_DEFINITIONS, BLOCKS_BY_TYPE } from './roster.js';
|
|
14
|
+
/** Page Spec schema version implemented by this compiler. */
|
|
15
|
+
export const SPEC_SCHEMA_VERSION = 1;
|
|
16
|
+
export function getBlockDefinition(type) {
|
|
17
|
+
return BLOCKS_BY_TYPE.get(type);
|
|
18
|
+
}
|
|
19
|
+
export function blockTypes() {
|
|
20
|
+
return BLOCK_DEFINITIONS.map((definition) => definition.type);
|
|
21
|
+
}
|
|
22
|
+
/** Compact discovery surface: names, kinds, and one-line summaries. */
|
|
23
|
+
export function catalog() {
|
|
24
|
+
return {
|
|
25
|
+
schemaVersion: SPEC_SCHEMA_VERSION,
|
|
26
|
+
blockCount: BLOCK_DEFINITIONS.length,
|
|
27
|
+
blocks: BLOCK_DEFINITIONS.map((definition) => ({
|
|
28
|
+
type: definition.type,
|
|
29
|
+
kind: definition.kind,
|
|
30
|
+
version: definition.version,
|
|
31
|
+
summary: definition.summary,
|
|
32
|
+
})),
|
|
33
|
+
actions: actionsCatalog(),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Full contract for one block type.
|
|
38
|
+
*
|
|
39
|
+
* Returns a deep copy so a caller cannot mutate the registry through the
|
|
40
|
+
* contract object.
|
|
41
|
+
*/
|
|
42
|
+
export function describe(type) {
|
|
43
|
+
const definition = BLOCKS_BY_TYPE.get(type);
|
|
44
|
+
if (definition === undefined) {
|
|
45
|
+
throw new RenderError('SPEC_UNKNOWN_BLOCK', `unknown block type "${type}"`, {
|
|
46
|
+
path: 'blocks',
|
|
47
|
+
details: { type, known: blockTypes().sort() },
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return JSON.parse(JSON.stringify(definition));
|
|
51
|
+
}
|
|
52
|
+
function blockListSchema() {
|
|
53
|
+
return {
|
|
54
|
+
type: 'array',
|
|
55
|
+
minItems: 1,
|
|
56
|
+
maxItems: LIMITS.maxBlocks,
|
|
57
|
+
items: { $ref: '#/$defs/block' },
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function blockSchema(definition) {
|
|
61
|
+
const properties = {
|
|
62
|
+
type: { const: definition.type },
|
|
63
|
+
};
|
|
64
|
+
const required = ['type'];
|
|
65
|
+
for (const [key, schema] of Object.entries(definition.props)) {
|
|
66
|
+
properties[key] = propSchemaToJsonSchema(schema);
|
|
67
|
+
if (schema.required === true)
|
|
68
|
+
required.push(key);
|
|
69
|
+
}
|
|
70
|
+
if (definition.slots?.children !== undefined) {
|
|
71
|
+
properties.blocks = { $ref: '#/$defs/blockList' };
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
type: 'object',
|
|
75
|
+
additionalProperties: false,
|
|
76
|
+
required,
|
|
77
|
+
properties,
|
|
78
|
+
description: definition.summary,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function actionMapSchema() {
|
|
82
|
+
return {
|
|
83
|
+
type: 'object',
|
|
84
|
+
minProperties: 1,
|
|
85
|
+
maxProperties: ALLOWED_EVENTS.length,
|
|
86
|
+
propertyNames: { enum: [...ALLOWED_EVENTS] },
|
|
87
|
+
additionalProperties: {
|
|
88
|
+
oneOf: [
|
|
89
|
+
{ $ref: '#/$defs/action' },
|
|
90
|
+
{ type: 'array', minItems: 1, maxItems: 8, items: { $ref: '#/$defs/action' } },
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
description: 'Declarative action bindings, keyed by event name.',
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function actionSchema() {
|
|
97
|
+
return {
|
|
98
|
+
oneOf: ACTION_DEFINITIONS.map((definition) => {
|
|
99
|
+
const properties = { action: { const: definition.type } };
|
|
100
|
+
const required = ['action'];
|
|
101
|
+
for (const [key, schema] of Object.entries(definition.params)) {
|
|
102
|
+
properties[key] = propSchemaToJsonSchema(schema);
|
|
103
|
+
if (schema.required === true)
|
|
104
|
+
required.push(key);
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
type: 'object',
|
|
108
|
+
additionalProperties: false,
|
|
109
|
+
required,
|
|
110
|
+
properties,
|
|
111
|
+
description: definition.summary,
|
|
112
|
+
};
|
|
113
|
+
}),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* The canonical Page Spec JSON Schema (JSON Schema draft 2020-12).
|
|
118
|
+
*
|
|
119
|
+
* Generated, never hand-maintained: `tests/unit/json-schema.test.ts` regenerates
|
|
120
|
+
* it, compares against `schema/page-spec.v1.json`, and validates the fixture
|
|
121
|
+
* corpus with an independent validator.
|
|
122
|
+
*/
|
|
123
|
+
export function buildPageSpecJsonSchema() {
|
|
124
|
+
const defs = {
|
|
125
|
+
block: {
|
|
126
|
+
oneOf: BLOCK_DEFINITIONS.map((definition) => ({ $ref: `#/$defs/block-${definition.type}` })),
|
|
127
|
+
},
|
|
128
|
+
blockList: blockListSchema(),
|
|
129
|
+
actionMap: actionMapSchema(),
|
|
130
|
+
action: actionSchema(),
|
|
131
|
+
};
|
|
132
|
+
for (const definition of BLOCK_DEFINITIONS) {
|
|
133
|
+
defs[`block-${definition.type}`] = blockSchema(definition);
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
$schema: 'https://json-schema.org/draft/2020-12/schema',
|
|
137
|
+
$id: 'https://agentkit.best/schema/page-spec.v1.json',
|
|
138
|
+
title: 'AgentKit Page Spec',
|
|
139
|
+
description: 'Declarative page description compiled by @bestagentkits/render into deterministic, offline, interactive HTML.',
|
|
140
|
+
type: 'object',
|
|
141
|
+
additionalProperties: false,
|
|
142
|
+
required: ['version', 'meta', 'blocks'],
|
|
143
|
+
properties: {
|
|
144
|
+
version: { const: SPEC_SCHEMA_VERSION, description: 'Page Spec schema version.' },
|
|
145
|
+
meta: {
|
|
146
|
+
type: 'object',
|
|
147
|
+
additionalProperties: false,
|
|
148
|
+
required: ['title'],
|
|
149
|
+
properties: {
|
|
150
|
+
title: { type: 'string', minLength: 1, maxLength: 200 },
|
|
151
|
+
description: { type: 'string', maxLength: 400 },
|
|
152
|
+
locale: { type: 'string', maxLength: 35 },
|
|
153
|
+
slug: { type: 'string', maxLength: 120 },
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
theme: {
|
|
157
|
+
type: 'object',
|
|
158
|
+
additionalProperties: false,
|
|
159
|
+
properties: {
|
|
160
|
+
preset: { type: 'string', maxLength: 120 },
|
|
161
|
+
extends: { type: 'string', maxLength: 120 },
|
|
162
|
+
tokens: { type: 'object' },
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
policy: {
|
|
166
|
+
type: 'object',
|
|
167
|
+
additionalProperties: false,
|
|
168
|
+
properties: {
|
|
169
|
+
network: {
|
|
170
|
+
oneOf: [
|
|
171
|
+
{ const: 'deny' },
|
|
172
|
+
{
|
|
173
|
+
type: 'object',
|
|
174
|
+
additionalProperties: false,
|
|
175
|
+
required: ['allow'],
|
|
176
|
+
properties: {
|
|
177
|
+
allow: {
|
|
178
|
+
type: 'array',
|
|
179
|
+
minItems: 1,
|
|
180
|
+
maxItems: 8,
|
|
181
|
+
items: { enum: ['media', 'fonts', 'images'] },
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
],
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
state: {
|
|
190
|
+
type: 'object',
|
|
191
|
+
maxProperties: LIMITS.maxMapKeys,
|
|
192
|
+
additionalProperties: {
|
|
193
|
+
type: ['string', 'number', 'boolean', 'null'],
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
blocks: blockListSchema(),
|
|
197
|
+
},
|
|
198
|
+
$defs: defs,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=registry.js.map
|