@tai42/studio-sdk 9.0.0 → 9.2.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/dist/schema-form/classify.d.ts +38 -0
- package/dist/schema-form/classify.d.ts.map +1 -1
- package/dist/schema-form/classify.js +80 -4
- package/dist/schema-form/classify.js.map +1 -1
- package/dist/schema-form/field-node.d.ts.map +1 -1
- package/dist/schema-form/field-node.js +1 -1
- package/dist/schema-form/field-node.js.map +1 -1
- package/dist/schema-form/string-field.d.ts +12 -5
- package/dist/schema-form/string-field.d.ts.map +1 -1
- package/dist/schema-form/string-field.js +63 -2
- package/dist/schema-form/string-field.js.map +1 -1
- package/package.json +3 -3
- package/src/schema-form/classify.ts +119 -4
- package/src/schema-form/field-node.tsx +1 -0
- package/src/schema-form/string-field.tsx +116 -5
|
@@ -29,6 +29,41 @@ export interface MediaUpload {
|
|
|
29
29
|
/** A per-field byte cap from `contentMaxBytes`, if the schema pins one. */
|
|
30
30
|
readonly maxBytes: number | undefined;
|
|
31
31
|
}
|
|
32
|
+
/** One top-level key of the expression's input document, with a one-line gloss. */
|
|
33
|
+
export interface ExpressionAnnotationKey {
|
|
34
|
+
readonly name: string;
|
|
35
|
+
readonly gloss: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The `x-tai42-expression` annotation on a string schema: the server declares
|
|
39
|
+
* that the field's value is authored in a pipeline expression language (only jq
|
|
40
|
+
* today) and optionally describes what `.` is for that expression. The renderer
|
|
41
|
+
* uses it to open the visual-editor door instead of a plain text box. The shape
|
|
42
|
+
* mirrors jq-studio's input-shape descriptor WITHOUT importing it — classification
|
|
43
|
+
* stays a pure schema concern; the renderer maps this onto a jq field declaration.
|
|
44
|
+
*/
|
|
45
|
+
export interface ExpressionAnnotation {
|
|
46
|
+
/** The declared language. An unknown language never reaches here — it classifies
|
|
47
|
+
* as a plain string, so an older client renders a newer server's field as the
|
|
48
|
+
* ordinary text input it always was. */
|
|
49
|
+
readonly language: 'jq';
|
|
50
|
+
/** Short chip label for what `.` is (e.g. "node envelope"). */
|
|
51
|
+
readonly label: string | undefined;
|
|
52
|
+
/** One sentence describing what `.` is in this field. */
|
|
53
|
+
readonly blurb: string | undefined;
|
|
54
|
+
/** The top-level keys of `.`, each with a one-liner. */
|
|
55
|
+
readonly keys: readonly ExpressionAnnotationKey[] | undefined;
|
|
56
|
+
/** What the expression must return (e.g. "true or false"). */
|
|
57
|
+
readonly returns: string | undefined;
|
|
58
|
+
/** Per-field caveats. */
|
|
59
|
+
readonly caveats: readonly string[] | undefined;
|
|
60
|
+
/** True when the annotation carries a `sample` — tracked separately because a
|
|
61
|
+
* legitimate sample may be JSON `null`. */
|
|
62
|
+
readonly hasSample: boolean;
|
|
63
|
+
/** A static skeleton of `.` for the Test panel. Meaningful only when
|
|
64
|
+
* {@link hasSample} is true. */
|
|
65
|
+
readonly sample: unknown;
|
|
66
|
+
}
|
|
32
67
|
/** One selectable variant of a union field. */
|
|
33
68
|
export interface UnionVariant {
|
|
34
69
|
readonly label: string;
|
|
@@ -49,6 +84,9 @@ export type FieldModel = {
|
|
|
49
84
|
readonly format: string | undefined;
|
|
50
85
|
/** Present when media annotations opt the field into the upload control. */
|
|
51
86
|
readonly media: MediaUpload | undefined;
|
|
87
|
+
/** Present when a well-formed `x-tai42-expression` annotation opts the
|
|
88
|
+
* field into the jq expression editor (see {@link ExpressionAnnotation}). */
|
|
89
|
+
readonly expression: ExpressionAnnotation | undefined;
|
|
52
90
|
} | {
|
|
53
91
|
readonly kind: 'number';
|
|
54
92
|
readonly integer: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../src/schema-form/classify.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAQL,KAAK,UAAU,EAChB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,UAAU,CAAC;IACzC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;CAC7B;AAED,2DAA2D;AAC3D,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAA;CAAE,GAClE;IACE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../src/schema-form/classify.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,6 +33,71 @@ function mediaUpload(schema) {
|
|
|
33
33
|
}
|
|
34
34
|
return undefined;
|
|
35
35
|
}
|
|
36
|
+
const EXPRESSION_KEYWORD = 'x-tai42-expression';
|
|
37
|
+
/** A parsed-JSON plain object (arrays and `null` are `typeof 'object'` too). */
|
|
38
|
+
function isRecord(value) {
|
|
39
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Detect the `x-tai42-expression` annotation on a (ref-resolved) string schema,
|
|
43
|
+
* mirroring {@link mediaUpload}: a well-formed annotation opts the field into the
|
|
44
|
+
* jq expression editor; anything else — absent, non-object, unknown language, or
|
|
45
|
+
* any wrongly-typed member — yields `undefined`, so the field renders EXACTLY as
|
|
46
|
+
* the plain string input it is today. Malformed payloads NEVER throw: a bad
|
|
47
|
+
* annotation is a server-side authoring bug, and degrading to the ordinary text
|
|
48
|
+
* box keeps the form usable while staying byte-identical to the unannotated
|
|
49
|
+
* rendering.
|
|
50
|
+
*/
|
|
51
|
+
function expressionAnnotation(schema) {
|
|
52
|
+
const raw = schema[EXPRESSION_KEYWORD];
|
|
53
|
+
if (!isRecord(raw))
|
|
54
|
+
return undefined;
|
|
55
|
+
// The language gate doubles as the forward-compatibility valve: a future
|
|
56
|
+
// language this client does not understand degrades to a plain string field.
|
|
57
|
+
if (raw.language !== 'jq')
|
|
58
|
+
return undefined;
|
|
59
|
+
const { label, blurb, returns } = raw;
|
|
60
|
+
if (label !== undefined && typeof label !== 'string')
|
|
61
|
+
return undefined;
|
|
62
|
+
if (blurb !== undefined && typeof blurb !== 'string')
|
|
63
|
+
return undefined;
|
|
64
|
+
if (returns !== undefined && typeof returns !== 'string')
|
|
65
|
+
return undefined;
|
|
66
|
+
let keys;
|
|
67
|
+
if (raw.keys !== undefined) {
|
|
68
|
+
if (!Array.isArray(raw.keys))
|
|
69
|
+
return undefined;
|
|
70
|
+
keys = [];
|
|
71
|
+
for (const entry of raw.keys) {
|
|
72
|
+
if (!isRecord(entry) || typeof entry.name !== 'string' || typeof entry.gloss !== 'string') {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
keys.push({ name: entry.name, gloss: entry.gloss });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
let caveats;
|
|
79
|
+
if (raw.caveats !== undefined) {
|
|
80
|
+
if (!Array.isArray(raw.caveats))
|
|
81
|
+
return undefined;
|
|
82
|
+
caveats = [];
|
|
83
|
+
for (const entry of raw.caveats) {
|
|
84
|
+
if (typeof entry !== 'string')
|
|
85
|
+
return undefined;
|
|
86
|
+
caveats.push(entry);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// `sample` is any JSON — including `null` — so presence is tracked, not typed.
|
|
90
|
+
return {
|
|
91
|
+
language: 'jq',
|
|
92
|
+
label,
|
|
93
|
+
blurb,
|
|
94
|
+
keys,
|
|
95
|
+
returns,
|
|
96
|
+
caveats,
|
|
97
|
+
hasSample: 'sample' in raw,
|
|
98
|
+
sample: raw.sample,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
36
101
|
/**
|
|
37
102
|
* Land a shape the form has no structured editor for on the free-form JSON
|
|
38
103
|
* fallback (a mono JSON textarea) rather than a dead badge — a field is never
|
|
@@ -91,9 +156,15 @@ export function classifySchema(raw, root) {
|
|
|
91
156
|
// that land on the OUTER null-union wrapper of an OPTIONAL field would
|
|
92
157
|
// otherwise be lost when delegating to the inner string member, silently
|
|
93
158
|
// degrading an optional upload field to a plain text box. Re-detect them on
|
|
94
|
-
// the wrapper and attach to the inner string model.
|
|
95
|
-
|
|
96
|
-
|
|
159
|
+
// the wrapper and attach to the inner string model. The expression
|
|
160
|
+
// annotation gets the same treatment for the same reason: an optional
|
|
161
|
+
// annotated field must keep its editor door.
|
|
162
|
+
const model = inner.model.kind === 'string'
|
|
163
|
+
? {
|
|
164
|
+
...inner.model,
|
|
165
|
+
media: inner.model.media ?? mediaUpload(resolved),
|
|
166
|
+
expression: inner.model.expression ?? expressionAnnotation(resolved),
|
|
167
|
+
}
|
|
97
168
|
: inner.model;
|
|
98
169
|
return {
|
|
99
170
|
model,
|
|
@@ -159,7 +230,12 @@ export function classifySchema(raw, root) {
|
|
|
159
230
|
switch (type) {
|
|
160
231
|
case 'string':
|
|
161
232
|
return {
|
|
162
|
-
model: {
|
|
233
|
+
model: {
|
|
234
|
+
kind: 'string',
|
|
235
|
+
format: resolved.format,
|
|
236
|
+
media: mediaUpload(resolved),
|
|
237
|
+
expression: expressionAnnotation(resolved),
|
|
238
|
+
},
|
|
163
239
|
nullable: nullableByType,
|
|
164
240
|
schema: resolved,
|
|
165
241
|
title,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/schema-form/classify.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EACL,YAAY,EACZ,UAAU,EACV,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,UAAU,GAEX,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/schema-form/classify.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-node.d.ts","sourceRoot":"","sources":["../../src/schema-form/field-node.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAevC,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE5D,UAAU,cAAc;IACtB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAMD,qEAAqE;AACrE,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"field-node.d.ts","sourceRoot":"","sources":["../../src/schema-form/field-node.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAevC,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE5D,UAAU,cAAc;IACtB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAMD,qEAAqE;AACrE,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,CA2I1D"}
|
|
@@ -31,7 +31,7 @@ export function FieldNode(props) {
|
|
|
31
31
|
case 'enum':
|
|
32
32
|
return (_jsx(EnumField, { heading: heading, description: description, error: error, model: model, value: value, onChange: onChange }));
|
|
33
33
|
case 'string':
|
|
34
|
-
return (_jsx(StringField, { heading: heading, description: description, error: error, format: model.format, media: model.media, argName: path, value: value, required: required, onChange: onChange }));
|
|
34
|
+
return (_jsx(StringField, { heading: heading, description: description, error: error, format: model.format, media: model.media, expression: model.expression, argName: path, value: value, required: required, onChange: onChange }));
|
|
35
35
|
case 'number':
|
|
36
36
|
return (_jsx(Field, { label: heading, description: description, error: error, children: _jsx(NumberInput, { step: model.integer ? '1' : 'any', value: typeof value === 'number' ? value : '', onChange: (event) => {
|
|
37
37
|
const raw = event.target.value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-node.js","sourceRoot":"","sources":["../../src/schema-form/field-node.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"field-node.js","sourceRoot":"","sources":["../../src/schema-form/field-node.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The string field renderer. A plain string renders as a text input (its
|
|
3
|
-
* `type` derived from any JSON-Schema `format`);
|
|
4
|
-
* renders the
|
|
5
|
-
*
|
|
3
|
+
* `type` derived from any JSON-Schema `format`); an expression-annotated schema
|
|
4
|
+
* renders the jq field (a resting textarea with the visual-editor door); a
|
|
5
|
+
* media-annotated schema renders the upload control instead; and when the form
|
|
6
|
+
* supplies a completion provider, the input is backed by argument autocomplete.
|
|
7
|
+
*
|
|
8
|
+
* `JqField` is imported through the SDK's own `./jq` re-export — the ONE
|
|
9
|
+
* `@tai42/jq-studio` instance the whole deployment shares — never from
|
|
10
|
+
* `@tai42/jq-studio` directly, which would bundle a second copy and orphan its
|
|
11
|
+
* worker (see the `jq` module doc-comment).
|
|
6
12
|
*/
|
|
7
13
|
import type { ReactNode } from 'react';
|
|
8
|
-
import type { MediaUpload } from './classify';
|
|
9
|
-
export declare function StringField({ heading, description, error, format, media, argName, value, required, onChange, }: {
|
|
14
|
+
import type { ExpressionAnnotation, MediaUpload } from './classify';
|
|
15
|
+
export declare function StringField({ heading, description, error, format, media, expression, argName, value, required, onChange, }: {
|
|
10
16
|
heading: string;
|
|
11
17
|
description: string | undefined;
|
|
12
18
|
error: string | undefined;
|
|
13
19
|
format: string | undefined;
|
|
14
20
|
media: MediaUpload | undefined;
|
|
21
|
+
expression: ExpressionAnnotation | undefined;
|
|
15
22
|
argName: string;
|
|
16
23
|
value: unknown;
|
|
17
24
|
required: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string-field.d.ts","sourceRoot":"","sources":["../../src/schema-form/string-field.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"string-field.d.ts","sourceRoot":"","sources":["../../src/schema-form/string-field.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AASvC,OAAO,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAKpE,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,WAAW,EACX,KAAK,EACL,MAAM,EACN,KAAK,EACL,UAAU,EACV,OAAO,EACP,KAAK,EACL,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,WAAW,GAAG,SAAS,CAAC;IAC/B,UAAU,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC,GAAG,SAAS,CA+DZ"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useCallback, useContext, useState } from 'react';
|
|
2
|
+
import { useCallback, useContext, useMemo, useState } from 'react';
|
|
3
3
|
import { CompletionInput } from '../components/completion-input';
|
|
4
4
|
import { Field } from '../components/field';
|
|
5
5
|
import { AlertTriangleIcon } from '../components/icons';
|
|
6
6
|
import { TextInput } from '../components/inputs';
|
|
7
7
|
import { errorMessage } from '../errors';
|
|
8
|
+
import { JqField } from '../jq';
|
|
8
9
|
import { CompletionProviderContext } from './context';
|
|
9
10
|
import { MediaField } from './media-field';
|
|
10
|
-
export function StringField({ heading, description, error, format, media, argName, value, required, onChange, }) {
|
|
11
|
+
export function StringField({ heading, description, error, format, media, expression, argName, value, required, onChange, }) {
|
|
11
12
|
const completionProvider = useContext(CompletionProviderContext);
|
|
12
13
|
const current = typeof value === 'string' ? value : '';
|
|
13
14
|
// An empty optional field emits `undefined` (drops the key); a required one
|
|
@@ -15,6 +16,15 @@ export function StringField({ heading, description, error, format, media, argNam
|
|
|
15
16
|
const emit = (next) => {
|
|
16
17
|
onChange(next === '' && !required ? undefined : next);
|
|
17
18
|
};
|
|
19
|
+
// An expression-annotated field renders the jq field — the resting control plus
|
|
20
|
+
// the visual-editor door. Checked before `media` because the expression
|
|
21
|
+
// annotation is the more specific, deliberate opt-in (`x-tai42-expression`);
|
|
22
|
+
// a schema carrying both is contradictory, and a jq expression is text, not an
|
|
23
|
+
// upload. Not reachable together with the completion provider path: an
|
|
24
|
+
// expression is authored, not completed from server suggestions.
|
|
25
|
+
if (expression !== undefined) {
|
|
26
|
+
return (_jsx(JqExpressionField, { heading: heading, description: description, error: error, expression: expression, argName: argName, value: current, onChange: emit }));
|
|
27
|
+
}
|
|
18
28
|
// A media-annotated field renders the upload control instead of a text box.
|
|
19
29
|
if (media !== undefined) {
|
|
20
30
|
return (_jsx(MediaField, { heading: heading, description: description, error: error, media: media, value: current, onChange: emit }));
|
|
@@ -52,6 +62,57 @@ function CompletionField({ argName, value, onChange, provider, }) {
|
|
|
52
62
|
onChange(next);
|
|
53
63
|
}, fetchCompletions: fetchCompletions, onError: onError }), failure === null ? null : (_jsxs("p", { role: "status", className: "tai-field-hint", style: { margin: 0 }, children: [_jsx(AlertTriangleIcon, {}), `Suggestions are unavailable: ${failure}`] }))] }));
|
|
54
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* An expression-annotated string field, rendered as `JqField`: a multiline
|
|
67
|
+
* resting control with the always-present visual-editor door. `JqField` brings
|
|
68
|
+
* its own label/description/error chrome (a11y-linked slots), so it is NOT
|
|
69
|
+
* wrapped in the form's `Field` component — the annotation's descriptor fields
|
|
70
|
+
* map onto jq-studio's input-shape descriptor, and the form's per-field error
|
|
71
|
+
* feeds the `error` prop.
|
|
72
|
+
*
|
|
73
|
+
* Deliberately unwired:
|
|
74
|
+
* - `serverValidate` — no author-time validation endpoint applies to a
|
|
75
|
+
* schema-declared field (the WASM runtime still powers the Test panel locally).
|
|
76
|
+
* - `onEditorOpenChange` — the hosts that render `SchemaForm` register no global
|
|
77
|
+
* keyboard shortcuts, so there is nothing to mute while the editor is open.
|
|
78
|
+
* - `compact` — the form renders every sibling field with a visible label;
|
|
79
|
+
* the compact variant (visually-hidden label, icon-only door) is for dense
|
|
80
|
+
* host rows, which the schema form does not have.
|
|
81
|
+
*/
|
|
82
|
+
function JqExpressionField({ heading, description, error, expression, argName, value, onChange, }) {
|
|
83
|
+
// Memoised: the descriptor's identity feeds jq-studio's own memoisation, so a
|
|
84
|
+
// fresh object each keystroke would defeat it.
|
|
85
|
+
const shape = useMemo(() => expressionShape(expression, argName), [expression, argName]);
|
|
86
|
+
return (_jsx(JqField, { label: heading, description: description, error: error, shape: shape, multiline: true, value: value, onChange: onChange }));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Map a classified expression annotation onto jq-studio's input-shape
|
|
90
|
+
* descriptor. A bare annotation (`language` only) maps to NO descriptor — the
|
|
91
|
+
* undeclared-shape `JqField` is the honest rendering when the server said
|
|
92
|
+
* nothing about `.`. When any descriptor field is present, the required
|
|
93
|
+
* descriptor members the annotation omits fall back to neutral values rather
|
|
94
|
+
* than invented copy.
|
|
95
|
+
*/
|
|
96
|
+
function expressionShape(expression, argName) {
|
|
97
|
+
const declared = expression.label !== undefined ||
|
|
98
|
+
expression.blurb !== undefined ||
|
|
99
|
+
expression.keys !== undefined ||
|
|
100
|
+
expression.returns !== undefined ||
|
|
101
|
+
expression.caveats !== undefined ||
|
|
102
|
+
expression.hasSample;
|
|
103
|
+
if (!declared)
|
|
104
|
+
return undefined;
|
|
105
|
+
return {
|
|
106
|
+
// Opaque, host-namespaced, stable per field (memoisation/telemetry only).
|
|
107
|
+
id: argName === '' ? 'tai42.schema-form' : `tai42.schema-form.${argName}`,
|
|
108
|
+
label: expression.label ?? 'input',
|
|
109
|
+
blurb: expression.blurb ?? '',
|
|
110
|
+
keys: expression.keys ?? [],
|
|
111
|
+
returns: expression.returns ?? '',
|
|
112
|
+
...(expression.caveats === undefined ? {} : { caveats: expression.caveats }),
|
|
113
|
+
...(expression.hasSample ? { sample: expression.sample } : {}),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
55
116
|
const FORMAT_INPUT_TYPES = {
|
|
56
117
|
email: 'email',
|
|
57
118
|
uri: 'url',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string-field.js","sourceRoot":"","sources":["../../src/schema-form/string-field.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"string-field.js","sourceRoot":"","sources":["../../src/schema-form/string-field.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tai42/studio-sdk",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.2.0",
|
|
4
4
|
"description": "The Studio plugin contract, shared UI components, and hooks that every feature builds on.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "tai42 <oss@tai42.ai>",
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
"@types/react-dom": "^19.2.5",
|
|
77
77
|
"@vitejs/plugin-react": "^4.7.0",
|
|
78
78
|
"@vitest/coverage-v8": "^3.2.6",
|
|
79
|
-
"jsdom": "^
|
|
79
|
+
"jsdom": "^30.0.1",
|
|
80
80
|
"react": "^19.2.8",
|
|
81
81
|
"react-dom": "^19.2.8",
|
|
82
82
|
"vitest": "^3.2.6"
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
"@radix-ui/react-tabs": "^1.1.16",
|
|
92
92
|
"@radix-ui/react-tooltip": "^1.2.11",
|
|
93
93
|
"@tai42/jq-studio": "^0.1.3",
|
|
94
|
-
"@tai42/api-client": "9.
|
|
94
|
+
"@tai42/api-client": "9.2.0"
|
|
95
95
|
},
|
|
96
96
|
"scripts": {
|
|
97
97
|
"build": "tsc -b tsconfig.build.json && node scripts/copy-assets.mjs",
|
|
@@ -40,6 +40,43 @@ export interface MediaUpload {
|
|
|
40
40
|
readonly maxBytes: number | undefined;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
/** One top-level key of the expression's input document, with a one-line gloss. */
|
|
44
|
+
export interface ExpressionAnnotationKey {
|
|
45
|
+
readonly name: string;
|
|
46
|
+
readonly gloss: string;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* The `x-tai42-expression` annotation on a string schema: the server declares
|
|
51
|
+
* that the field's value is authored in a pipeline expression language (only jq
|
|
52
|
+
* today) and optionally describes what `.` is for that expression. The renderer
|
|
53
|
+
* uses it to open the visual-editor door instead of a plain text box. The shape
|
|
54
|
+
* mirrors jq-studio's input-shape descriptor WITHOUT importing it — classification
|
|
55
|
+
* stays a pure schema concern; the renderer maps this onto a jq field declaration.
|
|
56
|
+
*/
|
|
57
|
+
export interface ExpressionAnnotation {
|
|
58
|
+
/** The declared language. An unknown language never reaches here — it classifies
|
|
59
|
+
* as a plain string, so an older client renders a newer server's field as the
|
|
60
|
+
* ordinary text input it always was. */
|
|
61
|
+
readonly language: 'jq';
|
|
62
|
+
/** Short chip label for what `.` is (e.g. "node envelope"). */
|
|
63
|
+
readonly label: string | undefined;
|
|
64
|
+
/** One sentence describing what `.` is in this field. */
|
|
65
|
+
readonly blurb: string | undefined;
|
|
66
|
+
/** The top-level keys of `.`, each with a one-liner. */
|
|
67
|
+
readonly keys: readonly ExpressionAnnotationKey[] | undefined;
|
|
68
|
+
/** What the expression must return (e.g. "true or false"). */
|
|
69
|
+
readonly returns: string | undefined;
|
|
70
|
+
/** Per-field caveats. */
|
|
71
|
+
readonly caveats: readonly string[] | undefined;
|
|
72
|
+
/** True when the annotation carries a `sample` — tracked separately because a
|
|
73
|
+
* legitimate sample may be JSON `null`. */
|
|
74
|
+
readonly hasSample: boolean;
|
|
75
|
+
/** A static skeleton of `.` for the Test panel. Meaningful only when
|
|
76
|
+
* {@link hasSample} is true. */
|
|
77
|
+
readonly sample: unknown;
|
|
78
|
+
}
|
|
79
|
+
|
|
43
80
|
/** One selectable variant of a union field. */
|
|
44
81
|
export interface UnionVariant {
|
|
45
82
|
readonly label: string;
|
|
@@ -58,6 +95,9 @@ export type FieldModel =
|
|
|
58
95
|
readonly format: string | undefined;
|
|
59
96
|
/** Present when media annotations opt the field into the upload control. */
|
|
60
97
|
readonly media: MediaUpload | undefined;
|
|
98
|
+
/** Present when a well-formed `x-tai42-expression` annotation opts the
|
|
99
|
+
* field into the jq expression editor (see {@link ExpressionAnnotation}). */
|
|
100
|
+
readonly expression: ExpressionAnnotation | undefined;
|
|
61
101
|
}
|
|
62
102
|
| { readonly kind: 'number'; readonly integer: boolean }
|
|
63
103
|
| { readonly kind: 'boolean' }
|
|
@@ -132,6 +172,70 @@ function mediaUpload(schema: JsonSchema): MediaUpload | undefined {
|
|
|
132
172
|
return undefined;
|
|
133
173
|
}
|
|
134
174
|
|
|
175
|
+
const EXPRESSION_KEYWORD = 'x-tai42-expression';
|
|
176
|
+
|
|
177
|
+
/** A parsed-JSON plain object (arrays and `null` are `typeof 'object'` too). */
|
|
178
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
179
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Detect the `x-tai42-expression` annotation on a (ref-resolved) string schema,
|
|
184
|
+
* mirroring {@link mediaUpload}: a well-formed annotation opts the field into the
|
|
185
|
+
* jq expression editor; anything else — absent, non-object, unknown language, or
|
|
186
|
+
* any wrongly-typed member — yields `undefined`, so the field renders EXACTLY as
|
|
187
|
+
* the plain string input it is today. Malformed payloads NEVER throw: a bad
|
|
188
|
+
* annotation is a server-side authoring bug, and degrading to the ordinary text
|
|
189
|
+
* box keeps the form usable while staying byte-identical to the unannotated
|
|
190
|
+
* rendering.
|
|
191
|
+
*/
|
|
192
|
+
function expressionAnnotation(schema: JsonSchema): ExpressionAnnotation | undefined {
|
|
193
|
+
const raw: unknown = schema[EXPRESSION_KEYWORD];
|
|
194
|
+
if (!isRecord(raw)) return undefined;
|
|
195
|
+
// The language gate doubles as the forward-compatibility valve: a future
|
|
196
|
+
// language this client does not understand degrades to a plain string field.
|
|
197
|
+
if (raw.language !== 'jq') return undefined;
|
|
198
|
+
|
|
199
|
+
const { label, blurb, returns } = raw;
|
|
200
|
+
if (label !== undefined && typeof label !== 'string') return undefined;
|
|
201
|
+
if (blurb !== undefined && typeof blurb !== 'string') return undefined;
|
|
202
|
+
if (returns !== undefined && typeof returns !== 'string') return undefined;
|
|
203
|
+
|
|
204
|
+
let keys: ExpressionAnnotationKey[] | undefined;
|
|
205
|
+
if (raw.keys !== undefined) {
|
|
206
|
+
if (!Array.isArray(raw.keys)) return undefined;
|
|
207
|
+
keys = [];
|
|
208
|
+
for (const entry of raw.keys as readonly unknown[]) {
|
|
209
|
+
if (!isRecord(entry) || typeof entry.name !== 'string' || typeof entry.gloss !== 'string') {
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
keys.push({ name: entry.name, gloss: entry.gloss });
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
let caveats: string[] | undefined;
|
|
217
|
+
if (raw.caveats !== undefined) {
|
|
218
|
+
if (!Array.isArray(raw.caveats)) return undefined;
|
|
219
|
+
caveats = [];
|
|
220
|
+
for (const entry of raw.caveats as readonly unknown[]) {
|
|
221
|
+
if (typeof entry !== 'string') return undefined;
|
|
222
|
+
caveats.push(entry);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// `sample` is any JSON — including `null` — so presence is tracked, not typed.
|
|
227
|
+
return {
|
|
228
|
+
language: 'jq',
|
|
229
|
+
label,
|
|
230
|
+
blurb,
|
|
231
|
+
keys,
|
|
232
|
+
returns,
|
|
233
|
+
caveats,
|
|
234
|
+
hasSample: 'sample' in raw,
|
|
235
|
+
sample: raw.sample,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
|
|
135
239
|
/**
|
|
136
240
|
* Land a shape the form has no structured editor for on the free-form JSON
|
|
137
241
|
* fallback (a mono JSON textarea) rather than a dead badge — a field is never
|
|
@@ -208,10 +312,16 @@ export function classifySchema(raw: JsonSchema, root: JsonSchema): ClassifiedFie
|
|
|
208
312
|
// that land on the OUTER null-union wrapper of an OPTIONAL field would
|
|
209
313
|
// otherwise be lost when delegating to the inner string member, silently
|
|
210
314
|
// degrading an optional upload field to a plain text box. Re-detect them on
|
|
211
|
-
// the wrapper and attach to the inner string model.
|
|
315
|
+
// the wrapper and attach to the inner string model. The expression
|
|
316
|
+
// annotation gets the same treatment for the same reason: an optional
|
|
317
|
+
// annotated field must keep its editor door.
|
|
212
318
|
const model =
|
|
213
|
-
inner.model.kind === 'string'
|
|
214
|
-
? {
|
|
319
|
+
inner.model.kind === 'string'
|
|
320
|
+
? {
|
|
321
|
+
...inner.model,
|
|
322
|
+
media: inner.model.media ?? mediaUpload(resolved),
|
|
323
|
+
expression: inner.model.expression ?? expressionAnnotation(resolved),
|
|
324
|
+
}
|
|
215
325
|
: inner.model;
|
|
216
326
|
return {
|
|
217
327
|
model,
|
|
@@ -309,7 +419,12 @@ export function classifySchema(raw: JsonSchema, root: JsonSchema): ClassifiedFie
|
|
|
309
419
|
switch (type) {
|
|
310
420
|
case 'string':
|
|
311
421
|
return {
|
|
312
|
-
model: {
|
|
422
|
+
model: {
|
|
423
|
+
kind: 'string',
|
|
424
|
+
format: resolved.format,
|
|
425
|
+
media: mediaUpload(resolved),
|
|
426
|
+
expression: expressionAnnotation(resolved),
|
|
427
|
+
},
|
|
313
428
|
nullable: nullableByType,
|
|
314
429
|
schema: resolved,
|
|
315
430
|
title,
|
|
@@ -1,18 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The string field renderer. A plain string renders as a text input (its
|
|
3
|
-
* `type` derived from any JSON-Schema `format`);
|
|
4
|
-
* renders the
|
|
5
|
-
*
|
|
3
|
+
* `type` derived from any JSON-Schema `format`); an expression-annotated schema
|
|
4
|
+
* renders the jq field (a resting textarea with the visual-editor door); a
|
|
5
|
+
* media-annotated schema renders the upload control instead; and when the form
|
|
6
|
+
* supplies a completion provider, the input is backed by argument autocomplete.
|
|
7
|
+
*
|
|
8
|
+
* `JqField` is imported through the SDK's own `./jq` re-export — the ONE
|
|
9
|
+
* `@tai42/jq-studio` instance the whole deployment shares — never from
|
|
10
|
+
* `@tai42/jq-studio` directly, which would bundle a second copy and orphan its
|
|
11
|
+
* worker (see the `jq` module doc-comment).
|
|
6
12
|
*/
|
|
7
13
|
import type { ReactNode } from 'react';
|
|
8
|
-
import { useCallback, useContext, useState } from 'react';
|
|
14
|
+
import { useCallback, useContext, useMemo, useState } from 'react';
|
|
9
15
|
|
|
10
16
|
import { CompletionInput } from '../components/completion-input';
|
|
11
17
|
import { Field } from '../components/field';
|
|
12
18
|
import { AlertTriangleIcon } from '../components/icons';
|
|
13
19
|
import { TextInput } from '../components/inputs';
|
|
14
20
|
import { errorMessage } from '../errors';
|
|
15
|
-
import type
|
|
21
|
+
import { JqField, type JqInputShapeDescriptor } from '../jq';
|
|
22
|
+
import type { ExpressionAnnotation, MediaUpload } from './classify';
|
|
16
23
|
import { CompletionProviderContext } from './context';
|
|
17
24
|
import { MediaField } from './media-field';
|
|
18
25
|
import type { CompletionProvider } from './SchemaForm';
|
|
@@ -23,6 +30,7 @@ export function StringField({
|
|
|
23
30
|
error,
|
|
24
31
|
format,
|
|
25
32
|
media,
|
|
33
|
+
expression,
|
|
26
34
|
argName,
|
|
27
35
|
value,
|
|
28
36
|
required,
|
|
@@ -33,6 +41,7 @@ export function StringField({
|
|
|
33
41
|
error: string | undefined;
|
|
34
42
|
format: string | undefined;
|
|
35
43
|
media: MediaUpload | undefined;
|
|
44
|
+
expression: ExpressionAnnotation | undefined;
|
|
36
45
|
argName: string;
|
|
37
46
|
value: unknown;
|
|
38
47
|
required: boolean;
|
|
@@ -46,6 +55,26 @@ export function StringField({
|
|
|
46
55
|
onChange(next === '' && !required ? undefined : next);
|
|
47
56
|
};
|
|
48
57
|
|
|
58
|
+
// An expression-annotated field renders the jq field — the resting control plus
|
|
59
|
+
// the visual-editor door. Checked before `media` because the expression
|
|
60
|
+
// annotation is the more specific, deliberate opt-in (`x-tai42-expression`);
|
|
61
|
+
// a schema carrying both is contradictory, and a jq expression is text, not an
|
|
62
|
+
// upload. Not reachable together with the completion provider path: an
|
|
63
|
+
// expression is authored, not completed from server suggestions.
|
|
64
|
+
if (expression !== undefined) {
|
|
65
|
+
return (
|
|
66
|
+
<JqExpressionField
|
|
67
|
+
heading={heading}
|
|
68
|
+
description={description}
|
|
69
|
+
error={error}
|
|
70
|
+
expression={expression}
|
|
71
|
+
argName={argName}
|
|
72
|
+
value={current}
|
|
73
|
+
onChange={emit}
|
|
74
|
+
/>
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
49
78
|
// A media-annotated field renders the upload control instead of a text box.
|
|
50
79
|
if (media !== undefined) {
|
|
51
80
|
return (
|
|
@@ -146,6 +175,88 @@ function CompletionField({
|
|
|
146
175
|
);
|
|
147
176
|
}
|
|
148
177
|
|
|
178
|
+
/**
|
|
179
|
+
* An expression-annotated string field, rendered as `JqField`: a multiline
|
|
180
|
+
* resting control with the always-present visual-editor door. `JqField` brings
|
|
181
|
+
* its own label/description/error chrome (a11y-linked slots), so it is NOT
|
|
182
|
+
* wrapped in the form's `Field` component — the annotation's descriptor fields
|
|
183
|
+
* map onto jq-studio's input-shape descriptor, and the form's per-field error
|
|
184
|
+
* feeds the `error` prop.
|
|
185
|
+
*
|
|
186
|
+
* Deliberately unwired:
|
|
187
|
+
* - `serverValidate` — no author-time validation endpoint applies to a
|
|
188
|
+
* schema-declared field (the WASM runtime still powers the Test panel locally).
|
|
189
|
+
* - `onEditorOpenChange` — the hosts that render `SchemaForm` register no global
|
|
190
|
+
* keyboard shortcuts, so there is nothing to mute while the editor is open.
|
|
191
|
+
* - `compact` — the form renders every sibling field with a visible label;
|
|
192
|
+
* the compact variant (visually-hidden label, icon-only door) is for dense
|
|
193
|
+
* host rows, which the schema form does not have.
|
|
194
|
+
*/
|
|
195
|
+
function JqExpressionField({
|
|
196
|
+
heading,
|
|
197
|
+
description,
|
|
198
|
+
error,
|
|
199
|
+
expression,
|
|
200
|
+
argName,
|
|
201
|
+
value,
|
|
202
|
+
onChange,
|
|
203
|
+
}: {
|
|
204
|
+
heading: string;
|
|
205
|
+
description: string | undefined;
|
|
206
|
+
error: string | undefined;
|
|
207
|
+
expression: ExpressionAnnotation;
|
|
208
|
+
argName: string;
|
|
209
|
+
value: string;
|
|
210
|
+
onChange: (value: string) => void;
|
|
211
|
+
}): ReactNode {
|
|
212
|
+
// Memoised: the descriptor's identity feeds jq-studio's own memoisation, so a
|
|
213
|
+
// fresh object each keystroke would defeat it.
|
|
214
|
+
const shape = useMemo(() => expressionShape(expression, argName), [expression, argName]);
|
|
215
|
+
return (
|
|
216
|
+
<JqField
|
|
217
|
+
label={heading}
|
|
218
|
+
description={description}
|
|
219
|
+
error={error}
|
|
220
|
+
shape={shape}
|
|
221
|
+
multiline
|
|
222
|
+
value={value}
|
|
223
|
+
onChange={onChange}
|
|
224
|
+
/>
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Map a classified expression annotation onto jq-studio's input-shape
|
|
230
|
+
* descriptor. A bare annotation (`language` only) maps to NO descriptor — the
|
|
231
|
+
* undeclared-shape `JqField` is the honest rendering when the server said
|
|
232
|
+
* nothing about `.`. When any descriptor field is present, the required
|
|
233
|
+
* descriptor members the annotation omits fall back to neutral values rather
|
|
234
|
+
* than invented copy.
|
|
235
|
+
*/
|
|
236
|
+
function expressionShape(
|
|
237
|
+
expression: ExpressionAnnotation,
|
|
238
|
+
argName: string,
|
|
239
|
+
): JqInputShapeDescriptor | undefined {
|
|
240
|
+
const declared =
|
|
241
|
+
expression.label !== undefined ||
|
|
242
|
+
expression.blurb !== undefined ||
|
|
243
|
+
expression.keys !== undefined ||
|
|
244
|
+
expression.returns !== undefined ||
|
|
245
|
+
expression.caveats !== undefined ||
|
|
246
|
+
expression.hasSample;
|
|
247
|
+
if (!declared) return undefined;
|
|
248
|
+
return {
|
|
249
|
+
// Opaque, host-namespaced, stable per field (memoisation/telemetry only).
|
|
250
|
+
id: argName === '' ? 'tai42.schema-form' : `tai42.schema-form.${argName}`,
|
|
251
|
+
label: expression.label ?? 'input',
|
|
252
|
+
blurb: expression.blurb ?? '',
|
|
253
|
+
keys: expression.keys ?? [],
|
|
254
|
+
returns: expression.returns ?? '',
|
|
255
|
+
...(expression.caveats === undefined ? {} : { caveats: expression.caveats }),
|
|
256
|
+
...(expression.hasSample ? { sample: expression.sample } : {}),
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
|
|
149
260
|
const FORMAT_INPUT_TYPES: Record<string, string> = {
|
|
150
261
|
email: 'email',
|
|
151
262
|
uri: 'url',
|