@kubohiroya/turbowarp-teachable-machine 3.5.0 → 3.5.2
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/README.md +17 -6
- package/dist/backend-wasm.js +1 -1
- package/dist/backend-webgpu.js +1 -1
- package/dist/composition.js +666 -8
- package/dist/posenet.js +15 -6
- package/dist/runtime.js +3 -3
- package/dist/tm.js +2723 -2028
- package/dist/types/extension.d.ts +7 -0
- package/dist/types/fixed-input-editors.d.ts +7 -0
- package/dist/types/fixed-input-schema.d.ts +142 -0
- package/docs/fixed-input-editors.ja.md +36 -0
- package/package.json +15 -6
- package/schemas/block-editor-fixed-inputs.schema.json +193 -0
|
@@ -76,6 +76,7 @@ export declare function initializeCameraReadbackContext(canvas: unknown, _tensor
|
|
|
76
76
|
export declare class TMExtension {
|
|
77
77
|
[key: string]: any;
|
|
78
78
|
constructor(featureFlags?: Partial<FeatureFlags>, dependencies?: TMExtensionDependencies);
|
|
79
|
+
private readonly fixedEditors;
|
|
79
80
|
getInfo(): {
|
|
80
81
|
id: string;
|
|
81
82
|
name: any;
|
|
@@ -283,6 +284,12 @@ export declare class TMExtension {
|
|
|
283
284
|
* that flag flips the returned keypoints, not the image, and the classifier head was trained on
|
|
284
285
|
* mirrored frames. Flipping the pixels is what keeps the model's input the same as before.
|
|
285
286
|
*
|
|
287
|
+
* The WASM and CPU backends have no texture to upload to, so `fromPixels` reads the frame back
|
|
288
|
+
* through Canvas2D there and this path loses its advantage -- but not its correctness. Driving
|
|
289
|
+
* one deterministic frame through every backend returns the same probabilities to two decimals
|
|
290
|
+
* (webgl / wasm / cpu: 0.08, 0.90, 0.02, 0.00) and `tf.memory().numTensors` stays flat over a
|
|
291
|
+
* six-second run on each, so nothing here depends on which backend `compute-backend.ts` picked.
|
|
292
|
+
*
|
|
286
293
|
* Returns null when there is no frame to take, and the canvas path answers instead.
|
|
287
294
|
*/
|
|
288
295
|
captureSquareFrame(): {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { FixedInputEditorOptions } from '@kubohiroya/turbowarp-extension-data-editor';
|
|
2
|
+
export declare const fixedInputEditors: readonly FixedInputEditorOptions[];
|
|
3
|
+
/** Register only currently declared opcodes; release obsolete feature-flag scopes. */
|
|
4
|
+
export declare function fixedInputRegistration(scratch: unknown): {
|
|
5
|
+
ensure(opcodes: readonly string[]): void;
|
|
6
|
+
dispose: () => void;
|
|
7
|
+
};
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import type { SchemaBundle } from '@kubohiroya/turbowarp-extension-data-editor/schema';
|
|
2
|
+
/** Owner canonical fragments, distinct from older SOURCE/editor schemas. */
|
|
3
|
+
export declare function fixedInputBundle(opcode: string, argument: string): SchemaBundle;
|
|
4
|
+
export declare const fixedSchemas: {
|
|
5
|
+
setRecognitionMode: {
|
|
6
|
+
type: string;
|
|
7
|
+
properties: {
|
|
8
|
+
MODE: {
|
|
9
|
+
type: string;
|
|
10
|
+
enum: string[];
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
setComputeMode: {
|
|
15
|
+
type: string;
|
|
16
|
+
properties: {
|
|
17
|
+
MODE: {
|
|
18
|
+
type: string;
|
|
19
|
+
enum: string[];
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
setPreviewOpacity: {
|
|
24
|
+
type: string;
|
|
25
|
+
properties: {
|
|
26
|
+
OPACITY: {
|
|
27
|
+
type: string;
|
|
28
|
+
$comment: string;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
setPreviewPosition: {
|
|
33
|
+
type: string;
|
|
34
|
+
properties: {
|
|
35
|
+
POSITION: {
|
|
36
|
+
type: string;
|
|
37
|
+
enum: string[];
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
setPreviewMirroring: {
|
|
42
|
+
type: string;
|
|
43
|
+
properties: {
|
|
44
|
+
MIRRORING: {
|
|
45
|
+
type: string;
|
|
46
|
+
enum: string[];
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
setPoseOverlayVisibility: {
|
|
51
|
+
type: string;
|
|
52
|
+
properties: {
|
|
53
|
+
VISIBILITY: {
|
|
54
|
+
type: string;
|
|
55
|
+
enum: string[];
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
setPoseJointStyle: {
|
|
60
|
+
type: string;
|
|
61
|
+
properties: {
|
|
62
|
+
PART: {
|
|
63
|
+
type: string;
|
|
64
|
+
enum: string[];
|
|
65
|
+
};
|
|
66
|
+
OPACITY: {
|
|
67
|
+
type: string;
|
|
68
|
+
$comment: string;
|
|
69
|
+
};
|
|
70
|
+
RADIUS: {
|
|
71
|
+
type: string;
|
|
72
|
+
$comment: string;
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
setPoseBoneStyle: {
|
|
77
|
+
type: string;
|
|
78
|
+
properties: {
|
|
79
|
+
OPACITY: {
|
|
80
|
+
type: string;
|
|
81
|
+
$comment: string;
|
|
82
|
+
};
|
|
83
|
+
WIDTH: {
|
|
84
|
+
type: string;
|
|
85
|
+
$comment: string;
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
setPoseOverlayMinimumConfidence: {
|
|
90
|
+
type: string;
|
|
91
|
+
properties: {
|
|
92
|
+
CONFIDENCE: {
|
|
93
|
+
type: string;
|
|
94
|
+
$comment: string;
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
setPoseConfidenceScaling: {
|
|
99
|
+
type: string;
|
|
100
|
+
properties: {
|
|
101
|
+
PROPERTY: {
|
|
102
|
+
type: string;
|
|
103
|
+
enum: string[];
|
|
104
|
+
};
|
|
105
|
+
STATE: {
|
|
106
|
+
type: string;
|
|
107
|
+
enum: string[];
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
setAccumulatedPoseParameters: {
|
|
112
|
+
type: string;
|
|
113
|
+
properties: {
|
|
114
|
+
ACCUMULATION: {
|
|
115
|
+
type: string;
|
|
116
|
+
$comment: string;
|
|
117
|
+
};
|
|
118
|
+
DECAY: {
|
|
119
|
+
type: string;
|
|
120
|
+
$comment: string;
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
};
|
|
124
|
+
setAccumulatedPoseThreshold: {
|
|
125
|
+
type: string;
|
|
126
|
+
properties: {
|
|
127
|
+
THRESHOLD: {
|
|
128
|
+
type: string;
|
|
129
|
+
$comment: string;
|
|
130
|
+
};
|
|
131
|
+
};
|
|
132
|
+
};
|
|
133
|
+
isPoseWithThreshold: {
|
|
134
|
+
type: string;
|
|
135
|
+
properties: {
|
|
136
|
+
THRESHOLD: {
|
|
137
|
+
type: string;
|
|
138
|
+
$comment: string;
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
};
|
|
142
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# 固定入力エディターの契約
|
|
2
|
+
|
|
3
|
+
対応GUIの起動時に`blockEditorDialogs=1&blockEditorFixedInputs=1`を指定して再読込した場合だけ利用できる。固定入力フラグは既定OFF。旧GUIにoptional登録APIがなければ既存動作を維持する。
|
|
4
|
+
|
|
5
|
+
| ブロック | 引数 | UI |
|
|
6
|
+
|---|---|---|
|
|
7
|
+
| `setRecognitionMode` | `MODE` | enum |
|
|
8
|
+
| `setComputeMode` | `MODE` | enum |
|
|
9
|
+
| `setPreviewOpacity` | `OPACITY` | number |
|
|
10
|
+
| `setPreviewPosition` | `POSITION` | enum |
|
|
11
|
+
| `setPreviewMirroring` | `MIRRORING` | enum |
|
|
12
|
+
| `setPoseOverlayVisibility` | `VISIBILITY` | enum |
|
|
13
|
+
| `setPoseJointStyle` | `PART` | enum |
|
|
14
|
+
| `setPoseJointStyle` | `OPACITY` | number |
|
|
15
|
+
| `setPoseJointStyle` | `RADIUS` | number |
|
|
16
|
+
| `setPoseBoneStyle` | `OPACITY` | number |
|
|
17
|
+
| `setPoseBoneStyle` | `WIDTH` | number |
|
|
18
|
+
| `setPoseOverlayMinimumConfidence` | `CONFIDENCE` | number |
|
|
19
|
+
| `setPoseConfidenceScaling` | `PROPERTY` | enum |
|
|
20
|
+
| `setPoseConfidenceScaling` | `STATE` | enum |
|
|
21
|
+
| `setAccumulatedPoseParameters` | `ACCUMULATION` | number |
|
|
22
|
+
| `setAccumulatedPoseParameters` | `DECAY` | number |
|
|
23
|
+
| `setAccumulatedPoseThreshold` | `THRESHOLD` | number |
|
|
24
|
+
| `isPoseWithThreshold` | `THRESHOLD` | number |
|
|
25
|
+
|
|
26
|
+
recognition/compute/preview/poseの固定選択と数値だけを対象とし、モデルload、カメラ、デバイス列挙、GPU利用可否の探索は行わない。POSITIONの日本語alias、recognition/mirroring/compute/on-offの既知aliasは表示投影のみ。PoseNet PARTはcamelCaseを維持しMotion Captureのsnake_caseと統合しない。finiteな新数値には既存runtimeのclamp/floorをそのまま残し、保存rawをclampしない。poseOverlay/temporalPoseScoringで実getInfoから消えたopcodeの登録を除去し、現れるopcodeだけ再登録する。元のownerフラグ既定値は変更しない。
|
|
27
|
+
|
|
28
|
+
Schemaの正本は`schemas/block-editor-fixed-inputs.schema.json`。各登録は実在する`#/$defs/<opcode>/properties/<argument>` fragmentをsourceとして保持し、旧SOURCE Schemaと区別する。`src/extension.ts`およびpure normalizerがruntime契約の正本であり、UI候補や棚卸しだけを受理根拠にしない。外部Schema取得を行わない。
|
|
29
|
+
|
|
30
|
+
新number入力にはNP-finite-new-input-v1を適用し、有限なJSON数値表記だけを保存する。既存rawは未編集ならalias・空白・未知値・旧数値表記もそのまま保持し、表示投影では書き換えない。空白や非有限など投影不能な旧値は読取専用で、明示的な有効値への修復だけを許す。接続reporterは評価・置換しない。対象外の引数はpatchしない。
|
|
31
|
+
|
|
32
|
+
同じ画面では未保存draftと無効bufferを保持し、保存失敗後も保持する。取消・dispose・project/target/登録失効で破棄し、再openは現在rawから始める。getInfoに存在するopcodeだけ登録し、APIまたはopcode集合の変化ではcleanupして再登録する。部分登録失敗・runtime終了・disposeでcleanupする。
|
|
33
|
+
|
|
34
|
+
共通依存はGit commit `485f0e550e622235624b5e9176820161aeeba252`へmanifest・lock・実解決を揃える。型とpure数値parserだけを利用し、runtime bundleと公開型の依存閉包をpack consumerで確認する。既存SourceForms/Descendantsと共存する。
|
|
35
|
+
|
|
36
|
+
切戻しは固定入力フラグをOFFにして再読込する。依存を戻すときはmanifest・lock・実解決を一組で戻す。旧sb3の移行は不要。ローカル検証のみで、commit・push・Issue・PR・merge・Pages・npm公開を含まない。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kubohiroya/turbowarp-teachable-machine",
|
|
3
|
-
"version": "3.5.
|
|
3
|
+
"version": "3.5.2",
|
|
4
4
|
"description": "A TurboWarp extension for recognition using Teachable Machine pose, image, and audio models.",
|
|
5
5
|
"author": "Hiroya Kubo <hiroya@cuc.ac.jp>",
|
|
6
6
|
"license": "MPL-2.0",
|
|
@@ -34,7 +34,9 @@
|
|
|
34
34
|
"dist/",
|
|
35
35
|
"README.md",
|
|
36
36
|
"LICENSE",
|
|
37
|
-
"THIRD_PARTY_NOTICES.md"
|
|
37
|
+
"THIRD_PARTY_NOTICES.md",
|
|
38
|
+
"schemas/",
|
|
39
|
+
"docs/fixed-input-editors.ja.md"
|
|
38
40
|
],
|
|
39
41
|
"unpkg": "./dist/tm.js",
|
|
40
42
|
"jsdelivr": "./dist/tm.js",
|
|
@@ -72,8 +74,8 @@
|
|
|
72
74
|
"prepack": "npm run build && npm run release:consistency:check"
|
|
73
75
|
},
|
|
74
76
|
"devDependencies": {
|
|
75
|
-
"@kubohiroya/turbowarp-camera-source": "0.
|
|
76
|
-
"@kubohiroya/vite-plugin-turbowarp-extension": "0.
|
|
77
|
+
"@kubohiroya/turbowarp-camera-source": "0.17.1",
|
|
78
|
+
"@kubohiroya/vite-plugin-turbowarp-extension": "0.6.1",
|
|
77
79
|
"@teachablemachine/image": "0.8.5",
|
|
78
80
|
"@teachablemachine/pose": "0.8.6",
|
|
79
81
|
"@tensorflow-models/posenet": "2.2.2",
|
|
@@ -84,7 +86,8 @@
|
|
|
84
86
|
"@types/node": "^22.20.1",
|
|
85
87
|
"typescript": "^5.9.3",
|
|
86
88
|
"vite": "^8.2.2",
|
|
87
|
-
"vitest": "^4.0.14"
|
|
89
|
+
"vitest": "^4.0.14",
|
|
90
|
+
"@kubohiroya/turbowarp-extension-data-editor": "0.2.1"
|
|
88
91
|
},
|
|
89
92
|
"keywords": [
|
|
90
93
|
"turbowarp",
|
|
@@ -95,5 +98,11 @@
|
|
|
95
98
|
"audio",
|
|
96
99
|
"camera",
|
|
97
100
|
"teachable-machine"
|
|
98
|
-
]
|
|
101
|
+
],
|
|
102
|
+
"gitHead": "97ef12018789316d6170a7aab29d7c5b0a4c90f4",
|
|
103
|
+
"x-turbowarp-source": {
|
|
104
|
+
"revision": "97ef12018789316d6170a7aab29d7c5b0a4c90f4",
|
|
105
|
+
"revisionRole": "base-commit",
|
|
106
|
+
"sourceState": "local-release-overlay"
|
|
107
|
+
}
|
|
99
108
|
}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://kubohiroya.github.io/turbowarp-teachable-machine/schemas/block-editor-fixed-inputs.schema.json",
|
|
4
|
+
"title": "turbowarp-teachable-machine fixed input registration schema",
|
|
5
|
+
"$defs": {
|
|
6
|
+
"setRecognitionMode": {
|
|
7
|
+
"type": "object",
|
|
8
|
+
"properties": {
|
|
9
|
+
"MODE": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"enum": [
|
|
12
|
+
"pose",
|
|
13
|
+
"image",
|
|
14
|
+
"audio"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"setComputeMode": {
|
|
20
|
+
"type": "object",
|
|
21
|
+
"properties": {
|
|
22
|
+
"MODE": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"enum": [
|
|
25
|
+
"auto",
|
|
26
|
+
"webgpu",
|
|
27
|
+
"webgl",
|
|
28
|
+
"wasm",
|
|
29
|
+
"cpu"
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"setPreviewOpacity": {
|
|
35
|
+
"type": "object",
|
|
36
|
+
"properties": {
|
|
37
|
+
"OPACITY": {
|
|
38
|
+
"type": "number",
|
|
39
|
+
"$comment": "New finite numeric input uses NP-finite-new-input-v1. Existing raw is preserved on no-op; runtime clamp/floor is not applied to stored raw."
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"setPreviewPosition": {
|
|
44
|
+
"type": "object",
|
|
45
|
+
"properties": {
|
|
46
|
+
"POSITION": {
|
|
47
|
+
"type": "string",
|
|
48
|
+
"enum": [
|
|
49
|
+
"top-left",
|
|
50
|
+
"top-right",
|
|
51
|
+
"bottom-left",
|
|
52
|
+
"bottom-right",
|
|
53
|
+
"center",
|
|
54
|
+
"full-stage"
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"setPreviewMirroring": {
|
|
60
|
+
"type": "object",
|
|
61
|
+
"properties": {
|
|
62
|
+
"MIRRORING": {
|
|
63
|
+
"type": "string",
|
|
64
|
+
"enum": [
|
|
65
|
+
"mirrored",
|
|
66
|
+
"unmirrored"
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"setPoseOverlayVisibility": {
|
|
72
|
+
"type": "object",
|
|
73
|
+
"properties": {
|
|
74
|
+
"VISIBILITY": {
|
|
75
|
+
"type": "string",
|
|
76
|
+
"enum": [
|
|
77
|
+
"on",
|
|
78
|
+
"off"
|
|
79
|
+
]
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
"setPoseJointStyle": {
|
|
84
|
+
"type": "object",
|
|
85
|
+
"properties": {
|
|
86
|
+
"PART": {
|
|
87
|
+
"type": "string",
|
|
88
|
+
"enum": [
|
|
89
|
+
"nose",
|
|
90
|
+
"leftEye",
|
|
91
|
+
"rightEye",
|
|
92
|
+
"leftEar",
|
|
93
|
+
"rightEar",
|
|
94
|
+
"leftShoulder",
|
|
95
|
+
"rightShoulder",
|
|
96
|
+
"leftElbow",
|
|
97
|
+
"rightElbow",
|
|
98
|
+
"leftWrist",
|
|
99
|
+
"rightWrist",
|
|
100
|
+
"leftHip",
|
|
101
|
+
"rightHip",
|
|
102
|
+
"leftKnee",
|
|
103
|
+
"rightKnee",
|
|
104
|
+
"leftAnkle",
|
|
105
|
+
"rightAnkle"
|
|
106
|
+
]
|
|
107
|
+
},
|
|
108
|
+
"OPACITY": {
|
|
109
|
+
"type": "number",
|
|
110
|
+
"$comment": "New finite numeric input uses NP-finite-new-input-v1. Existing raw is preserved on no-op; runtime clamp/floor is not applied to stored raw."
|
|
111
|
+
},
|
|
112
|
+
"RADIUS": {
|
|
113
|
+
"type": "number",
|
|
114
|
+
"$comment": "New finite numeric input uses NP-finite-new-input-v1. Existing raw is preserved on no-op; runtime clamp/floor is not applied to stored raw."
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
"setPoseBoneStyle": {
|
|
119
|
+
"type": "object",
|
|
120
|
+
"properties": {
|
|
121
|
+
"OPACITY": {
|
|
122
|
+
"type": "number",
|
|
123
|
+
"$comment": "New finite numeric input uses NP-finite-new-input-v1. Existing raw is preserved on no-op; runtime clamp/floor is not applied to stored raw."
|
|
124
|
+
},
|
|
125
|
+
"WIDTH": {
|
|
126
|
+
"type": "number",
|
|
127
|
+
"$comment": "New finite numeric input uses NP-finite-new-input-v1. Existing raw is preserved on no-op; runtime clamp/floor is not applied to stored raw."
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
"setPoseOverlayMinimumConfidence": {
|
|
132
|
+
"type": "object",
|
|
133
|
+
"properties": {
|
|
134
|
+
"CONFIDENCE": {
|
|
135
|
+
"type": "number",
|
|
136
|
+
"$comment": "New finite numeric input uses NP-finite-new-input-v1. Existing raw is preserved on no-op; runtime clamp/floor is not applied to stored raw."
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
"setPoseConfidenceScaling": {
|
|
141
|
+
"type": "object",
|
|
142
|
+
"properties": {
|
|
143
|
+
"PROPERTY": {
|
|
144
|
+
"type": "string",
|
|
145
|
+
"enum": [
|
|
146
|
+
"joint-opacity",
|
|
147
|
+
"joint-radius",
|
|
148
|
+
"bone-opacity",
|
|
149
|
+
"bone-width"
|
|
150
|
+
]
|
|
151
|
+
},
|
|
152
|
+
"STATE": {
|
|
153
|
+
"type": "string",
|
|
154
|
+
"enum": [
|
|
155
|
+
"on",
|
|
156
|
+
"off"
|
|
157
|
+
]
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
"setAccumulatedPoseParameters": {
|
|
162
|
+
"type": "object",
|
|
163
|
+
"properties": {
|
|
164
|
+
"ACCUMULATION": {
|
|
165
|
+
"type": "number",
|
|
166
|
+
"$comment": "New finite numeric input uses NP-finite-new-input-v1. Existing raw is preserved on no-op; runtime clamp/floor is not applied to stored raw."
|
|
167
|
+
},
|
|
168
|
+
"DECAY": {
|
|
169
|
+
"type": "number",
|
|
170
|
+
"$comment": "New finite numeric input uses NP-finite-new-input-v1. Existing raw is preserved on no-op; runtime clamp/floor is not applied to stored raw."
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
"setAccumulatedPoseThreshold": {
|
|
175
|
+
"type": "object",
|
|
176
|
+
"properties": {
|
|
177
|
+
"THRESHOLD": {
|
|
178
|
+
"type": "number",
|
|
179
|
+
"$comment": "New finite numeric input uses NP-finite-new-input-v1. Existing raw is preserved on no-op; runtime clamp/floor is not applied to stored raw."
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
"isPoseWithThreshold": {
|
|
184
|
+
"type": "object",
|
|
185
|
+
"properties": {
|
|
186
|
+
"THRESHOLD": {
|
|
187
|
+
"type": "number",
|
|
188
|
+
"$comment": "New finite numeric input uses NP-finite-new-input-v1. Existing raw is preserved on no-op; runtime clamp/floor is not applied to stored raw."
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|