@metamesh/generator-sdk 0.18.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +59 -50
  3. package/dist/docs/guides/package.md +59 -50
  4. package/dist/docs/guides/parameters.md +5 -5
  5. package/dist/docs/manifest.json +1 -71
  6. package/dist/docs/reference/fonts/FontSelection.md +1 -1
  7. package/dist/docs/reference/fonts/isFontSelection.md +1 -1
  8. package/dist/docs/reference/index/ArrayParameterDefinition.md +1 -1
  9. package/dist/docs/reference/index/BaseParameterDefinition.md +1 -1
  10. package/dist/docs/reference/index/BooleanParameterDefinition.md +1 -1
  11. package/dist/docs/reference/index/ChoiceOption.md +1 -1
  12. package/dist/docs/reference/index/ChoiceParameterDefinition.md +1 -1
  13. package/dist/docs/reference/index/ChoiceSetParameterDefinition.md +1 -1
  14. package/dist/docs/reference/index/ColorParameterDefinition.md +1 -1
  15. package/dist/docs/reference/index/ConditionExpression.md +1 -1
  16. package/dist/docs/reference/index/ContourAnchor.md +1 -1
  17. package/dist/docs/reference/index/ContourParameterDefinition.md +1 -1
  18. package/dist/docs/reference/index/ContourParameterUi.md +1 -1
  19. package/dist/docs/reference/index/ContourPoint.md +1 -1
  20. package/dist/docs/reference/index/ContourSegment.md +1 -1
  21. package/dist/docs/reference/index/ContourValue.md +1 -1
  22. package/dist/docs/reference/index/FontParameterDefinition.md +1 -1
  23. package/dist/docs/reference/index/FontSelection.md +1 -1
  24. package/dist/docs/reference/index/GeneratorDefinition.md +1 -1
  25. package/dist/docs/reference/index/GeneratorIssue.md +1 -1
  26. package/dist/docs/reference/index/GeneratorModule.md +1 -1
  27. package/dist/docs/reference/index/GeneratorModuleOptions.md +1 -1
  28. package/dist/docs/reference/index/GeneratorParamId.md +1 -1
  29. package/dist/docs/reference/index/GeneratorParams.md +1 -1
  30. package/dist/docs/reference/index/GeneratorPreset.md +1 -1
  31. package/dist/docs/reference/index/GeneratorProgram.md +1 -1
  32. package/dist/docs/reference/index/GeneratorServices.md +1 -1
  33. package/dist/docs/reference/index/GeneratorTextArcBaseline.md +1 -1
  34. package/dist/docs/reference/index/GeneratorTextLayout.md +1 -1
  35. package/dist/docs/reference/index/GeneratorTextMetrics.md +1 -1
  36. package/dist/docs/reference/index/GeneratorTextOptions.md +1 -1
  37. package/dist/docs/reference/index/MAX_CONTOUR_SEGMENTS.md +1 -1
  38. package/dist/docs/reference/index/MAX_SIDE_PROFILE_SEGMENTS.md +1 -1
  39. package/dist/docs/reference/index/NumberArrayItemDefinition.md +1 -1
  40. package/dist/docs/reference/index/NumberArrayParameterDefinition.md +1 -1
  41. package/dist/docs/reference/index/NumberParameterDefinition.md +1 -1
  42. package/dist/docs/reference/index/NumberParameterUi.md +1 -1
  43. package/dist/docs/reference/index/ParameterDefinition.md +1 -1
  44. package/dist/docs/reference/index/ParameterDefinitionDocument.md +1 -1
  45. package/dist/docs/reference/index/ParameterGroup.md +1 -1
  46. package/dist/docs/reference/index/ParameterIssue.md +1 -1
  47. package/dist/docs/reference/index/ParameterIssueCode.md +1 -1
  48. package/dist/docs/reference/index/ParameterIssueSeverity.md +1 -1
  49. package/dist/docs/reference/index/ParameterScaleReference.md +1 -1
  50. package/dist/docs/reference/index/ParameterUi.md +1 -1
  51. package/dist/docs/reference/index/ParameterValidationResult.md +1 -1
  52. package/dist/docs/reference/index/ParameterValue.md +1 -1
  53. package/dist/docs/reference/index/ParameterValues.md +1 -1
  54. package/dist/docs/reference/index/RowParameterUi.md +1 -1
  55. package/dist/docs/reference/index/ScalarParameterValue.md +1 -1
  56. package/dist/docs/reference/index/SideProfileAnchor.md +1 -1
  57. package/dist/docs/reference/index/SideProfileParameterDefinition.md +1 -1
  58. package/dist/docs/reference/index/SideProfileParameterUi.md +1 -1
  59. package/dist/docs/reference/index/SideProfilePoint.md +1 -1
  60. package/dist/docs/reference/index/SideProfileSegment.md +1 -1
  61. package/dist/docs/reference/index/SideProfileValue.md +1 -1
  62. package/dist/docs/reference/index/SourceVisibility.md +1 -1
  63. package/dist/docs/reference/index/StringArrayItemDefinition.md +1 -1
  64. package/dist/docs/reference/index/StringArrayParameterDefinition.md +1 -1
  65. package/dist/docs/reference/index/SvgParameterDefinition.md +1 -1
  66. package/dist/docs/reference/index/TextParameterDefinition.md +1 -1
  67. package/dist/docs/reference/index/UNPREPARED_GENERATOR_SERVICES.md +1 -1
  68. package/dist/docs/reference/index/cloneContourValue.md +1 -1
  69. package/dist/docs/reference/index/cloneSideProfileValue.md +1 -1
  70. package/dist/docs/reference/index/contourValuesEqual.md +1 -1
  71. package/dist/docs/reference/index/defineGenerator.md +1 -1
  72. package/dist/docs/reference/index/defineGeneratorModule.md +1 -1
  73. package/dist/docs/reference/index/definePresets.md +1 -1
  74. package/dist/docs/reference/index/evaluateCondition.md +1 -1
  75. package/dist/docs/reference/index/isContourValue.md +1 -1
  76. package/dist/docs/reference/index/isFontSelection.md +1 -1
  77. package/dist/docs/reference/index/isSideProfileValue.md +1 -1
  78. package/dist/docs/reference/index/sideProfileValuesEqual.md +1 -1
  79. package/dist/docs/reference/modeling/GeneratorModel.md +1 -1
  80. package/dist/docs/reference/modeling/ModelDeliveryEncoder.md +1 -1
  81. package/dist/docs/reference/modeling/defineGeneratorModel.md +1 -1
  82. package/dist/docs/reference/modeling/parseGeneratorModel.md +1 -1
  83. package/dist/docs/reference/packages/GENERATOR_PACKAGE_FORMAT_VERSION.md +1 -1
  84. package/dist/docs/reference/packages/GeneratorAccess.md +1 -1
  85. package/dist/docs/reference/packages/GeneratorDefinitionIssue.md +1 -1
  86. package/dist/docs/reference/packages/GeneratorDefinitionParseResult.md +1 -1
  87. package/dist/docs/reference/packages/GeneratorDescriptor.md +1 -1
  88. package/dist/docs/reference/packages/GeneratorPackageManifest.md +1 -1
  89. package/dist/docs/reference/packages/GeneratorPackageSource.md +1 -1
  90. package/dist/docs/reference/packages/GeneratorPackageValidationError.md +1 -1
  91. package/dist/docs/reference/packages/GeneratorPreset.md +1 -1
  92. package/dist/docs/reference/packages/GeneratorRuntimeReference.md +1 -1
  93. package/dist/docs/reference/packages/InstalledGenerator.md +1 -1
  94. package/dist/docs/reference/packages/MAX_ARRAY_ITEMS.md +1 -1
  95. package/dist/docs/reference/packages/MAX_CONDITION_BRANCHES.md +1 -1
  96. package/dist/docs/reference/packages/MAX_CONDITION_DEPTH.md +1 -1
  97. package/dist/docs/reference/packages/MAX_DESCRIPTOR_LIST_ITEMS.md +1 -1
  98. package/dist/docs/reference/packages/MAX_GENERATOR_ID_LENGTH.md +1 -1
  99. package/dist/docs/reference/packages/MAX_GENERATOR_PACKAGE_BYTES.md +1 -1
  100. package/dist/docs/reference/packages/MAX_GENERATOR_PRESETS.md +1 -1
  101. package/dist/docs/reference/packages/MAX_METADATA_TEXT_LENGTH.md +1 -1
  102. package/dist/docs/reference/packages/MAX_PARAMETERS.md +1 -1
  103. package/dist/docs/reference/packages/MAX_PARAMETER_GROUPS.md +1 -1
  104. package/dist/docs/reference/packages/MAX_PARAMETER_OPTIONS.md +1 -1
  105. package/dist/docs/reference/packages/MAX_TEXT_PARAMETER_LENGTH.md +1 -1
  106. package/dist/docs/reference/packages/METAMESH_RUNTIME_VERSION.md +2 -2
  107. package/dist/docs/reference/packages/compareSemanticVersions.md +1 -1
  108. package/dist/docs/reference/packages/isRuntimeCompatible.md +1 -1
  109. package/dist/docs/reference/packages/parseGeneratorDefinition.md +1 -1
  110. package/dist/docs/reference/packages/parseGeneratorDescriptor.md +1 -1
  111. package/dist/docs/reference/packages/parseGeneratorPackageManifest.md +1 -1
  112. package/dist/docs/reference/packages/parseParameterDefinitionDocument.md +1 -1
  113. package/dist/docs/reference/packages/safeParseGeneratorDefinition.md +1 -1
  114. package/dist/docs/reference/packages/safeParseParameterDefinitionDocument.md +1 -1
  115. package/dist/docs/reference/packages/validateGeneratorPresets.md +1 -1
  116. package/dist/docs/reference/parameters/EMPTY_SVG_PARAMETER_DEFAULT.md +1 -1
  117. package/dist/docs/reference/parameters/MAX_PARAMETER_ISSUES.md +1 -1
  118. package/dist/docs/reference/parameters/MAX_PARAMETER_ISSUE_MESSAGE_LENGTH.md +1 -1
  119. package/dist/docs/reference/parameters/MAX_PROJECT_SVG_PARAMETER_BYTES.md +1 -1
  120. package/dist/docs/reference/parameters/MAX_SVG_PARAMETER_BYTES.md +1 -1
  121. package/dist/docs/reference/parameters/ParamCodec.md +1 -1
  122. package/dist/docs/reference/parameters/ParamDecodeCode.md +1 -1
  123. package/dist/docs/reference/parameters/ParamDecodeError.md +1 -1
  124. package/dist/docs/reference/parameters/ParamDecodeIssue.md +1 -1
  125. package/dist/docs/reference/parameters/ParamParseResult.md +1 -1
  126. package/dist/docs/reference/parameters/aggregateParameterIssues.md +1 -1
  127. package/dist/docs/reference/parameters/createParamCodec.md +1 -1
  128. package/dist/docs/reference/parameters/getDefaultParameters.md +1 -1
  129. package/dist/docs/reference/parameters/normalizeParameters.md +1 -1
  130. package/dist/docs/reference/parameters/parameterValueEquals.md +1 -1
  131. package/dist/docs/reference/parameters/parseParameterIssues.md +1 -1
  132. package/dist/docs/reference/parameters/svgParameterBytes.md +1 -1
  133. package/dist/docs/reference/runtime/ExecuteGeneratorOptions.md +1 -1
  134. package/dist/docs/reference/runtime/GenerateRequest.md +1 -1
  135. package/dist/docs/reference/runtime/GenerationError.md +1 -1
  136. package/dist/docs/reference/runtime/GenerationInvalid.md +1 -1
  137. package/dist/docs/reference/runtime/GenerationSuccess.md +1 -1
  138. package/dist/docs/reference/runtime/GeneratorExecutionGenerated.md +1 -1
  139. package/dist/docs/reference/runtime/GeneratorExecutionInvalid.md +1 -1
  140. package/dist/docs/reference/runtime/GeneratorExecutionResult.md +1 -1
  141. package/dist/docs/reference/runtime/MeshResourceData.md +1 -1
  142. package/dist/docs/reference/runtime/MeshTopologyMode.md +1 -1
  143. package/dist/docs/reference/runtime/ModelBounds.md +1 -1
  144. package/dist/docs/reference/runtime/ModelData.md +1 -1
  145. package/dist/docs/reference/runtime/ModelDelivery.md +1 -1
  146. package/dist/docs/reference/runtime/ModelPartData.md +1 -1
  147. package/dist/docs/reference/runtime/ModelStats.md +1 -1
  148. package/dist/docs/reference/runtime/ModelTimings.md +1 -1
  149. package/dist/docs/reference/runtime/ParsedGeneratorModule.md +1 -1
  150. package/dist/docs/reference/runtime/PartDelivery.md +1 -1
  151. package/dist/docs/reference/runtime/PartDeliveryDecoder.md +1 -1
  152. package/dist/docs/reference/runtime/PartDeliveryLimits.md +1 -1
  153. package/dist/docs/reference/runtime/RuntimeError.md +1 -1
  154. package/dist/docs/reference/runtime/ValidateRequest.md +1 -1
  155. package/dist/docs/reference/runtime/ValidationError.md +1 -1
  156. package/dist/docs/reference/runtime/ValidationSuccess.md +1 -1
  157. package/dist/docs/reference/runtime/WorkerRequest.md +2 -2
  158. package/dist/docs/reference/runtime/WorkerResponse.md +2 -2
  159. package/dist/docs/reference/runtime/canonicalizeParameters.md +1 -1
  160. package/dist/docs/reference/runtime/executeGenerator.md +1 -1
  161. package/dist/docs/reference/runtime/generationIssues.md +1 -1
  162. package/dist/docs/reference/runtime/parseGenerationSentAt.md +1 -1
  163. package/dist/docs/reference/runtime/parseGeneratorModule.md +1 -1
  164. package/dist/docs/reference/runtime/parseModelParts.md +1 -1
  165. package/dist/generator-package/constants.d.ts +1 -1
  166. package/dist/generator-package/constants.js +2 -2
  167. package/dist/generator-package/constants.js.map +1 -1
  168. package/dist/generator-package/versions.spec.js +6 -5
  169. package/dist/generator-package/versions.spec.js.map +1 -1
  170. package/dist/modeling-delivery.d.ts +2 -5
  171. package/dist/modeling-delivery.d.ts.map +1 -1
  172. package/dist/modeling-delivery.js +0 -10
  173. package/dist/modeling-delivery.js.map +1 -1
  174. package/dist/modeling.d.ts +1 -1
  175. package/dist/modeling.d.ts.map +1 -1
  176. package/dist/modeling.js +1 -1
  177. package/dist/modeling.js.map +1 -1
  178. package/dist/runtime/worker-contracts.d.ts +3 -28
  179. package/dist/runtime/worker-contracts.d.ts.map +1 -1
  180. package/dist/runtime/worker-contracts.js.map +1 -1
  181. package/package.json +3 -3
  182. package/dist/docs/reference/modeling/toWorldMeshes.md +0 -10
  183. package/dist/docs/reference/runtime/Export3mfRequest.md +0 -18
  184. package/dist/docs/reference/runtime/ExportError.md +0 -13
  185. package/dist/docs/reference/runtime/ExportSuccess.md +0 -13
  186. package/dist/docs/reference/runtime/ExportedFile.md +0 -13
package/CHANGELOG.md CHANGED
@@ -1,5 +1,44 @@
1
1
  # @metamesh/generator-sdk
2
2
 
3
+ ## 0.19.0
4
+
5
+ ### Minor Changes
6
+
7
+ - c9de510: Extend straight extrusion end finishing to concave outlines, holes, and disconnected regions.
8
+ Add independent-solid `join` with a feature datum and a smooth (default) or straight width/height
9
+ transition against validated planar, angled, and curved sampled support patches. Both profiles use
10
+ the same support, collar, and whole-volume containment proofs.
11
+
12
+ Breaking: compiled Generators require Modeling runtime major 12. Rebuild packages for the new
13
+ host contract; old compiled runtimes are rejected. Joining preserves the supplied operands and
14
+ does not promise a circular fillet radius or perform automatic placement.
15
+
16
+ Replace named lazy `computed` readers with eager `memo(fn, ...args)` values. Stable pure helpers
17
+ reuse immutable arguments and tracked current params/context reads, with bounded recent histories
18
+ and native geometry retention. Update Studio diagnostics to warn about fresh function identities.
19
+ All authored and compiled callers must use the new API; there is no compatibility surface.
20
+
21
+ - de3d234: Add runtime-neutral STL, 3MF, and GLB export under `@metamesh/modeling/export`, with isolated
22
+ format entry points and backpressure-aware streaming writers. All formats consume captured local
23
+ geometry, placement, and appearance, with independent limits, cancellation, and structured
24
+ information-loss diagnostics. Standard 3MF color groups carry appearance, while base materials
25
+ and multiproperties retain explicit material identities independently of RGB values. These
26
+ properties do not assign slicer filaments or physical device trays. Add `mesh.render()` for
27
+ shared crease-aware display buffers that preserve exact triangle coordinates.
28
+
29
+ Breaking: remove `export3mf` and export types from `/engine`, remove SDK export request protocols
30
+ and `toWorldMeshes`, and return owned `Uint8Array` bytes with format metadata from the shared
31
+ exporters. Studio uses one export worker for every format. CLI captures use format version 3;
32
+ replace `run --export-3mf` with `metamesh export RUN_DIRECTORY --format 3mf --output model.3mf`.
33
+ Captured-run export also supports STL and GLB without rerunning source. No legacy export paths
34
+ or capture readers are retained.
35
+
36
+ ### Patch Changes
37
+
38
+ - Updated dependencies [c9de510]
39
+ - Updated dependencies [de3d234]
40
+ - @metamesh/modeling@0.19.0
41
+
3
42
  ## 0.18.0
4
43
 
5
44
  ### Minor Changes
package/README.md CHANGED
@@ -1,14 +1,15 @@
1
1
  # `@metamesh/generator-sdk`
2
2
 
3
- Define typed controls, presets, and portable contracts for MetaMesh Generators. Use one definition
4
- for the editing interface, saved parameter values, and model execution.
3
+ Turn a parametric model into a reusable MetaMesh Generator. Define its controls and presets once,
4
+ then use that definition to infer parameter types, validate saved values, and connect the model
5
+ to an editing interface.
5
6
 
6
7
  > **Preview:** `0.x` minor releases may break compatibility. Patches remain compatible within the
7
8
  > same minor line.
8
9
 
9
10
  ## Installation
10
11
 
11
- For the modeling example below, install matching SDK and Modeling releases:
12
+ Install matching SDK and Modeling releases to build the Generator below:
12
13
 
13
14
  ```bash
14
15
  pnpm add @metamesh/generator-sdk @metamesh/modeling
@@ -18,13 +19,15 @@ The package publishes ES modules only. Use Node.js 24 or newer. TypeScript consu
18
19
  TypeScript 6.0 or newer, `strict` checking, and `NodeNext` or `Bundler` module resolution.
19
20
  Browser hosts need an ES2023-compatible runtime; the SDK's data contracts require no WebAssembly.
20
21
 
21
- The SDK can also be used alone for definitions, parameter handling, and package validation.
22
- Only its optional `/modeling` adapter imports the Modeling runtime.
22
+ You can also use the SDK on its own for definitions, parameter handling, and package validation.
23
+ The optional `/modeling` adapter connects it to Modeling; your application supplies the interface
24
+ and execution host.
23
25
 
24
26
  ## Define controls
25
27
 
26
- A Generator combines serializable metadata with a synchronous model program. This module defines
27
- a sleeve, infers its parameter types, and checks the relationship between its diameters:
28
+ A Generator combines a definition with a synchronous model program. This example makes a sleeve
29
+ with two diameter controls. Parameter types come from the definition, and an assertion checks
30
+ that the bore fits inside the outer wall:
28
31
 
29
32
  ```ts
30
33
  import { defineGenerator } from "@metamesh/generator-sdk";
@@ -57,21 +60,16 @@ export default defineGeneratorModel(definition, ({ params, assert, part }) => {
57
60
  });
58
61
  ```
59
62
 
60
- The adapter binds the definition to the model and produces a Generator module. Use
61
- `defineGeneratorModule({ definition, program })` to bind an existing program. A Generator runtime
62
- is itself a Modeling program: engines and direct model tests execute `runtime`.
63
- Format 5 carries the callback and identity in one object; nested
64
- format-4 runtimes are unsupported. Hosts normalize parameters, prepare assets,
65
- and execute the model; they own the forms, viewing, persistence, and export.
66
- Add named, complete starting values with `definePresets(definition, presets)`.
67
-
68
- `defineGenerator` validates structural and semantic metadata immediately; `definePresets` validates
69
- preset metadata and complete canonical parameter values. Invalid input throws
70
- `GeneratorPackageValidationError` at declaration. Both helpers retain the supplied object or array
71
- and its inferred literal types. Inline parameter, editor, choice, and preset objects receive
72
- TypeScript excess-property checks. Structural typing can hide extra fields in variables or generic
73
- factories; runtime validation checks those fields too. These helpers validate metadata and values,
74
- not model geometry or cross-parameter assertions.
63
+ `defineGeneratorModel` binds the definition to the model and infers its parameters and services.
64
+ If you already have a program, use `defineGeneratorModule({ definition, program })`. The resulting
65
+ runtime is a Modeling program that an engine or model test can execute directly.
66
+ Add named starting configurations with `definePresets(definition, presets)`; each preset supplies
67
+ a complete parameter map.
68
+
69
+ Definitions and presets contain serializable data, without callbacks. Hosts normalize parameters,
70
+ prepare assets, and execute the model. They also own forms, viewing, persistence, and export.
71
+ Generator modules use format 5, which carries the callback and identity in one object;
72
+ nested format-4 runtimes are unsupported.
75
73
 
76
74
  ## Generator capabilities
77
75
 
@@ -82,40 +80,51 @@ not model geometry or cross-parameter assertions.
82
80
  | Parameters and presets | Inferred TypeScript types, defaults, recovering normalization, strict codecs, and complete serializable presets. |
83
81
  | Host integration | Validated package manifests, module execution, Worker messages, and incremental mesh delivery. |
84
82
 
85
- Definitions and presets contain data, not callbacks. Conditional visibility changes the editing
86
- interface; hidden values remain saved and still require validation. Cross-parameter constraints
87
- belong in the model's assertions.
83
+ Conditional visibility changes which controls appear. Hidden values remain saved and still
84
+ require validation. Put constraints between parameters in the model's assertions.
85
+
86
+ ## Validate definitions and values
87
+
88
+ `defineGenerator` checks the definition as soon as you declare it. `definePresets` checks preset
89
+ metadata and complete canonical values. Invalid declarations throw
90
+ `GeneratorPackageValidationError`. These helpers retain the supplied object or array and its
91
+ inferred literal types; they don't execute geometry or model assertions.
92
+
93
+ Inline parameter, editor, choice, and preset objects receive TypeScript excess-property checks.
94
+ Runtime validation also catches extra fields that structural typing can hide in variables or
95
+ generic factories.
88
96
 
89
97
  Use `normalizeParameters` to recover saved values: it drops unknown keys, restores defaults, and
90
- clamps numbers. At strict boundaries, `createParamCodec(definition)` rejects incomplete, unknown, invalid, or
91
- noncanonical values. The [parameter guide](https://github.com/JasonKoolman/metamesh/blob/main/apps/web/content/docs/develop/parameters-and-validation.mdx)
98
+ clamps numbers. Use `createParamCodec(definition)` when inputs must already be complete and
99
+ canonical; it rejects missing or unknown fields and invalid values. The
100
+ [parameter guide](https://github.com/JasonKoolman/metamesh/blob/main/apps/web/content/docs/develop/parameters-and-validation.mdx)
92
101
  covers controls, conditions, and validation.
93
102
 
94
- Use the codec's `parse()` to throw on invalid input, or `safeParse()` for a discriminated result.
95
- Failure produces issues without substitute parameters. Codec issues use the shared `ParameterIssue`
96
- shape: `parameterId` names the control, and an optional `path` is relative to that control's value.
97
- Hosts can pass the issues directly to `aggregateParameterIssues`.
103
+ Use the codec's `parse()` to throw on invalid input, or `safeParse()` for a result you can check
104
+ without catching an exception. A failed parse reports issues without substitute parameters. Each `ParameterIssue` names
105
+ a control with `parameterId`; an optional `path` addresses a field within that control's value.
106
+ Hosts can pass these issues directly to `aggregateParameterIssues`.
107
+
108
+ ## Execute and deliver a model
98
109
 
99
110
  `executeGenerator` always validates its single `parameters` map against the current definition.
100
- Hosts may validate before loading assets, but execution does not accept a prior parse result as a
101
- validation bypass. Modeling hosts use `parseGeneratorModel(value, definition)` from `/modeling`
102
- to validate an unknown module and infer its executable `GeneratorModel<typeof definition>` type.
103
- Pass the default export itself for local entries that also export their definition; packaged
104
- namespaces contain only the default export. The runtime-neutral `parseGeneratorModule` remains
105
- available from `/runtime`. Invalid envelopes throw `TypeError`. Package validation exposes MetaMesh
106
- issues and errors, keeping its schema-library adapters private.
107
-
108
- Worker model statistics use `signedVolume` in mm³. `generateMs` measures the engine run;
109
- `timings.totalMs` measures the host workflow and includes stages outside the engine.
110
- `byteCount` counts finalized world-space position and index buffer bytes, counting shared buffers
111
- once; it does not measure the local buffers transferred by a Worker.
112
- Timing stages are optional; hosts report the phases they actually measure. The parameter-processing
113
- stage is `paramsMs` and finalization is `finalizeMs`.
114
-
115
- For Worker hosts, `/modeling` supplies `ModelDeliveryEncoder` and `toWorldMeshes`; `/runtime`
116
- supplies `PartDeliveryDecoder`. Transfers carry local buffers under `geometry`, with placement
117
- beside them. Decode resource references before application use and convert to world meshes before
118
- export. Receiving hosts own the buffers and keep them immutable and attached.
111
+ Hosts can validate before loading assets, but execution still checks the supplied values.
112
+ Modeling hosts use `parseGeneratorModel(value, definition)` from `/modeling` to validate a loaded
113
+ module and infer its executable `GeneratorModel<typeof definition>` type. Pass the default export
114
+ itself for local entries that also export their definition; packaged namespaces contain only the
115
+ default export. Use `parseGeneratorModule` from `/runtime` when you don't need the Modeling adapter.
116
+ Invalid module envelopes throw `TypeError`; package validation reports MetaMesh issues and errors.
117
+
118
+ For Worker hosts, `/modeling` supplies `ModelDeliveryEncoder`; `/runtime` supplies `PartDeliveryDecoder`.
119
+ Transfers carry local buffers under `geometry`, with placement beside them. Decode resource
120
+ references before application use or export. Receiving hosts own the buffers and keep them immutable
121
+ and attached.
122
+
123
+ Model statistics use `signedVolume` in mm³. `generateMs` measures the engine run;
124
+ `timings.totalMs` covers the host workflow, including stages outside the engine. Hosts report only
125
+ the timing stages they measure, using `paramsMs` for parameter processing and `finalizeMs` for
126
+ finalization. `byteCount` counts finalized world-space position and index buffer bytes, counting
127
+ shared buffers once; it doesn't measure the local buffers transferred by a Worker.
119
128
 
120
129
  ## API entry points
121
130
 
@@ -1,14 +1,15 @@
1
1
  # `@metamesh/generator-sdk`
2
2
 
3
- Define typed controls, presets, and portable contracts for MetaMesh Generators. Use one definition
4
- for the editing interface, saved parameter values, and model execution.
3
+ Turn a parametric model into a reusable MetaMesh Generator. Define its controls and presets once,
4
+ then use that definition to infer parameter types, validate saved values, and connect the model
5
+ to an editing interface.
5
6
 
6
7
  > **Preview:** `0.x` minor releases may break compatibility. Patches remain compatible within the
7
8
  > same minor line.
8
9
 
9
10
  ## Installation
10
11
 
11
- For the modeling example below, install matching SDK and Modeling releases:
12
+ Install matching SDK and Modeling releases to build the Generator below:
12
13
 
13
14
  ```bash
14
15
  pnpm add @metamesh/generator-sdk @metamesh/modeling
@@ -18,13 +19,15 @@ The package publishes ES modules only. Use Node.js 24 or newer. TypeScript consu
18
19
  TypeScript 6.0 or newer, `strict` checking, and `NodeNext` or `Bundler` module resolution.
19
20
  Browser hosts need an ES2023-compatible runtime; the SDK's data contracts require no WebAssembly.
20
21
 
21
- The SDK can also be used alone for definitions, parameter handling, and package validation.
22
- Only its optional `/modeling` adapter imports the Modeling runtime.
22
+ You can also use the SDK on its own for definitions, parameter handling, and package validation.
23
+ The optional `/modeling` adapter connects it to Modeling; your application supplies the interface
24
+ and execution host.
23
25
 
24
26
  ## Define controls
25
27
 
26
- A Generator combines serializable metadata with a synchronous model program. This module defines
27
- a sleeve, infers its parameter types, and checks the relationship between its diameters:
28
+ A Generator combines a definition with a synchronous model program. This example makes a sleeve
29
+ with two diameter controls. Parameter types come from the definition, and an assertion checks
30
+ that the bore fits inside the outer wall:
28
31
 
29
32
  ```ts
30
33
  import { defineGenerator } from "@metamesh/generator-sdk";
@@ -57,21 +60,16 @@ export default defineGeneratorModel(definition, ({ params, assert, part }) => {
57
60
  });
58
61
  ```
59
62
 
60
- The adapter binds the definition to the model and produces a Generator module. Use
61
- `defineGeneratorModule({ definition, program })` to bind an existing program. A Generator runtime
62
- is itself a Modeling program: engines and direct model tests execute `runtime`.
63
- Format 5 carries the callback and identity in one object; nested
64
- format-4 runtimes are unsupported. Hosts normalize parameters, prepare assets,
65
- and execute the model; they own the forms, viewing, persistence, and export.
66
- Add named, complete starting values with `definePresets(definition, presets)`.
67
-
68
- `defineGenerator` validates structural and semantic metadata immediately; `definePresets` validates
69
- preset metadata and complete canonical parameter values. Invalid input throws
70
- `GeneratorPackageValidationError` at declaration. Both helpers retain the supplied object or array
71
- and its inferred literal types. Inline parameter, editor, choice, and preset objects receive
72
- TypeScript excess-property checks. Structural typing can hide extra fields in variables or generic
73
- factories; runtime validation checks those fields too. These helpers validate metadata and values,
74
- not model geometry or cross-parameter assertions.
63
+ `defineGeneratorModel` binds the definition to the model and infers its parameters and services.
64
+ If you already have a program, use `defineGeneratorModule({ definition, program })`. The resulting
65
+ runtime is a Modeling program that an engine or model test can execute directly.
66
+ Add named starting configurations with `definePresets(definition, presets)`; each preset supplies
67
+ a complete parameter map.
68
+
69
+ Definitions and presets contain serializable data, without callbacks. Hosts normalize parameters,
70
+ prepare assets, and execute the model. They also own forms, viewing, persistence, and export.
71
+ Generator modules use format 5, which carries the callback and identity in one object;
72
+ nested format-4 runtimes are unsupported.
75
73
 
76
74
  ## Generator capabilities
77
75
 
@@ -82,40 +80,51 @@ not model geometry or cross-parameter assertions.
82
80
  | Parameters and presets | Inferred TypeScript types, defaults, recovering normalization, strict codecs, and complete serializable presets. |
83
81
  | Host integration | Validated package manifests, module execution, Worker messages, and incremental mesh delivery. |
84
82
 
85
- Definitions and presets contain data, not callbacks. Conditional visibility changes the editing
86
- interface; hidden values remain saved and still require validation. Cross-parameter constraints
87
- belong in the model's assertions.
83
+ Conditional visibility changes which controls appear. Hidden values remain saved and still
84
+ require validation. Put constraints between parameters in the model's assertions.
85
+
86
+ ## Validate definitions and values
87
+
88
+ `defineGenerator` checks the definition as soon as you declare it. `definePresets` checks preset
89
+ metadata and complete canonical values. Invalid declarations throw
90
+ `GeneratorPackageValidationError`. These helpers retain the supplied object or array and its
91
+ inferred literal types; they don't execute geometry or model assertions.
92
+
93
+ Inline parameter, editor, choice, and preset objects receive TypeScript excess-property checks.
94
+ Runtime validation also catches extra fields that structural typing can hide in variables or
95
+ generic factories.
88
96
 
89
97
  Use `normalizeParameters` to recover saved values: it drops unknown keys, restores defaults, and
90
- clamps numbers. At strict boundaries, `createParamCodec(definition)` rejects incomplete, unknown, invalid, or
91
- noncanonical values. The [parameter guide](https://github.com/JasonKoolman/metamesh/blob/main/apps/web/content/docs/develop/parameters-and-validation.mdx)
98
+ clamps numbers. Use `createParamCodec(definition)` when inputs must already be complete and
99
+ canonical; it rejects missing or unknown fields and invalid values. The
100
+ [parameter guide](https://github.com/JasonKoolman/metamesh/blob/main/apps/web/content/docs/develop/parameters-and-validation.mdx)
92
101
  covers controls, conditions, and validation.
93
102
 
94
- Use the codec's `parse()` to throw on invalid input, or `safeParse()` for a discriminated result.
95
- Failure produces issues without substitute parameters. Codec issues use the shared `ParameterIssue`
96
- shape: `parameterId` names the control, and an optional `path` is relative to that control's value.
97
- Hosts can pass the issues directly to `aggregateParameterIssues`.
103
+ Use the codec's `parse()` to throw on invalid input, or `safeParse()` for a result you can check
104
+ without catching an exception. A failed parse reports issues without substitute parameters. Each `ParameterIssue` names
105
+ a control with `parameterId`; an optional `path` addresses a field within that control's value.
106
+ Hosts can pass these issues directly to `aggregateParameterIssues`.
107
+
108
+ ## Execute and deliver a model
98
109
 
99
110
  `executeGenerator` always validates its single `parameters` map against the current definition.
100
- Hosts may validate before loading assets, but execution does not accept a prior parse result as a
101
- validation bypass. Modeling hosts use `parseGeneratorModel(value, definition)` from `/modeling`
102
- to validate an unknown module and infer its executable `GeneratorModel<typeof definition>` type.
103
- Pass the default export itself for local entries that also export their definition; packaged
104
- namespaces contain only the default export. The runtime-neutral `parseGeneratorModule` remains
105
- available from `/runtime`. Invalid envelopes throw `TypeError`. Package validation exposes MetaMesh
106
- issues and errors, keeping its schema-library adapters private.
107
-
108
- Worker model statistics use `signedVolume` in mm³. `generateMs` measures the engine run;
109
- `timings.totalMs` measures the host workflow and includes stages outside the engine.
110
- `byteCount` counts finalized world-space position and index buffer bytes, counting shared buffers
111
- once; it does not measure the local buffers transferred by a Worker.
112
- Timing stages are optional; hosts report the phases they actually measure. The parameter-processing
113
- stage is `paramsMs` and finalization is `finalizeMs`.
114
-
115
- For Worker hosts, `/modeling` supplies `ModelDeliveryEncoder` and `toWorldMeshes`; `/runtime`
116
- supplies `PartDeliveryDecoder`. Transfers carry local buffers under `geometry`, with placement
117
- beside them. Decode resource references before application use and convert to world meshes before
118
- export. Receiving hosts own the buffers and keep them immutable and attached.
111
+ Hosts can validate before loading assets, but execution still checks the supplied values.
112
+ Modeling hosts use `parseGeneratorModel(value, definition)` from `/modeling` to validate a loaded
113
+ module and infer its executable `GeneratorModel<typeof definition>` type. Pass the default export
114
+ itself for local entries that also export their definition; packaged namespaces contain only the
115
+ default export. Use `parseGeneratorModule` from `/runtime` when you don't need the Modeling adapter.
116
+ Invalid module envelopes throw `TypeError`; package validation reports MetaMesh issues and errors.
117
+
118
+ For Worker hosts, `/modeling` supplies `ModelDeliveryEncoder`; `/runtime` supplies `PartDeliveryDecoder`.
119
+ Transfers carry local buffers under `geometry`, with placement beside them. Decode resource
120
+ references before application use or export. Receiving hosts own the buffers and keep them immutable
121
+ and attached.
122
+
123
+ Model statistics use `signedVolume` in mm³. `generateMs` measures the engine run;
124
+ `timings.totalMs` covers the host workflow, including stages outside the engine. Hosts report only
125
+ the timing stages they measure, using `paramsMs` for parameter processing and `finalizeMs` for
126
+ finalization. `byteCount` counts finalized world-space position and index buffer bytes, counting
127
+ shared buffers once; it doesn't measure the local buffers transferred by a Worker.
119
128
 
120
129
  ## API entry points
121
130
 
@@ -87,7 +87,7 @@ and `items.ui.step`.
87
87
  A Font value contains the selected face and weight. Pass the whole value, rather than a family-name
88
88
  string, in `services.text.layout(text, { font, fontSize })` inside generation, then pass its layout to
89
89
  `textSection(layout)`. Studio loads declared fonts before generation. See the
90
- [text recipe](https://metamesh.studio/docs/develop/geometry-recipes#text-from-a-font-parameter) for the setup and offline
90
+ [text recipe](https://metamesh.studio/docs/develop/svg-and-text#text-from-a-font-parameter) for the setup and offline
91
91
  limits.
92
92
 
93
93
  ## Show controls side by side
@@ -269,7 +269,7 @@ with a `parameterId` and positive `factor`, such as `{ "parameterId": "width", "
269
269
  Bindings describe the coordinate envelope; they never rescale the saved value. Without them,
270
270
  the editor displays percentages.
271
271
 
272
- Inside generation or a computed value, pass `params.crossSection` to
272
+ Inside generation or a memo helper, pass `params.crossSection` to
273
273
  [`sampleContour()`](https://metamesh.studio/docs/reference/geometry/sampleContour) with physical `widthScale`,
274
274
  `heightScale`, and a millimetre resolution policy. It returns an immutable counterclockwise
275
275
  XY `Contour` without a duplicated seam, rejecting invalid sampled topology and exhausted budgets.
@@ -382,10 +382,10 @@ than your model's recommended minimum. A zero wall stops generation; a 0.5 mm wa
382
382
  with a warning. Choose that minimum for the model and manufacturing process. A failed edit leaves
383
383
  the last valid preview and its export available. Warnings allow a current model to generate and export.
384
384
 
385
- Checks follow JavaScript order: reading a computed value evaluates it when needed, and measuring
385
+ Checks follow JavaScript order: `memo` calls run their helper on a cache miss, and measuring
386
386
  geometry evaluates its input first. Draft validation checks declarations and reached assertions
387
- without finalizing parts; it doesn't prove full geometric validity. Use optional `computed`
388
- values to reuse expensive layouts or shared calculations across unrelated edits. There is no
387
+ without finalizing parts; it doesn't prove full geometric validity. Use optional `memo`
388
+ calls to reuse expensive layouts or shared calculations across unrelated edits. There is no
389
389
  separate preparation callback.
390
390
 
391
391
  ## Test the definition as a contract
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "formatVersion": 1,
3
3
  "packageName": "@metamesh/generator-sdk",
4
- "packageVersion": "0.18.0",
4
+ "packageVersion": "0.19.0",
5
5
  "documents": [
6
6
  {
7
7
  "id": "sdk/guide/authoring",
@@ -1144,20 +1144,6 @@
1144
1144
  "parseGeneratorModel"
1145
1145
  ]
1146
1146
  },
1147
- {
1148
- "id": "sdk/reference/modeling/toWorldMeshes",
1149
- "title": "toWorldMeshes",
1150
- "summary": "Converts received local geometry and placement into owned world meshes for manufacturing export.",
1151
- "path": "reference/modeling/toWorldMeshes.md",
1152
- "importPath": "@metamesh/generator-sdk/modeling",
1153
- "availability": "Portable Generator contracts",
1154
- "canonical": "https://metamesh.studio/docs/develop/agent-authoring#generator-entries",
1155
- "keywords": [
1156
- "reference",
1157
- "modeling",
1158
- "toWorldMeshes"
1159
- ]
1160
- },
1161
1147
  {
1162
1148
  "id": "sdk/reference/packages/compareSemanticVersions",
1163
1149
  "title": "compareSemanticVersions",
@@ -1900,62 +1886,6 @@
1900
1886
  "ExecuteGeneratorOptions"
1901
1887
  ]
1902
1888
  },
1903
- {
1904
- "id": "sdk/reference/runtime/Export3mfRequest",
1905
- "title": "Export3mfRequest",
1906
- "summary": "Export3mfRequest exported from @metamesh/generator-sdk/runtime.",
1907
- "path": "reference/runtime/Export3mfRequest.md",
1908
- "importPath": "@metamesh/generator-sdk/runtime",
1909
- "availability": "Portable Generator contracts",
1910
- "canonical": "https://metamesh.studio/docs/develop/agent-authoring#generator-entries",
1911
- "keywords": [
1912
- "reference",
1913
- "runtime",
1914
- "Export3mfRequest"
1915
- ]
1916
- },
1917
- {
1918
- "id": "sdk/reference/runtime/ExportedFile",
1919
- "title": "ExportedFile",
1920
- "summary": "ExportedFile exported from @metamesh/generator-sdk/runtime.",
1921
- "path": "reference/runtime/ExportedFile.md",
1922
- "importPath": "@metamesh/generator-sdk/runtime",
1923
- "availability": "Portable Generator contracts",
1924
- "canonical": "https://metamesh.studio/docs/develop/agent-authoring#generator-entries",
1925
- "keywords": [
1926
- "reference",
1927
- "runtime",
1928
- "ExportedFile"
1929
- ]
1930
- },
1931
- {
1932
- "id": "sdk/reference/runtime/ExportError",
1933
- "title": "ExportError",
1934
- "summary": "ExportError exported from @metamesh/generator-sdk/runtime.",
1935
- "path": "reference/runtime/ExportError.md",
1936
- "importPath": "@metamesh/generator-sdk/runtime",
1937
- "availability": "Portable Generator contracts",
1938
- "canonical": "https://metamesh.studio/docs/develop/agent-authoring#generator-entries",
1939
- "keywords": [
1940
- "reference",
1941
- "runtime",
1942
- "ExportError"
1943
- ]
1944
- },
1945
- {
1946
- "id": "sdk/reference/runtime/ExportSuccess",
1947
- "title": "ExportSuccess",
1948
- "summary": "ExportSuccess exported from @metamesh/generator-sdk/runtime.",
1949
- "path": "reference/runtime/ExportSuccess.md",
1950
- "importPath": "@metamesh/generator-sdk/runtime",
1951
- "availability": "Portable Generator contracts",
1952
- "canonical": "https://metamesh.studio/docs/develop/agent-authoring#generator-entries",
1953
- "keywords": [
1954
- "reference",
1955
- "runtime",
1956
- "ExportSuccess"
1957
- ]
1958
- },
1959
1889
  {
1960
1890
  "id": "sdk/reference/runtime/GenerateRequest",
1961
1891
  "title": "GenerateRequest",
@@ -2,7 +2,7 @@
2
2
 
3
3
  An immutable catalog face; revision is the SHA-256 digest of the complete font file.
4
4
 
5
- Import from `@metamesh/generator-sdk/fonts` (@metamesh/generator-sdk@0.18.0).
5
+ Import from `@metamesh/generator-sdk/fonts` (@metamesh/generator-sdk@0.19.0).
6
6
 
7
7
  ```ts
8
8
  /** An immutable catalog face; revision is the SHA-256 digest of the complete font file. */
@@ -2,7 +2,7 @@
2
2
 
3
3
  Checks only the portable value, without consulting a catalog or substituting fonts.
4
4
 
5
- Import from `@metamesh/generator-sdk/fonts` (@metamesh/generator-sdk@0.18.0).
5
+ Import from `@metamesh/generator-sdk/fonts` (@metamesh/generator-sdk@0.19.0).
6
6
 
7
7
  ```ts
8
8
  /** Checks only the portable value, without consulting a catalog or substituting fonts. */
@@ -2,7 +2,7 @@
2
2
 
3
3
  ArrayParameterDefinition exported from @metamesh/generator-sdk.
4
4
 
5
- Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.18.0).
5
+ Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.19.0).
6
6
 
7
7
  ```ts
8
8
  export interface ArrayParameterDefinition extends ArrayParameterBase {
@@ -2,7 +2,7 @@
2
2
 
3
3
  BaseParameterDefinition exported from @metamesh/generator-sdk.
4
4
 
5
- Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.18.0).
5
+ Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.19.0).
6
6
 
7
7
  ```ts
8
8
  export interface BaseParameterDefinition {
@@ -2,7 +2,7 @@
2
2
 
3
3
  BooleanParameterDefinition exported from @metamesh/generator-sdk.
4
4
 
5
- Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.18.0).
5
+ Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.19.0).
6
6
 
7
7
  ```ts
8
8
  export interface BooleanParameterDefinition extends BaseParameterDefinition {
@@ -2,7 +2,7 @@
2
2
 
3
3
  ChoiceOption exported from @metamesh/generator-sdk.
4
4
 
5
- Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.18.0).
5
+ Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.19.0).
6
6
 
7
7
  ```ts
8
8
  export interface ChoiceOption {
@@ -2,7 +2,7 @@
2
2
 
3
3
  ChoiceParameterDefinition exported from @metamesh/generator-sdk.
4
4
 
5
- Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.18.0).
5
+ Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.19.0).
6
6
 
7
7
  ```ts
8
8
  export interface ChoiceParameterDefinition extends BaseParameterDefinition {
@@ -2,7 +2,7 @@
2
2
 
3
3
  ChoiceSetParameterDefinition exported from @metamesh/generator-sdk.
4
4
 
5
- Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.18.0).
5
+ Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.19.0).
6
6
 
7
7
  ```ts
8
8
  export interface ChoiceSetParameterDefinition extends BaseParameterDefinition {
@@ -2,7 +2,7 @@
2
2
 
3
3
  ColorParameterDefinition exported from @metamesh/generator-sdk.
4
4
 
5
- Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.18.0).
5
+ Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.19.0).
6
6
 
7
7
  ```ts
8
8
  export interface ColorParameterDefinition extends BaseParameterDefinition {
@@ -2,7 +2,7 @@
2
2
 
3
3
  ConditionExpression exported from @metamesh/generator-sdk.
4
4
 
5
- Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.18.0).
5
+ Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.19.0).
6
6
 
7
7
  ```ts
8
8
  export type ConditionExpression = {
@@ -2,7 +2,7 @@
2
2
 
3
3
  Editing intent accompanies the explicit curve controls; no tangent is inferred at runtime.
4
4
 
5
- Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.18.0).
5
+ Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.19.0).
6
6
 
7
7
  ```ts
8
8
  /** Editing intent accompanies the explicit curve controls; no tangent is inferred at runtime. */
@@ -2,7 +2,7 @@
2
2
 
3
3
  ContourParameterDefinition exported from @metamesh/generator-sdk.
4
4
 
5
- Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.18.0).
5
+ Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.19.0).
6
6
 
7
7
  ```ts
8
8
  export interface ContourParameterDefinition extends BaseParameterDefinition {
@@ -2,7 +2,7 @@
2
2
 
3
3
  ContourParameterUi exported from @metamesh/generator-sdk.
4
4
 
5
- Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.18.0).
5
+ Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.19.0).
6
6
 
7
7
  ```ts
8
8
  export interface ContourParameterUi extends ParameterUi {
@@ -2,7 +2,7 @@
2
2
 
3
3
  Normalized planar coordinates, with X rightward and Y upward, in the unit square.
4
4
 
5
- Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.18.0).
5
+ Import from `@metamesh/generator-sdk` (@metamesh/generator-sdk@0.19.0).
6
6
 
7
7
  ```ts
8
8
  /** Normalized planar coordinates, with X rightward and Y upward, in the unit square. */