@cat-factory/contracts 0.213.0 → 0.215.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/binary-generators.d.ts +48 -10
- package/dist/binary-generators.d.ts.map +1 -1
- package/dist/binary-generators.js +24 -4
- package/dist/binary-generators.js.map +1 -1
- package/dist/binary-modalities.d.ts +77 -9
- package/dist/binary-modalities.d.ts.map +1 -1
- package/dist/binary-modalities.js +116 -23
- package/dist/binary-modalities.js.map +1 -1
- package/dist/binary-outputs.d.ts +39 -3
- package/dist/binary-outputs.d.ts.map +1 -1
- package/dist/binary-outputs.js +37 -1
- package/dist/binary-outputs.js.map +1 -1
- package/dist/capability-credentials.d.ts +159 -0
- package/dist/capability-credentials.d.ts.map +1 -0
- package/dist/capability-credentials.js +145 -0
- package/dist/capability-credentials.js.map +1 -0
- package/dist/entities.d.ts +4 -2
- package/dist/entities.d.ts.map +1 -1
- package/dist/execution.d.ts +6 -4
- package/dist/execution.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/requests.d.ts +4 -2
- package/dist/requests.d.ts.map +1 -1
- package/dist/reserved-env-keys.d.ts +50 -0
- package/dist/reserved-env-keys.d.ts.map +1 -0
- package/dist/reserved-env-keys.js +234 -0
- package/dist/reserved-env-keys.js.map +1 -0
- package/dist/routes/agent-runs.d.ts +6 -4
- package/dist/routes/agent-runs.d.ts.map +1 -1
- package/dist/routes/bug-hunt.d.ts +6 -4
- package/dist/routes/bug-hunt.d.ts.map +1 -1
- package/dist/routes/capability-credentials.d.ts +148 -0
- package/dist/routes/capability-credentials.d.ts.map +1 -0
- package/dist/routes/capability-credentials.js +34 -0
- package/dist/routes/capability-credentials.js.map +1 -0
- package/dist/routes/execution.d.ts +24 -16
- package/dist/routes/execution.d.ts.map +1 -1
- package/dist/routes/human-review.d.ts +3 -2
- package/dist/routes/human-review.d.ts.map +1 -1
- package/dist/routes/human-test.d.ts +15 -10
- package/dist/routes/human-test.d.ts.map +1 -1
- package/dist/routes/index.d.ts +1 -0
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +1 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/pipelines.d.ts +16 -8
- package/dist/routes/pipelines.d.ts.map +1 -1
- package/dist/routes/visual-confirm.d.ts +9 -6
- package/dist/routes/visual-confirm.d.ts.map +1 -1
- package/dist/routes/workspaces.d.ts +12 -8
- package/dist/routes/workspaces.d.ts.map +1 -1
- package/dist/snapshot.d.ts +6 -4
- package/dist/snapshot.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -10,12 +10,31 @@ import * as v from 'valibot';
|
|
|
10
10
|
*/
|
|
11
11
|
export declare const binaryGeneratorCredentialSchema: v.ObjectSchema<{
|
|
12
12
|
/**
|
|
13
|
-
* The credential's key
|
|
14
|
-
*
|
|
15
|
-
*
|
|
13
|
+
* The credential's LOOKUP key: what the secret resolver is asked for, and what a workspace
|
|
14
|
+
* stores its own value under. Also the ENVIRONMENT VARIABLE the agent reads it from unless
|
|
15
|
+
* {@link envName} says otherwise, so it must be a valid POSIX variable name either way: a
|
|
16
|
+
* generator declaring `x-rd-token` would resolve fine and then be dropped by the harness's env
|
|
16
17
|
* validation, which is a silent "the integration just 401s" at run time.
|
|
18
|
+
*
|
|
19
|
+
* It may NOT name a variable the platform's own configuration owns
|
|
20
|
+
* ({@link isReservedPlatformEnvKey}). The resolver reads the key off the deployment's
|
|
21
|
+
* environment and the value is injected into an agent process, so an integration declaring
|
|
22
|
+
* `ENCRYPTION_KEY` would hand a prompt-injectable agent the deployment's master sealing key.
|
|
23
|
+
* Refused here so a deployment learns at boot, and again at dispatch, since a mothership-mode
|
|
24
|
+
* node boot-validates none of the definitions it resolves.
|
|
17
25
|
*/
|
|
18
|
-
readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 128, undefined>, v.RegexAction<string, "must be a valid environment variable name">]>;
|
|
26
|
+
readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 128, undefined>, v.RegexAction<string, "must be a valid environment variable name">, v.CheckAction<string, (issue: v.CheckIssue<string>) => string>]>;
|
|
27
|
+
/**
|
|
28
|
+
* The environment variable the value is injected as, when that differs from {@link key}. This
|
|
29
|
+
* is the name the agent is told to read, and it is what a vendor SDK that auto-reads its own
|
|
30
|
+
* documented variable needs.
|
|
31
|
+
*
|
|
32
|
+
* Held to the toolchain rule rather than the reserved-platform one, because it reads nothing:
|
|
33
|
+
* the floor above is about what may be READ off the deployment's environment, and an injection
|
|
34
|
+
* name only decides what a variable is called inside this job's agent process. That is what lets
|
|
35
|
+
* an integration keep a vendor's documented name even when a platform prefix family covers it.
|
|
36
|
+
*/
|
|
37
|
+
readonly envName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 128, undefined>, v.RegexAction<string, "must be a valid environment variable name">, v.CheckAction<string, (issue: v.CheckIssue<string>) => string>]>, undefined>;
|
|
19
38
|
/**
|
|
20
39
|
* How the integration expects the credential to be presented (`X-RD-Token: <value>`,
|
|
21
40
|
* `Authorization: Bearer <value>`). Folded into the brief verbatim: the agent writes the
|
|
@@ -54,7 +73,7 @@ export declare const binaryGeneratorDefinitionSchema: v.ObjectSchema<{
|
|
|
54
73
|
* The content types it produces. At least one: a generator that produces nothing is not a
|
|
55
74
|
* generator, and an empty list would make it match every step's requirements by vacuity.
|
|
56
75
|
*/
|
|
57
|
-
readonly modalities: v.SchemaWithPipe<readonly [v.ArraySchema<v.PicklistSchema<["image", "audio", "video", "3d", "document"], undefined>, undefined>, v.MinLengthAction<("3d" | "audio" | "document" | "image" | "video")[], 1, undefined>]>;
|
|
76
|
+
readonly modalities: v.SchemaWithPipe<readonly [v.ArraySchema<v.PicklistSchema<["image", "audio", "video", "3d-model", "3d-scene", "document"], undefined>, undefined>, v.MinLengthAction<("3d-model" | "3d-scene" | "audio" | "document" | "image" | "video")[], 1, undefined>]>;
|
|
58
77
|
/**
|
|
59
78
|
* The concrete media types it can emit (`image/png`, `audio/mpeg`), when the integration
|
|
60
79
|
* pins them down. Absent ⇒ only the coarse {@link modalities} are known, which the brief
|
|
@@ -75,12 +94,31 @@ export declare const binaryGeneratorDefinitionSchema: v.ObjectSchema<{
|
|
|
75
94
|
readonly guidance: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MaxLengthAction<string, 20000, undefined>]>, undefined>;
|
|
76
95
|
readonly credential: v.OptionalSchema<v.ObjectSchema<{
|
|
77
96
|
/**
|
|
78
|
-
* The credential's key
|
|
79
|
-
*
|
|
80
|
-
*
|
|
97
|
+
* The credential's LOOKUP key: what the secret resolver is asked for, and what a workspace
|
|
98
|
+
* stores its own value under. Also the ENVIRONMENT VARIABLE the agent reads it from unless
|
|
99
|
+
* {@link envName} says otherwise, so it must be a valid POSIX variable name either way: a
|
|
100
|
+
* generator declaring `x-rd-token` would resolve fine and then be dropped by the harness's env
|
|
81
101
|
* validation, which is a silent "the integration just 401s" at run time.
|
|
102
|
+
*
|
|
103
|
+
* It may NOT name a variable the platform's own configuration owns
|
|
104
|
+
* ({@link isReservedPlatformEnvKey}). The resolver reads the key off the deployment's
|
|
105
|
+
* environment and the value is injected into an agent process, so an integration declaring
|
|
106
|
+
* `ENCRYPTION_KEY` would hand a prompt-injectable agent the deployment's master sealing key.
|
|
107
|
+
* Refused here so a deployment learns at boot, and again at dispatch, since a mothership-mode
|
|
108
|
+
* node boot-validates none of the definitions it resolves.
|
|
109
|
+
*/
|
|
110
|
+
readonly key: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 128, undefined>, v.RegexAction<string, "must be a valid environment variable name">, v.CheckAction<string, (issue: v.CheckIssue<string>) => string>]>;
|
|
111
|
+
/**
|
|
112
|
+
* The environment variable the value is injected as, when that differs from {@link key}. This
|
|
113
|
+
* is the name the agent is told to read, and it is what a vendor SDK that auto-reads its own
|
|
114
|
+
* documented variable needs.
|
|
115
|
+
*
|
|
116
|
+
* Held to the toolchain rule rather than the reserved-platform one, because it reads nothing:
|
|
117
|
+
* the floor above is about what may be READ off the deployment's environment, and an injection
|
|
118
|
+
* name only decides what a variable is called inside this job's agent process. That is what lets
|
|
119
|
+
* an integration keep a vendor's documented name even when a platform prefix family covers it.
|
|
82
120
|
*/
|
|
83
|
-
readonly
|
|
121
|
+
readonly envName: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 128, undefined>, v.RegexAction<string, "must be a valid environment variable name">, v.CheckAction<string, (issue: v.CheckIssue<string>) => string>]>, undefined>;
|
|
84
122
|
/**
|
|
85
123
|
* How the integration expects the credential to be presented (`X-RD-Token: <value>`,
|
|
86
124
|
* `Authorization: Bearer <value>`). Folded into the brief verbatim: the agent writes the
|
|
@@ -133,7 +171,7 @@ export declare const registeredBinaryGeneratorSchema: v.ObjectSchema<{
|
|
|
133
171
|
readonly name: v.StringSchema<undefined>;
|
|
134
172
|
readonly summary: v.StringSchema<undefined>;
|
|
135
173
|
/** What it produces — what the builder checks a step's declared content types against. */
|
|
136
|
-
readonly modalities: v.ArraySchema<v.PicklistSchema<["image", "audio", "video", "3d", "document"], undefined>, undefined>;
|
|
174
|
+
readonly modalities: v.ArraySchema<v.PicklistSchema<["image", "audio", "video", "3d-model", "3d-scene", "document"], undefined>, undefined>;
|
|
137
175
|
/** The concrete formats it pins down, when it declares any. Shown as detail, never a filter. */
|
|
138
176
|
readonly mediaTypes: v.OptionalSchema<v.ArraySchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.ToLowerCaseAction, v.MinLengthAction<string, 3, undefined>, v.MaxLengthAction<string, 128, undefined>, v.RegexAction<string, "must be a media type of the form type/subtype">]>, undefined>, undefined>;
|
|
139
177
|
}, undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binary-generators.d.ts","sourceRoot":"","sources":["../src/binary-generators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"binary-generators.d.ts","sourceRoot":"","sources":["../src/binary-generators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAsC5B;;;;;;;;GAQG;AACH,eAAO,MAAM,+BAA+B;IAC1C;;;;;;;;;;;;;OAaG;;IAYH;;;;;;;;;OASG;;IAcH;;;;OAIG;;IAEH;;;;;OAKG;;aAEH,CAAA;AACF,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,+BAA+B,CAAC,CAAA;AAE7F;;;;;;;GAOG;AACH,eAAO,MAAM,+BAA+B;IAC1C,iFAAiF;;;IAGjF,2DAA2D;;IAE3D;;;OAGG;;IAEH;;;OAGG;;IAEH;;;;OAIG;;IAEH;;;;OAIG;;IAEH;;;;OAIG;;;QAxGH;;;;;;;;;;;;;WAaG;;QAYH;;;;;;;;;WASG;;QAcH;;;;WAIG;;QAEH;;;;;WAKG;;;IAgDH;;;;OAIG;;;;;;;aAEH,CAAA;AACF,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,+BAA+B,CAAC,CAAA;AAE7F;;;;;;;;GAQG;AACH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,+BAA+B;;;;IAI1C,0FAA0F;;IAE1F,gGAAgG;;aAEhG,CAAA;AACF,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,+BAA+B,CAAC,CAAA;AAE7F,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,EAAE,CAO7E"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as v from 'valibot';
|
|
2
2
|
import { binaryModalitySchema, mediaTypeSchema } from './binary-modalities.js';
|
|
3
3
|
import { uploadApiContractSchema } from './foundational-services.js';
|
|
4
|
+
import { isReservedPlatformEnvKey, isToolchainEnvName, reservedEnvKeyMessage, toolchainEnvNameMessage, } from './reserved-env-keys.js';
|
|
4
5
|
// ---------------------------------------------------------------------------
|
|
5
6
|
// Wire vocabulary for GENERATIVE BINARY INTEGRATIONS — the third-party (or in-house) APIs a
|
|
6
7
|
// binary-generating agent kind calls to PRODUCE its deliverable: an image generator, a
|
|
@@ -32,12 +33,31 @@ const slug = v.pipe(v.string(), v.trim(), v.minLength(1), v.maxLength(64), v.reg
|
|
|
32
33
|
*/
|
|
33
34
|
export const binaryGeneratorCredentialSchema = v.object({
|
|
34
35
|
/**
|
|
35
|
-
* The credential's key
|
|
36
|
-
*
|
|
37
|
-
*
|
|
36
|
+
* The credential's LOOKUP key: what the secret resolver is asked for, and what a workspace
|
|
37
|
+
* stores its own value under. Also the ENVIRONMENT VARIABLE the agent reads it from unless
|
|
38
|
+
* {@link envName} says otherwise, so it must be a valid POSIX variable name either way: a
|
|
39
|
+
* generator declaring `x-rd-token` would resolve fine and then be dropped by the harness's env
|
|
38
40
|
* validation, which is a silent "the integration just 401s" at run time.
|
|
41
|
+
*
|
|
42
|
+
* It may NOT name a variable the platform's own configuration owns
|
|
43
|
+
* ({@link isReservedPlatformEnvKey}). The resolver reads the key off the deployment's
|
|
44
|
+
* environment and the value is injected into an agent process, so an integration declaring
|
|
45
|
+
* `ENCRYPTION_KEY` would hand a prompt-injectable agent the deployment's master sealing key.
|
|
46
|
+
* Refused here so a deployment learns at boot, and again at dispatch, since a mothership-mode
|
|
47
|
+
* node boot-validates none of the definitions it resolves.
|
|
39
48
|
*/
|
|
40
|
-
key: v.pipe(v.string(), v.trim(), v.minLength(1), v.maxLength(128), v.regex(/^[A-Za-z_][A-Za-z0-9_]*$/, 'must be a valid environment variable name')),
|
|
49
|
+
key: v.pipe(v.string(), v.trim(), v.minLength(1), v.maxLength(128), v.regex(/^[A-Za-z_][A-Za-z0-9_]*$/, 'must be a valid environment variable name'), v.check((key) => !isReservedPlatformEnvKey(key), (issue) => reservedEnvKeyMessage(String(issue.input)))),
|
|
50
|
+
/**
|
|
51
|
+
* The environment variable the value is injected as, when that differs from {@link key}. This
|
|
52
|
+
* is the name the agent is told to read, and it is what a vendor SDK that auto-reads its own
|
|
53
|
+
* documented variable needs.
|
|
54
|
+
*
|
|
55
|
+
* Held to the toolchain rule rather than the reserved-platform one, because it reads nothing:
|
|
56
|
+
* the floor above is about what may be READ off the deployment's environment, and an injection
|
|
57
|
+
* name only decides what a variable is called inside this job's agent process. That is what lets
|
|
58
|
+
* an integration keep a vendor's documented name even when a platform prefix family covers it.
|
|
59
|
+
*/
|
|
60
|
+
envName: v.optional(v.pipe(v.string(), v.trim(), v.minLength(1), v.maxLength(128), v.regex(/^[A-Za-z_][A-Za-z0-9_]*$/, 'must be a valid environment variable name'), v.check((name) => !isToolchainEnvName(name), (issue) => toolchainEnvNameMessage(String(issue.input))))),
|
|
41
61
|
/**
|
|
42
62
|
* How the integration expects the credential to be presented (`X-RD-Token: <value>`,
|
|
43
63
|
* `Authorization: Bearer <value>`). Folded into the brief verbatim: the agent writes the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binary-generators.js","sourceRoot":"","sources":["../src/binary-generators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"binary-generators.js","sourceRoot":"","sources":["../src/binary-generators.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,20 +14,88 @@ import * as v from 'valibot';
|
|
|
14
14
|
* is the whole integration, its media types and what a step can do with the result. A
|
|
15
15
|
* deployment that must tell a music generator from a speech generator says so in the
|
|
16
16
|
* definition's `mediaTypes` and its description.
|
|
17
|
+
*
|
|
18
|
+
* **3D is TWO members, and the reason is that nothing else can carry the distinction.** A single
|
|
19
|
+
* asset and a composed scene are different products of different integrations, and what a step
|
|
20
|
+
* does with the result is not comparable — one is attached to an entity, the other is loaded as
|
|
21
|
+
* an environment. That passes the audio-versus-video test on the ground that matters. It fails it
|
|
22
|
+
* on one: their MEDIA TYPES are identical. GLB, FBX, USDZ and `.blend` each carry either an
|
|
23
|
+
* object or a whole scene graph, so no format tells you which you were handed and
|
|
24
|
+
* {@link modalitiesOfMediaType} does not pretend otherwise. That is exactly why the split has to
|
|
25
|
+
* live HERE: if the container could say it, a media type would already have said it, and a step
|
|
26
|
+
* that must deliver a level could go on being admitted against a prop generator.
|
|
27
|
+
*
|
|
28
|
+
* What the split is NOT is a licence to slice the others by scope. `image` does not become
|
|
29
|
+
* sprite-versus-background, because a step's format requirement (`binaryOutput.mediaTypes`) is
|
|
30
|
+
* what distinguishes a PNG from a JPEG and a prompt is what distinguishes a sprite from a
|
|
31
|
+
* backdrop. A member earns its place only when neither of those can tell two deliverables apart.
|
|
17
32
|
*/
|
|
18
|
-
export declare const binaryModalitySchema: v.PicklistSchema<["image", "audio", "video", "3d", "document"], undefined>;
|
|
33
|
+
export declare const binaryModalitySchema: v.PicklistSchema<["image", "audio", "video", "3d-model", "3d-scene", "document"], undefined>;
|
|
19
34
|
export type BinaryModality = v.InferOutput<typeof binaryModalitySchema>;
|
|
20
35
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* what
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
36
|
+
* Whether a stored value is still a member of the vocabulary — DERIVED from the picklist, so it
|
|
37
|
+
* cannot drift from it the way a hand-written second list would.
|
|
38
|
+
*
|
|
39
|
+
* This vocabulary is closed but PERSISTED (`stepOptions.binaryOutput.modalities`), and those two
|
|
40
|
+
* facts together are what makes the guard necessary: a member retired from the union goes on
|
|
41
|
+
* existing in saved pipelines, as `3d` did when it split into `3d-model` and `3d-scene`. A reader
|
|
42
|
+
* that maps a modality through an exhaustive `Record` or `switch` is therefore total against the
|
|
43
|
+
* TYPE and partial against the DATA — the gap where a lookup returns `undefined` and a call on it
|
|
44
|
+
* throws. Narrow with this first, and render the negative case as the retired value it is: nothing
|
|
45
|
+
* can know which current member was meant, and guessing one would quietly rewrite a requirement
|
|
46
|
+
* that the split exists to make someone restate.
|
|
47
|
+
*/
|
|
48
|
+
export declare function isBinaryModality(value: string): value is BinaryModality;
|
|
49
|
+
/**
|
|
50
|
+
* Every {@link BinaryModality} a media type is CONSISTENT with — empty when nothing here
|
|
51
|
+
* recognises it.
|
|
52
|
+
*
|
|
53
|
+
* A LIST rather than one answer, because for 3D there is genuinely more than one and saying so
|
|
54
|
+
* is the whole point. `model/gltf-binary` is a GLB; a GLB is one prop or an entire environment
|
|
55
|
+
* and the container does not record which. Returning `3d-model` for it would classify every
|
|
56
|
+
* delivered scene as an asset, and picking either would make the boot check below refuse a
|
|
57
|
+
* correct registration.
|
|
58
|
+
*
|
|
59
|
+
* Empty is a REAL answer and callers must keep it apart from a modality: it means the platform
|
|
60
|
+
* does not know what this content is, which is different from knowing it is not an image. Two
|
|
61
|
+
* things read this — a registration's declared media types are checked against its declared
|
|
62
|
+
* modalities (a generator claiming `audio` while listing `image/png` is a configuration error,
|
|
63
|
+
* not a judgement call), and a settled step's declared artifacts are CLASSIFIED in code rather
|
|
64
|
+
* than by asking the model what kind of thing it just made. Each has to say what it does with a
|
|
65
|
+
* MULTI-member answer: the first passes when the sets INTERSECT, the second declines to classify
|
|
66
|
+
* at all, because an ambiguous answer is not a verdict.
|
|
67
|
+
*/
|
|
68
|
+
export declare function modalitiesOfMediaType(value: string): BinaryModality[];
|
|
69
|
+
/**
|
|
70
|
+
* The modality a media type UNAMBIGUOUSLY identifies, or `null` when it identifies none or more
|
|
71
|
+
* than one.
|
|
72
|
+
*
|
|
73
|
+
* For classifying something that already exists — a stored artifact — where a guess is worse than
|
|
74
|
+
* an absence. A `.glb` collapses `3d-model` and `3d-scene`, so it classifies as neither and the
|
|
75
|
+
* artifact carries no modality: "we cannot tell what this is" is not "this is not an image", and
|
|
76
|
+
* the step's own declaration is the only thing that ever knew which of the two was being made.
|
|
29
77
|
*/
|
|
30
78
|
export declare function modalityOfMediaType(value: string): BinaryModality | null;
|
|
79
|
+
/**
|
|
80
|
+
* A media type reduced to the `type/subtype` two people mean the same thing by — lowercased,
|
|
81
|
+
* trimmed, parameters dropped — or `null` when there is no `type/subtype` in it at all.
|
|
82
|
+
*
|
|
83
|
+
* The ONE definition of "the same format", because three places compare media types and two of
|
|
84
|
+
* them receive text nobody normalised. A step's declared formats and a generator's declared
|
|
85
|
+
* formats both come through {@link mediaTypeSchema}, which already lowercases and refuses
|
|
86
|
+
* parameters, so those two match on plain equality; a SETTLED artifact's `contentType` is the
|
|
87
|
+
* agent's own prose (`image/PNG`, `model/gltf-binary; charset=binary`) and matches nothing until
|
|
88
|
+
* it comes through here. A second copy of this reduction is how `model/GLTF-binary` becomes a
|
|
89
|
+
* format the platform reports as undelivered while the file sits exactly where it was asked for.
|
|
90
|
+
*
|
|
91
|
+
* Note what it deliberately does NOT do: it maps no synonyms. `model/obj` and
|
|
92
|
+
* `application/x-tgif` are the same file and stay different values here, because a step's format
|
|
93
|
+
* requirement is checked by EXACT match against what a generator declared, and a matcher that
|
|
94
|
+
* quietly accepted a near-neighbour would admit a GLB where an OBJ was required — which is the
|
|
95
|
+
* failure the requirement exists to prevent. The two sides agree by spelling the format the same
|
|
96
|
+
* way, and the brief tells the agent the exact string.
|
|
97
|
+
*/
|
|
98
|
+
export declare function normalizeMediaType(value: string): string | null;
|
|
31
99
|
/**
|
|
32
100
|
* A media type as `type/subtype` (parameters are NOT accepted — a generator declares what it
|
|
33
101
|
* produces, not how one request happened to be encoded).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binary-modalities.d.ts","sourceRoot":"","sources":["../src/binary-modalities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAY5B
|
|
1
|
+
{"version":3,"file":"binary-modalities.d.ts","sourceRoot":"","sources":["../src/binary-modalities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAY5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,oBAAoB,8FAqB/B,CAAA;AACF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEvE;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,cAAc,CAEvE;AAOD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CAuBrE;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAGxE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI/D;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,uPAU3B,CAAA"}
|
|
@@ -23,6 +23,21 @@ import * as v from 'valibot';
|
|
|
23
23
|
* is the whole integration, its media types and what a step can do with the result. A
|
|
24
24
|
* deployment that must tell a music generator from a speech generator says so in the
|
|
25
25
|
* definition's `mediaTypes` and its description.
|
|
26
|
+
*
|
|
27
|
+
* **3D is TWO members, and the reason is that nothing else can carry the distinction.** A single
|
|
28
|
+
* asset and a composed scene are different products of different integrations, and what a step
|
|
29
|
+
* does with the result is not comparable — one is attached to an entity, the other is loaded as
|
|
30
|
+
* an environment. That passes the audio-versus-video test on the ground that matters. It fails it
|
|
31
|
+
* on one: their MEDIA TYPES are identical. GLB, FBX, USDZ and `.blend` each carry either an
|
|
32
|
+
* object or a whole scene graph, so no format tells you which you were handed and
|
|
33
|
+
* {@link modalitiesOfMediaType} does not pretend otherwise. That is exactly why the split has to
|
|
34
|
+
* live HERE: if the container could say it, a media type would already have said it, and a step
|
|
35
|
+
* that must deliver a level could go on being admitted against a prop generator.
|
|
36
|
+
*
|
|
37
|
+
* What the split is NOT is a licence to slice the others by scope. `image` does not become
|
|
38
|
+
* sprite-versus-background, because a step's format requirement (`binaryOutput.mediaTypes`) is
|
|
39
|
+
* what distinguishes a PNG from a JPEG and a prompt is what distinguishes a sprite from a
|
|
40
|
+
* backdrop. A member earns its place only when neither of those can tell two deliverables apart.
|
|
26
41
|
*/
|
|
27
42
|
export const binaryModalitySchema = v.picklist([
|
|
28
43
|
/** Still images — `image/png`, `image/webp`, `image/jpeg`, `image/svg+xml`. */
|
|
@@ -31,49 +46,127 @@ export const binaryModalitySchema = v.picklist([
|
|
|
31
46
|
'audio',
|
|
32
47
|
/** Moving pictures, with or without an audio track — `video/mp4`, `video/webm`. */
|
|
33
48
|
'video',
|
|
34
|
-
/**
|
|
35
|
-
|
|
49
|
+
/**
|
|
50
|
+
* ONE 3D asset: a prop, a character, a part — the thing an inventory counts and a scene places.
|
|
51
|
+
* Its container is `model/gltf-binary`, `model/obj`, `application/x-blender`, and so on; which
|
|
52
|
+
* one matters to whoever opens it, and that is what `binaryOutput.mediaTypes` is for.
|
|
53
|
+
*/
|
|
54
|
+
'3d-model',
|
|
55
|
+
/**
|
|
56
|
+
* A composed 3D scene: several assets with a hierarchy, and typically transforms, materials,
|
|
57
|
+
* cameras or lights. The SAME containers as {@link '3d-model'} — the difference is in what the
|
|
58
|
+
* file holds, which no media type states, so it is stated here or nowhere.
|
|
59
|
+
*/
|
|
60
|
+
'3d-scene',
|
|
36
61
|
/** A rendered, paginated document — `application/pdf`. */
|
|
37
62
|
'document',
|
|
38
63
|
]);
|
|
39
64
|
/**
|
|
40
|
-
*
|
|
65
|
+
* Whether a stored value is still a member of the vocabulary — DERIVED from the picklist, so it
|
|
66
|
+
* cannot drift from it the way a hand-written second list would.
|
|
41
67
|
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
68
|
+
* This vocabulary is closed but PERSISTED (`stepOptions.binaryOutput.modalities`), and those two
|
|
69
|
+
* facts together are what makes the guard necessary: a member retired from the union goes on
|
|
70
|
+
* existing in saved pipelines, as `3d` did when it split into `3d-model` and `3d-scene`. A reader
|
|
71
|
+
* that maps a modality through an exhaustive `Record` or `switch` is therefore total against the
|
|
72
|
+
* TYPE and partial against the DATA — the gap where a lookup returns `undefined` and a call on it
|
|
73
|
+
* throws. Narrow with this first, and render the negative case as the retired value it is: nothing
|
|
74
|
+
* can know which current member was meant, and guessing one would quietly rewrite a requirement
|
|
75
|
+
* that the split exists to make someone restate.
|
|
48
76
|
*/
|
|
49
|
-
export function
|
|
50
|
-
|
|
77
|
+
export function isBinaryModality(value) {
|
|
78
|
+
return BINARY_MODALITY_SET.has(value);
|
|
79
|
+
}
|
|
80
|
+
const BINARY_MODALITY_SET = new Set(binaryModalitySchema.options);
|
|
81
|
+
/** The 3D containers, which say the content is 3D and DELIBERATELY nothing more. */
|
|
82
|
+
const THREE_D = ['3d-model', '3d-scene'];
|
|
83
|
+
/**
|
|
84
|
+
* Every {@link BinaryModality} a media type is CONSISTENT with — empty when nothing here
|
|
85
|
+
* recognises it.
|
|
86
|
+
*
|
|
87
|
+
* A LIST rather than one answer, because for 3D there is genuinely more than one and saying so
|
|
88
|
+
* is the whole point. `model/gltf-binary` is a GLB; a GLB is one prop or an entire environment
|
|
89
|
+
* and the container does not record which. Returning `3d-model` for it would classify every
|
|
90
|
+
* delivered scene as an asset, and picking either would make the boot check below refuse a
|
|
91
|
+
* correct registration.
|
|
92
|
+
*
|
|
93
|
+
* Empty is a REAL answer and callers must keep it apart from a modality: it means the platform
|
|
94
|
+
* does not know what this content is, which is different from knowing it is not an image. Two
|
|
95
|
+
* things read this — a registration's declared media types are checked against its declared
|
|
96
|
+
* modalities (a generator claiming `audio` while listing `image/png` is a configuration error,
|
|
97
|
+
* not a judgement call), and a settled step's declared artifacts are CLASSIFIED in code rather
|
|
98
|
+
* than by asking the model what kind of thing it just made. Each has to say what it does with a
|
|
99
|
+
* MULTI-member answer: the first passes when the sets INTERSECT, the second declines to classify
|
|
100
|
+
* at all, because an ambiguous answer is not a verdict.
|
|
101
|
+
*/
|
|
102
|
+
export function modalitiesOfMediaType(value) {
|
|
103
|
+
const type = normalizeMediaType(value) ?? '';
|
|
51
104
|
const [top, subtype] = type.split('/');
|
|
52
105
|
if (!top || !subtype)
|
|
53
|
-
return
|
|
106
|
+
return [];
|
|
54
107
|
if (top === 'image')
|
|
55
|
-
return 'image';
|
|
108
|
+
return ['image'];
|
|
56
109
|
if (top === 'audio')
|
|
57
|
-
return 'audio';
|
|
110
|
+
return ['audio'];
|
|
58
111
|
if (top === 'video')
|
|
59
|
-
return 'video';
|
|
112
|
+
return ['video'];
|
|
60
113
|
if (top === 'model')
|
|
61
|
-
return
|
|
114
|
+
return THREE_D;
|
|
62
115
|
if (top === 'application') {
|
|
63
116
|
if (subtype === 'pdf')
|
|
64
|
-
return 'document';
|
|
117
|
+
return ['document'];
|
|
65
118
|
// The 3D formats that predate `model/*` and are still what tooling emits: `sla` is STL, and
|
|
66
119
|
// `x-tgif` is what the shared mime database maps `.obj` to (an old collision with the TGIF
|
|
67
120
|
// drawing format, but it IS the type an OBJ file is served as, so recognising it is right).
|
|
68
|
-
// `octet-stream` stays
|
|
121
|
+
// `octet-stream` stays empty on purpose — it is the "no idea" type, and guessing 3D from it
|
|
69
122
|
// would classify every unlabelled download as a model.
|
|
70
123
|
if (subtype === 'octet-stream')
|
|
71
|
-
return
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
124
|
+
return [];
|
|
125
|
+
// `x-blender` is the shared mime database's type for a `.blend` file, which is what an
|
|
126
|
+
// EDITABLE 3D deliverable looks like when the consumer is an artist rather than an engine —
|
|
127
|
+
// the same reason `sla` and `x-tgif` are here rather than only the registered `model/*` names.
|
|
128
|
+
if (['gltf+json', 'x-gltf', 'sla', 'x-tgif', 'x-blender'].includes(subtype))
|
|
129
|
+
return THREE_D;
|
|
130
|
+
return [];
|
|
75
131
|
}
|
|
76
|
-
return
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* The modality a media type UNAMBIGUOUSLY identifies, or `null` when it identifies none or more
|
|
136
|
+
* than one.
|
|
137
|
+
*
|
|
138
|
+
* For classifying something that already exists — a stored artifact — where a guess is worse than
|
|
139
|
+
* an absence. A `.glb` collapses `3d-model` and `3d-scene`, so it classifies as neither and the
|
|
140
|
+
* artifact carries no modality: "we cannot tell what this is" is not "this is not an image", and
|
|
141
|
+
* the step's own declaration is the only thing that ever knew which of the two was being made.
|
|
142
|
+
*/
|
|
143
|
+
export function modalityOfMediaType(value) {
|
|
144
|
+
const modalities = modalitiesOfMediaType(value);
|
|
145
|
+
return modalities.length === 1 ? (modalities[0] ?? null) : null;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* A media type reduced to the `type/subtype` two people mean the same thing by — lowercased,
|
|
149
|
+
* trimmed, parameters dropped — or `null` when there is no `type/subtype` in it at all.
|
|
150
|
+
*
|
|
151
|
+
* The ONE definition of "the same format", because three places compare media types and two of
|
|
152
|
+
* them receive text nobody normalised. A step's declared formats and a generator's declared
|
|
153
|
+
* formats both come through {@link mediaTypeSchema}, which already lowercases and refuses
|
|
154
|
+
* parameters, so those two match on plain equality; a SETTLED artifact's `contentType` is the
|
|
155
|
+
* agent's own prose (`image/PNG`, `model/gltf-binary; charset=binary`) and matches nothing until
|
|
156
|
+
* it comes through here. A second copy of this reduction is how `model/GLTF-binary` becomes a
|
|
157
|
+
* format the platform reports as undelivered while the file sits exactly where it was asked for.
|
|
158
|
+
*
|
|
159
|
+
* Note what it deliberately does NOT do: it maps no synonyms. `model/obj` and
|
|
160
|
+
* `application/x-tgif` are the same file and stay different values here, because a step's format
|
|
161
|
+
* requirement is checked by EXACT match against what a generator declared, and a matcher that
|
|
162
|
+
* quietly accepted a near-neighbour would admit a GLB where an OBJ was required — which is the
|
|
163
|
+
* failure the requirement exists to prevent. The two sides agree by spelling the format the same
|
|
164
|
+
* way, and the brief tells the agent the exact string.
|
|
165
|
+
*/
|
|
166
|
+
export function normalizeMediaType(value) {
|
|
167
|
+
const type = value.trim().toLowerCase().split(';')[0]?.trim() ?? '';
|
|
168
|
+
const [top, subtype] = type.split('/');
|
|
169
|
+
return top && subtype ? `${top}/${subtype}` : null;
|
|
77
170
|
}
|
|
78
171
|
/**
|
|
79
172
|
* A media type as `type/subtype` (parameters are NOT accepted — a generator declares what it
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binary-modalities.js","sourceRoot":"","sources":["../src/binary-modalities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,8EAA8E;AAC9E,kGAAkG;AAClG,8FAA8F;AAC9F,0CAA0C;AAC1C,EAAE;AACF,kGAAkG;AAClG,gGAAgG;AAChG,kDAAkD;AAClD,8EAA8E;AAE9E
|
|
1
|
+
{"version":3,"file":"binary-modalities.js","sourceRoot":"","sources":["../src/binary-modalities.ts"],"names":[],"mappings":"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"}
|
package/dist/binary-outputs.d.ts
CHANGED
|
@@ -43,7 +43,43 @@ export declare const binaryOutputConfigSchema: v.ObjectSchema<{
|
|
|
43
43
|
* audio" is a statement about the WORK, and deriving it from the current selection would make
|
|
44
44
|
* removing the audio generator look like a change of requirements rather than a break.
|
|
45
45
|
*/
|
|
46
|
-
readonly modalities: v.OptionalSchema<v.ArraySchema<v.PicklistSchema<["image", "audio", "video", "3d", "document"], undefined>, undefined>, undefined>;
|
|
46
|
+
readonly modalities: v.OptionalSchema<v.ArraySchema<v.PicklistSchema<["image", "audio", "video", "3d-model", "3d-scene", "document"], undefined>, undefined>, undefined>;
|
|
47
|
+
/**
|
|
48
|
+
* The concrete FORMATS this step must deliver, one notch finer than {@link modalities}, for the
|
|
49
|
+
* deliverables where the container IS the requirement rather than a rendering preference.
|
|
50
|
+
*
|
|
51
|
+
* 3D is why this exists. PNG versus WebP is a genre question and belongs in a prompt, but GLB,
|
|
52
|
+
* USDZ and FBX are all one modality and none of them substitutes for another: a Godot importer
|
|
53
|
+
* takes the first, a RealityKit pipeline the second, an art pipeline the third. A step whose
|
|
54
|
+
* mesh must load in the game can otherwise be admitted against an integration that cannot emit a
|
|
55
|
+
* loadable container, and the failure arrives at the end of a paid run as an asset nobody can
|
|
56
|
+
* open — which reads as a bad generation rather than as a selection nothing checked.
|
|
57
|
+
*
|
|
58
|
+
* Note the direction that gives this axis its scope: it is what the modality vocabulary does NOT
|
|
59
|
+
* have to split for. `3d-model` and `3d-scene` are two members precisely because no format tells
|
|
60
|
+
* them apart, and `image` stays one because a format tells PNG from JPEG — so a distinction any
|
|
61
|
+
* container can carry is stated HERE, and only what none can carry earns a modality.
|
|
62
|
+
*
|
|
63
|
+
* EVERY entry must be covered, not any one of them: a step needing a GLB for the engine AND an
|
|
64
|
+
* FBX the artists can open in Blender declares both, and both are checked. "Any of these will
|
|
65
|
+
* do" is deliberately not expressible — the agent has to name concrete formats on the vendor
|
|
66
|
+
* call, and a requirement that leaves it a choice hands that decision to the party with the
|
|
67
|
+
* least basis for making it. Declare the format you need, not the set you would accept.
|
|
68
|
+
*
|
|
69
|
+
* Checked by EXACT match against the {@link BinaryGeneratorDefinition.mediaTypes} a selected
|
|
70
|
+
* integration declares (both sides come through `mediaTypeSchema`, so case and parameters are
|
|
71
|
+
* already reconciled), and NOT translated into a modality: `modalityOfMediaType` recognises only
|
|
72
|
+
* the formats the platform happens to know, so inferring one here would make the strength of the
|
|
73
|
+
* check depend on whether we recognise the string — a requirement spelled with a brand-new
|
|
74
|
+
* container would silently lose the coarse check its neighbour keeps. The two lists are
|
|
75
|
+
* independent statements and both are enforced as written.
|
|
76
|
+
*
|
|
77
|
+
* Absent ⇒ no format requirement, which is the ordinary case and stays the ordinary case:
|
|
78
|
+
* {@link modalities} is the statement about the WORK. Like it, this is never defaulted from the
|
|
79
|
+
* current selection — deriving a requirement from what is selected would make REMOVING a
|
|
80
|
+
* generator look like a change of requirements rather than a break.
|
|
81
|
+
*/
|
|
82
|
+
readonly mediaTypes: v.OptionalSchema<v.ArraySchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.ToLowerCaseAction, v.MinLengthAction<string, 3, undefined>, v.MaxLengthAction<string, 128, undefined>, v.RegexAction<string, "must be a media type of the form type/subtype">]>, undefined>, undefined>;
|
|
47
83
|
}, undefined>;
|
|
48
84
|
export type BinaryOutputConfig = v.InferOutput<typeof binaryOutputConfigSchema>;
|
|
49
85
|
/** One stored artifact a binary-generating step declared in its reply's machine-read block. */
|
|
@@ -80,7 +116,7 @@ export declare const binaryOutputArtifactSchema: v.ObjectSchema<{
|
|
|
80
116
|
* one the platform recognises: "we do not know what this is" and "this is not an image" are
|
|
81
117
|
* different answers, and only the second could justify a warning.
|
|
82
118
|
*/
|
|
83
|
-
readonly modality: v.OptionalSchema<v.PicklistSchema<["image", "audio", "video", "3d", "document"], undefined>, undefined>;
|
|
119
|
+
readonly modality: v.OptionalSchema<v.PicklistSchema<["image", "audio", "video", "3d-model", "3d-scene", "document"], undefined>, undefined>;
|
|
84
120
|
}, undefined>;
|
|
85
121
|
export type BinaryOutputArtifact = v.InferOutput<typeof binaryOutputArtifactSchema>;
|
|
86
122
|
/**
|
|
@@ -132,7 +168,7 @@ export declare const binaryOutputReportSchema: v.ObjectSchema<{
|
|
|
132
168
|
* one the platform recognises: "we do not know what this is" and "this is not an image" are
|
|
133
169
|
* different answers, and only the second could justify a warning.
|
|
134
170
|
*/
|
|
135
|
-
readonly modality: v.OptionalSchema<v.PicklistSchema<["image", "audio", "video", "3d", "document"], undefined>, undefined>;
|
|
171
|
+
readonly modality: v.OptionalSchema<v.PicklistSchema<["image", "audio", "video", "3d-model", "3d-scene", "document"], undefined>, undefined>;
|
|
136
172
|
}, undefined>, undefined>;
|
|
137
173
|
/** Distinct `service` ids named in entries that the resolved catalog does not contain. */
|
|
138
174
|
readonly unknownServices: v.ArraySchema<v.StringSchema<undefined>, undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binary-outputs.d.ts","sourceRoot":"","sources":["../src/binary-outputs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAmB5B;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB;IACnC;;;;OAIG;;IAEH;;;;;;OAMG;;IAEH;;;;;;;;;OASG;;IAEH;;;;;;;;;;OAUG;;aAEH,CAAA;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,wBAAwB,CAAC,CAAA;AAE/E,+FAA+F;AAC/F,eAAO,MAAM,0BAA0B;IACrC;;;;;OAKG;;IAEH;;;OAGG;;IAEH,8FAA8F;;IAE9F,uEAAuE;;IAEvE,oDAAoD;;IAEpD;;;;;;OAMG;;IAEH;;;;;OAKG;;aAEH,CAAA;AACF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,0BAA0B,CAAC,CAAA;AAEnF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,wBAAwB;;QAnDnC;;;;;WAKG;;QAEH;;;WAGG;;QAEH,8FAA8F;;QAE9F,uEAAuE;;QAEvE,oDAAoD;;QAEpD;;;;;;WAMG;;QAEH;;;;;WAKG;;;IAsBH,0FAA0F;;IAE1F;;;;;;OAMG;;IAEH;;;;;;;;OAQG;;IAEH,2FAA2F;;IAE3F,qDAAqD;;IAErD,0FAA0F;;IAE1F,qEAAqE;;aAErE,CAAA;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,wBAAwB,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"binary-outputs.d.ts","sourceRoot":"","sources":["../src/binary-outputs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAmB5B;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB;IACnC;;;;OAIG;;IAEH;;;;;;OAMG;;IAEH;;;;;;;;;OASG;;IAEH;;;;;;;;;;OAUG;;IAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkCG;;aAEH,CAAA;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,wBAAwB,CAAC,CAAA;AAE/E,+FAA+F;AAC/F,eAAO,MAAM,0BAA0B;IACrC;;;;;OAKG;;IAEH;;;OAGG;;IAEH,8FAA8F;;IAE9F,uEAAuE;;IAEvE,oDAAoD;;IAEpD;;;;;;OAMG;;IAEH;;;;;OAKG;;aAEH,CAAA;AACF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,0BAA0B,CAAC,CAAA;AAEnF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,wBAAwB;;QAnDnC;;;;;WAKG;;QAEH;;;WAGG;;QAEH,8FAA8F;;QAE9F,uEAAuE;;QAEvE,oDAAoD;;QAEpD;;;;;;WAMG;;QAEH;;;;;WAKG;;;IAsBH,0FAA0F;;IAE1F;;;;;;OAMG;;IAEH;;;;;;;;OAQG;;IAEH,2FAA2F;;IAE3F,qDAAqD;;IAErD,0FAA0F;;IAE1F,qEAAqE;;aAErE,CAAA;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,wBAAwB,CAAC,CAAA"}
|
package/dist/binary-outputs.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as v from 'valibot';
|
|
2
|
-
import { binaryModalitySchema } from './binary-modalities.js';
|
|
2
|
+
import { binaryModalitySchema, mediaTypeSchema } from './binary-modalities.js';
|
|
3
3
|
// Wire vocabulary for BINARY-OUTPUT agent steps (docs/initiatives/binary-output-foundational-storage.md):
|
|
4
4
|
// a step whose kind GENERATES binary artifacts (image generation is the canonical example) and
|
|
5
5
|
// stores them through a FOUNDATIONAL SERVICE the step selected from the workspace's catalog —
|
|
@@ -53,6 +53,42 @@ export const binaryOutputConfigSchema = v.object({
|
|
|
53
53
|
* removing the audio generator look like a change of requirements rather than a break.
|
|
54
54
|
*/
|
|
55
55
|
modalities: v.optional(v.array(binaryModalitySchema)),
|
|
56
|
+
/**
|
|
57
|
+
* The concrete FORMATS this step must deliver, one notch finer than {@link modalities}, for the
|
|
58
|
+
* deliverables where the container IS the requirement rather than a rendering preference.
|
|
59
|
+
*
|
|
60
|
+
* 3D is why this exists. PNG versus WebP is a genre question and belongs in a prompt, but GLB,
|
|
61
|
+
* USDZ and FBX are all one modality and none of them substitutes for another: a Godot importer
|
|
62
|
+
* takes the first, a RealityKit pipeline the second, an art pipeline the third. A step whose
|
|
63
|
+
* mesh must load in the game can otherwise be admitted against an integration that cannot emit a
|
|
64
|
+
* loadable container, and the failure arrives at the end of a paid run as an asset nobody can
|
|
65
|
+
* open — which reads as a bad generation rather than as a selection nothing checked.
|
|
66
|
+
*
|
|
67
|
+
* Note the direction that gives this axis its scope: it is what the modality vocabulary does NOT
|
|
68
|
+
* have to split for. `3d-model` and `3d-scene` are two members precisely because no format tells
|
|
69
|
+
* them apart, and `image` stays one because a format tells PNG from JPEG — so a distinction any
|
|
70
|
+
* container can carry is stated HERE, and only what none can carry earns a modality.
|
|
71
|
+
*
|
|
72
|
+
* EVERY entry must be covered, not any one of them: a step needing a GLB for the engine AND an
|
|
73
|
+
* FBX the artists can open in Blender declares both, and both are checked. "Any of these will
|
|
74
|
+
* do" is deliberately not expressible — the agent has to name concrete formats on the vendor
|
|
75
|
+
* call, and a requirement that leaves it a choice hands that decision to the party with the
|
|
76
|
+
* least basis for making it. Declare the format you need, not the set you would accept.
|
|
77
|
+
*
|
|
78
|
+
* Checked by EXACT match against the {@link BinaryGeneratorDefinition.mediaTypes} a selected
|
|
79
|
+
* integration declares (both sides come through `mediaTypeSchema`, so case and parameters are
|
|
80
|
+
* already reconciled), and NOT translated into a modality: `modalityOfMediaType` recognises only
|
|
81
|
+
* the formats the platform happens to know, so inferring one here would make the strength of the
|
|
82
|
+
* check depend on whether we recognise the string — a requirement spelled with a brand-new
|
|
83
|
+
* container would silently lose the coarse check its neighbour keeps. The two lists are
|
|
84
|
+
* independent statements and both are enforced as written.
|
|
85
|
+
*
|
|
86
|
+
* Absent ⇒ no format requirement, which is the ordinary case and stays the ordinary case:
|
|
87
|
+
* {@link modalities} is the statement about the WORK. Like it, this is never defaulted from the
|
|
88
|
+
* current selection — deriving a requirement from what is selected would make REMOVING a
|
|
89
|
+
* generator look like a change of requirements rather than a break.
|
|
90
|
+
*/
|
|
91
|
+
mediaTypes: v.optional(v.array(mediaTypeSchema)),
|
|
56
92
|
});
|
|
57
93
|
/** One stored artifact a binary-generating step declared in its reply's machine-read block. */
|
|
58
94
|
export const binaryOutputArtifactSchema = v.object({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binary-outputs.js","sourceRoot":"","sources":["../src/binary-outputs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"binary-outputs.js","sourceRoot":"","sources":["../src/binary-outputs.ts"],"names":[],"mappings":"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"}
|