@extentos/mcp-server 0.0.1

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 (202) hide show
  1. package/README.md +56 -0
  2. package/dist/cli/login.d.ts +2 -0
  3. package/dist/cli/login.d.ts.map +1 -0
  4. package/dist/cli/login.js +71 -0
  5. package/dist/cli/login.js.map +1 -0
  6. package/dist/cli/logout.d.ts +2 -0
  7. package/dist/cli/logout.d.ts.map +1 -0
  8. package/dist/cli/logout.js +65 -0
  9. package/dist/cli/logout.js.map +1 -0
  10. package/dist/cli/privacy.d.ts +3 -0
  11. package/dist/cli/privacy.d.ts.map +1 -0
  12. package/dist/cli/privacy.js +39 -0
  13. package/dist/cli/privacy.js.map +1 -0
  14. package/dist/cli/status.d.ts +2 -0
  15. package/dist/cli/status.d.ts.map +1 -0
  16. package/dist/cli/status.js +9 -0
  17. package/dist/cli/status.js.map +1 -0
  18. package/dist/cli/update.d.ts +2 -0
  19. package/dist/cli/update.d.ts.map +1 -0
  20. package/dist/cli/update.js +8 -0
  21. package/dist/cli/update.js.map +1 -0
  22. package/dist/cli/whoami.d.ts +2 -0
  23. package/dist/cli/whoami.d.ts.map +1 -0
  24. package/dist/cli/whoami.js +8 -0
  25. package/dist/cli/whoami.js.map +1 -0
  26. package/dist/cli.d.ts +3 -0
  27. package/dist/cli.d.ts.map +1 -0
  28. package/dist/cli.js +69 -0
  29. package/dist/cli.js.map +1 -0
  30. package/dist/generated/schemas.d.ts +4 -0
  31. package/dist/generated/schemas.d.ts.map +1 -0
  32. package/dist/generated/schemas.js +2697 -0
  33. package/dist/generated/schemas.js.map +1 -0
  34. package/dist/index.d.ts +3 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +69 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/stub.d.ts +15 -0
  39. package/dist/stub.d.ts.map +1 -0
  40. package/dist/stub.js +20 -0
  41. package/dist/stub.js.map +1 -0
  42. package/dist/telemetry/client.d.ts +73 -0
  43. package/dist/telemetry/client.d.ts.map +1 -0
  44. package/dist/telemetry/client.js +207 -0
  45. package/dist/telemetry/client.js.map +1 -0
  46. package/dist/telemetry/consent.d.ts +19 -0
  47. package/dist/telemetry/consent.d.ts.map +1 -0
  48. package/dist/telemetry/consent.js +68 -0
  49. package/dist/telemetry/consent.js.map +1 -0
  50. package/dist/telemetry/index.d.ts +56 -0
  51. package/dist/telemetry/index.d.ts.map +1 -0
  52. package/dist/telemetry/index.js +151 -0
  53. package/dist/telemetry/index.js.map +1 -0
  54. package/dist/telemetry/installRegistry.d.ts +18 -0
  55. package/dist/telemetry/installRegistry.d.ts.map +1 -0
  56. package/dist/telemetry/installRegistry.js +102 -0
  57. package/dist/telemetry/installRegistry.js.map +1 -0
  58. package/dist/tools/data/capabilities.d.ts +566 -0
  59. package/dist/tools/data/capabilities.d.ts.map +1 -0
  60. package/dist/tools/data/capabilities.js +243 -0
  61. package/dist/tools/data/capabilities.js.map +1 -0
  62. package/dist/tools/data/examplePatterns.d.ts +4 -0
  63. package/dist/tools/data/examplePatterns.d.ts.map +1 -0
  64. package/dist/tools/data/examplePatterns.js +546 -0
  65. package/dist/tools/data/examplePatterns.js.map +1 -0
  66. package/dist/tools/data/presetTriggers.d.ts +4 -0
  67. package/dist/tools/data/presetTriggers.d.ts.map +1 -0
  68. package/dist/tools/data/presetTriggers.js +47 -0
  69. package/dist/tools/data/presetTriggers.js.map +1 -0
  70. package/dist/tools/data/version.d.ts +31 -0
  71. package/dist/tools/data/version.d.ts.map +1 -0
  72. package/dist/tools/data/version.js +34 -0
  73. package/dist/tools/data/version.js.map +1 -0
  74. package/dist/tools/definitions.d.ts +13 -0
  75. package/dist/tools/definitions.d.ts.map +1 -0
  76. package/dist/tools/definitions.js +347 -0
  77. package/dist/tools/definitions.js.map +1 -0
  78. package/dist/tools/docs/index.d.ts +10 -0
  79. package/dist/tools/docs/index.d.ts.map +1 -0
  80. package/dist/tools/docs/index.js +220 -0
  81. package/dist/tools/docs/index.js.map +1 -0
  82. package/dist/tools/handlers/completeAuthLink.d.ts +3 -0
  83. package/dist/tools/handlers/completeAuthLink.d.ts.map +1 -0
  84. package/dist/tools/handlers/completeAuthLink.js +152 -0
  85. package/dist/tools/handlers/completeAuthLink.js.map +1 -0
  86. package/dist/tools/handlers/createSimulatorSession.d.ts +3 -0
  87. package/dist/tools/handlers/createSimulatorSession.d.ts.map +1 -0
  88. package/dist/tools/handlers/createSimulatorSession.js +231 -0
  89. package/dist/tools/handlers/createSimulatorSession.js.map +1 -0
  90. package/dist/tools/handlers/generateConnectionModule.d.ts +3 -0
  91. package/dist/tools/handlers/generateConnectionModule.d.ts.map +1 -0
  92. package/dist/tools/handlers/generateConnectionModule.js +222 -0
  93. package/dist/tools/handlers/generateConnectionModule.js.map +1 -0
  94. package/dist/tools/handlers/generateConsumer.d.ts +3 -0
  95. package/dist/tools/handlers/generateConsumer.d.ts.map +1 -0
  96. package/dist/tools/handlers/generateConsumer.js +257 -0
  97. package/dist/tools/handlers/generateConsumer.js.map +1 -0
  98. package/dist/tools/handlers/getCredentialGuide.d.ts +3 -0
  99. package/dist/tools/handlers/getCredentialGuide.d.ts.map +1 -0
  100. package/dist/tools/handlers/getCredentialGuide.js +296 -0
  101. package/dist/tools/handlers/getCredentialGuide.js.map +1 -0
  102. package/dist/tools/handlers/getEventLog.d.ts +3 -0
  103. package/dist/tools/handlers/getEventLog.d.ts.map +1 -0
  104. package/dist/tools/handlers/getEventLog.js +90 -0
  105. package/dist/tools/handlers/getEventLog.js.map +1 -0
  106. package/dist/tools/handlers/getExampleSpec.d.ts +3 -0
  107. package/dist/tools/handlers/getExampleSpec.d.ts.map +1 -0
  108. package/dist/tools/handlers/getExampleSpec.js +44 -0
  109. package/dist/tools/handlers/getExampleSpec.js.map +1 -0
  110. package/dist/tools/handlers/getPermissions.d.ts +3 -0
  111. package/dist/tools/handlers/getPermissions.d.ts.map +1 -0
  112. package/dist/tools/handlers/getPermissions.js +50 -0
  113. package/dist/tools/handlers/getPermissions.js.map +1 -0
  114. package/dist/tools/handlers/getPlatformInfo.d.ts +3 -0
  115. package/dist/tools/handlers/getPlatformInfo.d.ts.map +1 -0
  116. package/dist/tools/handlers/getPlatformInfo.js +78 -0
  117. package/dist/tools/handlers/getPlatformInfo.js.map +1 -0
  118. package/dist/tools/handlers/getProductionChecklist.d.ts +3 -0
  119. package/dist/tools/handlers/getProductionChecklist.d.ts.map +1 -0
  120. package/dist/tools/handlers/getProductionChecklist.js +238 -0
  121. package/dist/tools/handlers/getProductionChecklist.js.map +1 -0
  122. package/dist/tools/handlers/getSimulatorStatus.d.ts +3 -0
  123. package/dist/tools/handlers/getSimulatorStatus.d.ts.map +1 -0
  124. package/dist/tools/handlers/getSimulatorStatus.js +56 -0
  125. package/dist/tools/handlers/getSimulatorStatus.js.map +1 -0
  126. package/dist/tools/handlers/getVoiceCommandGuidance.d.ts +3 -0
  127. package/dist/tools/handlers/getVoiceCommandGuidance.d.ts.map +1 -0
  128. package/dist/tools/handlers/getVoiceCommandGuidance.js +200 -0
  129. package/dist/tools/handlers/getVoiceCommandGuidance.js.map +1 -0
  130. package/dist/tools/handlers/initSpec.d.ts +3 -0
  131. package/dist/tools/handlers/initSpec.d.ts.map +1 -0
  132. package/dist/tools/handlers/initSpec.js +234 -0
  133. package/dist/tools/handlers/initSpec.js.map +1 -0
  134. package/dist/tools/handlers/inspectIntegration.d.ts +3 -0
  135. package/dist/tools/handlers/inspectIntegration.d.ts.map +1 -0
  136. package/dist/tools/handlers/inspectIntegration.js +204 -0
  137. package/dist/tools/handlers/inspectIntegration.js.map +1 -0
  138. package/dist/tools/handlers/planIntegration.d.ts +3 -0
  139. package/dist/tools/handlers/planIntegration.d.ts.map +1 -0
  140. package/dist/tools/handlers/planIntegration.js +279 -0
  141. package/dist/tools/handlers/planIntegration.js.map +1 -0
  142. package/dist/tools/handlers/searchDocs.d.ts +3 -0
  143. package/dist/tools/handlers/searchDocs.d.ts.map +1 -0
  144. package/dist/tools/handlers/searchDocs.js +41 -0
  145. package/dist/tools/handlers/searchDocs.js.map +1 -0
  146. package/dist/tools/handlers/updateSpec.d.ts +3 -0
  147. package/dist/tools/handlers/updateSpec.d.ts.map +1 -0
  148. package/dist/tools/handlers/updateSpec.js +453 -0
  149. package/dist/tools/handlers/updateSpec.js.map +1 -0
  150. package/dist/tools/handlers/validateIntegration.d.ts +3 -0
  151. package/dist/tools/handlers/validateIntegration.d.ts.map +1 -0
  152. package/dist/tools/handlers/validateIntegration.js +546 -0
  153. package/dist/tools/handlers/validateIntegration.js.map +1 -0
  154. package/dist/tools/handlers/validateSpec.d.ts +3 -0
  155. package/dist/tools/handlers/validateSpec.d.ts.map +1 -0
  156. package/dist/tools/handlers/validateSpec.js +26 -0
  157. package/dist/tools/handlers/validateSpec.js.map +1 -0
  158. package/dist/tools/registry.d.ts +4 -0
  159. package/dist/tools/registry.d.ts.map +1 -0
  160. package/dist/tools/registry.js +43 -0
  161. package/dist/tools/registry.js.map +1 -0
  162. package/dist/tools/response.d.ts +12 -0
  163. package/dist/tools/response.d.ts.map +1 -0
  164. package/dist/tools/response.js +19 -0
  165. package/dist/tools/response.js.map +1 -0
  166. package/dist/tools/templates/androidBootstrap.d.ts +2 -0
  167. package/dist/tools/templates/androidBootstrap.d.ts.map +1 -0
  168. package/dist/tools/templates/androidBootstrap.js +40 -0
  169. package/dist/tools/templates/androidBootstrap.js.map +1 -0
  170. package/dist/tools/templates/callbackHandler.d.ts +11 -0
  171. package/dist/tools/templates/callbackHandler.d.ts.map +1 -0
  172. package/dist/tools/templates/callbackHandler.js +177 -0
  173. package/dist/tools/templates/callbackHandler.js.map +1 -0
  174. package/dist/tools/templates/iosBootstrap.d.ts +3 -0
  175. package/dist/tools/templates/iosBootstrap.d.ts.map +1 -0
  176. package/dist/tools/templates/iosBootstrap.js +50 -0
  177. package/dist/tools/templates/iosBootstrap.js.map +1 -0
  178. package/dist/tools/templates/streamConsumer.d.ts +8 -0
  179. package/dist/tools/templates/streamConsumer.d.ts.map +1 -0
  180. package/dist/tools/templates/streamConsumer.js +248 -0
  181. package/dist/tools/templates/streamConsumer.js.map +1 -0
  182. package/dist/tools/util/appPackage.d.ts +4 -0
  183. package/dist/tools/util/appPackage.d.ts.map +1 -0
  184. package/dist/tools/util/appPackage.js +16 -0
  185. package/dist/tools/util/appPackage.js.map +1 -0
  186. package/dist/tools/util/backendClient.d.ts +25 -0
  187. package/dist/tools/util/backendClient.d.ts.map +1 -0
  188. package/dist/tools/util/backendClient.js +144 -0
  189. package/dist/tools/util/backendClient.js.map +1 -0
  190. package/dist/tools/util/manifest.d.ts +9 -0
  191. package/dist/tools/util/manifest.d.ts.map +1 -0
  192. package/dist/tools/util/manifest.js +62 -0
  193. package/dist/tools/util/manifest.js.map +1 -0
  194. package/dist/tools/util/permissions.d.ts +32 -0
  195. package/dist/tools/util/permissions.d.ts.map +1 -0
  196. package/dist/tools/util/permissions.js +165 -0
  197. package/dist/tools/util/permissions.js.map +1 -0
  198. package/dist/tools/validation/validateSpec.d.ts +22 -0
  199. package/dist/tools/validation/validateSpec.d.ts.map +1 -0
  200. package/dist/tools/validation/validateSpec.js +370 -0
  201. package/dist/tools/validation/validateSpec.js.map +1 -0
  202. package/package.json +58 -0
@@ -0,0 +1,2697 @@
1
+ // AUTO-GENERATED by scripts/generate-embedded-schemas.mjs. Do not edit.
2
+ // Source: repo-root /schemas/*.json
3
+ // Regenerate via `npm run prebuild` or `npm run build`.
4
+ export const specSchema = {
5
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
6
+ "$id": "extentos://schema/v1",
7
+ "type": "object",
8
+ "required": [
9
+ "extentos_version",
10
+ "target",
11
+ "blocks",
12
+ "triggers"
13
+ ],
14
+ "additionalProperties": false,
15
+ "properties": {
16
+ "$schema": {
17
+ "type": "string",
18
+ "description": "Optional first key; custom URI extentos://schema/v1 for IDE autocomplete. No HTTPS mirror.",
19
+ "examples": [
20
+ "extentos://schema/v1"
21
+ ]
22
+ },
23
+ "extentos_version": {
24
+ "type": "string",
25
+ "enum": [
26
+ "1.0"
27
+ ],
28
+ "description": "Major.minor spec schema version. Only '1.0' is valid for MVP.",
29
+ "examples": [
30
+ "1.0"
31
+ ]
32
+ },
33
+ "target": {
34
+ "type": "object",
35
+ "required": [
36
+ "vendor"
37
+ ],
38
+ "additionalProperties": false,
39
+ "description": "Hardware vendor this spec is authored against.",
40
+ "properties": {
41
+ "vendor": {
42
+ "type": "string",
43
+ "enum": [
44
+ "meta_rayban"
45
+ ],
46
+ "description": "Target glasses vendor. Only 'meta_rayban' is valid for MVP.",
47
+ "examples": [
48
+ "meta_rayban"
49
+ ]
50
+ }
51
+ }
52
+ },
53
+ "blocks": {
54
+ "type": "array",
55
+ "description": "Declared hardware capture primitives. Can be empty. Max 64.",
56
+ "maxItems": 64,
57
+ "items": {
58
+ "$ref": "#/$defs/block"
59
+ }
60
+ },
61
+ "streams": {
62
+ "type": "array",
63
+ "description": "Declared continuous stream primitives. Optional. Max 16.",
64
+ "maxItems": 16,
65
+ "items": {
66
+ "$ref": "#/$defs/stream"
67
+ }
68
+ },
69
+ "triggers": {
70
+ "type": "array",
71
+ "description": "Declared trigger flows. Can be empty. Max 32.",
72
+ "maxItems": 32,
73
+ "items": {
74
+ "$ref": "#/$defs/trigger"
75
+ }
76
+ },
77
+ "derived": {
78
+ "type": "object",
79
+ "description": "Optional compiler-computed metadata. Library recomputes at load time.",
80
+ "additionalProperties": false,
81
+ "properties": {
82
+ "capabilities_used": {
83
+ "type": "array",
84
+ "items": {
85
+ "type": "string"
86
+ },
87
+ "description": "Union of capabilities referenced by blocks, streams, and triggers.",
88
+ "examples": [
89
+ [
90
+ "camera",
91
+ "microphone",
92
+ "speaker"
93
+ ]
94
+ ]
95
+ },
96
+ "meta_registration_requirements": {
97
+ "type": "array",
98
+ "items": {
99
+ "type": "string"
100
+ },
101
+ "description": "dat.scope.* entries for Meta Developer Center registration.",
102
+ "examples": [
103
+ [
104
+ "dat.scope.camera",
105
+ "dat.scope.microphone"
106
+ ]
107
+ ]
108
+ },
109
+ "requires_network": {
110
+ "type": "boolean",
111
+ "description": "True if spec contains any app_callback action.",
112
+ "examples": [
113
+ true
114
+ ]
115
+ },
116
+ "requires_foreground_service": {
117
+ "type": "boolean",
118
+ "description": "True if spec declares continuous streams or always-on listening.",
119
+ "examples": [
120
+ true
121
+ ]
122
+ }
123
+ }
124
+ }
125
+ },
126
+ "$defs": {
127
+ "id": {
128
+ "type": "string",
129
+ "pattern": "^[a-z][a-z0-9_]{0,31}$",
130
+ "description": "Identifier: lowercase start, a-z/0-9/underscore, max 32 chars.",
131
+ "examples": [
132
+ "main_camera",
133
+ "describe_scene"
134
+ ]
135
+ },
136
+ "resolution": {
137
+ "type": "string",
138
+ "enum": [
139
+ "LOW",
140
+ "MEDIUM",
141
+ "HIGH"
142
+ ],
143
+ "description": "Capture resolution preset.",
144
+ "examples": [
145
+ "MEDIUM"
146
+ ]
147
+ },
148
+ "backpressure": {
149
+ "type": "string",
150
+ "enum": [
151
+ "drop_oldest",
152
+ "drop_newest",
153
+ "suspend"
154
+ ],
155
+ "description": "Backpressure strategy when stream consumer is slow.",
156
+ "examples": [
157
+ "drop_oldest"
158
+ ]
159
+ },
160
+ "frame_rate": {
161
+ "type": "integer",
162
+ "enum": [
163
+ 2,
164
+ 7,
165
+ 15,
166
+ 24,
167
+ 30
168
+ ],
169
+ "description": "Frames per second. 1-2 fps for ML workloads, 15+ for live streaming.",
170
+ "examples": [
171
+ 15
172
+ ]
173
+ },
174
+ "block": {
175
+ "oneOf": [
176
+ {
177
+ "$ref": "#/$defs/block_capture_photo"
178
+ },
179
+ {
180
+ "$ref": "#/$defs/block_capture_video"
181
+ },
182
+ {
183
+ "$ref": "#/$defs/block_record_audio"
184
+ }
185
+ ]
186
+ },
187
+ "block_capture_photo": {
188
+ "type": "object",
189
+ "required": [
190
+ "type",
191
+ "id",
192
+ "params"
193
+ ],
194
+ "additionalProperties": false,
195
+ "properties": {
196
+ "type": {
197
+ "const": "capture_photo",
198
+ "description": "Discriminator.",
199
+ "examples": [
200
+ "capture_photo"
201
+ ]
202
+ },
203
+ "id": {
204
+ "$ref": "#/$defs/id"
205
+ },
206
+ "params": {
207
+ "type": "object",
208
+ "additionalProperties": false,
209
+ "properties": {
210
+ "resolution": {
211
+ "$ref": "#/$defs/resolution"
212
+ },
213
+ "format": {
214
+ "type": "string",
215
+ "enum": [
216
+ "jpeg",
217
+ "heic"
218
+ ],
219
+ "description": "Output image format. Default jpeg.",
220
+ "examples": [
221
+ "jpeg"
222
+ ]
223
+ }
224
+ }
225
+ }
226
+ }
227
+ },
228
+ "block_capture_video": {
229
+ "type": "object",
230
+ "required": [
231
+ "type",
232
+ "id",
233
+ "params"
234
+ ],
235
+ "additionalProperties": false,
236
+ "properties": {
237
+ "type": {
238
+ "const": "capture_video",
239
+ "description": "Discriminator.",
240
+ "examples": [
241
+ "capture_video"
242
+ ]
243
+ },
244
+ "id": {
245
+ "$ref": "#/$defs/id"
246
+ },
247
+ "params": {
248
+ "type": "object",
249
+ "additionalProperties": false,
250
+ "properties": {
251
+ "resolution": {
252
+ "$ref": "#/$defs/resolution"
253
+ },
254
+ "duration_seconds": {
255
+ "type": "number",
256
+ "description": "Clip length. Greater than 0, at most 60. Default 10.",
257
+ "examples": [
258
+ 10
259
+ ]
260
+ },
261
+ "format": {
262
+ "type": "string",
263
+ "enum": [
264
+ "mp4_hevc",
265
+ "mp4_h264"
266
+ ],
267
+ "description": "Video container and codec. HEVC recommended.",
268
+ "examples": [
269
+ "mp4_hevc"
270
+ ]
271
+ },
272
+ "include_audio": {
273
+ "type": "boolean",
274
+ "description": "When true, triggers A2DP/HFP audio-video coexistence constraint.",
275
+ "examples": [
276
+ false
277
+ ]
278
+ }
279
+ }
280
+ }
281
+ }
282
+ },
283
+ "block_record_audio": {
284
+ "type": "object",
285
+ "required": [
286
+ "type",
287
+ "id",
288
+ "params"
289
+ ],
290
+ "additionalProperties": false,
291
+ "properties": {
292
+ "type": {
293
+ "const": "record_audio",
294
+ "description": "Discriminator.",
295
+ "examples": [
296
+ "record_audio"
297
+ ]
298
+ },
299
+ "id": {
300
+ "$ref": "#/$defs/id"
301
+ },
302
+ "params": {
303
+ "type": "object",
304
+ "additionalProperties": false,
305
+ "properties": {
306
+ "max_duration_seconds": {
307
+ "type": "number",
308
+ "description": "Max recording length. Greater than 0, at most 60. Default 15.",
309
+ "examples": [
310
+ 15
311
+ ]
312
+ },
313
+ "silence_timeout_seconds": {
314
+ "type": "number",
315
+ "description": "Cut off after this much silence. Greater than 0, at most 10. Default 2.",
316
+ "examples": [
317
+ 2
318
+ ]
319
+ },
320
+ "quality": {
321
+ "type": "string",
322
+ "enum": [
323
+ "standard",
324
+ "high"
325
+ ],
326
+ "description": "Audio quality. Bounded by HFP 8 kHz mono.",
327
+ "examples": [
328
+ "standard"
329
+ ]
330
+ }
331
+ }
332
+ }
333
+ }
334
+ },
335
+ "stream": {
336
+ "oneOf": [
337
+ {
338
+ "$ref": "#/$defs/stream_video_frames"
339
+ },
340
+ {
341
+ "$ref": "#/$defs/stream_audio_chunks"
342
+ },
343
+ {
344
+ "$ref": "#/$defs/stream_transcription_incremental"
345
+ },
346
+ {
347
+ "$ref": "#/$defs/stream_outgoing_audio"
348
+ },
349
+ {
350
+ "$ref": "#/$defs/stream_outgoing_video"
351
+ }
352
+ ]
353
+ },
354
+ "stream_video_frames": {
355
+ "type": "object",
356
+ "required": [
357
+ "type",
358
+ "id",
359
+ "config"
360
+ ],
361
+ "additionalProperties": false,
362
+ "properties": {
363
+ "type": {
364
+ "const": "video_frames",
365
+ "description": "Discriminator.",
366
+ "examples": [
367
+ "video_frames"
368
+ ]
369
+ },
370
+ "id": {
371
+ "$ref": "#/$defs/id"
372
+ },
373
+ "config": {
374
+ "type": "object",
375
+ "additionalProperties": false,
376
+ "properties": {
377
+ "resolution": {
378
+ "$ref": "#/$defs/resolution"
379
+ },
380
+ "frame_rate": {
381
+ "$ref": "#/$defs/frame_rate"
382
+ },
383
+ "codec": {
384
+ "type": "string",
385
+ "enum": [
386
+ "hvc1",
387
+ "h264"
388
+ ],
389
+ "description": "Video codec. hvc1 enables background streaming.",
390
+ "examples": [
391
+ "hvc1"
392
+ ]
393
+ },
394
+ "backpressure": {
395
+ "$ref": "#/$defs/backpressure"
396
+ }
397
+ }
398
+ }
399
+ }
400
+ },
401
+ "stream_audio_chunks": {
402
+ "type": "object",
403
+ "required": [
404
+ "type",
405
+ "id",
406
+ "config"
407
+ ],
408
+ "additionalProperties": false,
409
+ "properties": {
410
+ "type": {
411
+ "const": "audio_chunks",
412
+ "description": "Discriminator.",
413
+ "examples": [
414
+ "audio_chunks"
415
+ ]
416
+ },
417
+ "id": {
418
+ "$ref": "#/$defs/id"
419
+ },
420
+ "config": {
421
+ "type": "object",
422
+ "additionalProperties": false,
423
+ "properties": {
424
+ "chunk_millis": {
425
+ "type": "integer",
426
+ "description": "Chunk size in ms. Greater than 0. Default 20.",
427
+ "examples": [
428
+ 20
429
+ ]
430
+ },
431
+ "backpressure": {
432
+ "$ref": "#/$defs/backpressure"
433
+ }
434
+ }
435
+ }
436
+ }
437
+ },
438
+ "stream_transcription_incremental": {
439
+ "type": "object",
440
+ "required": [
441
+ "type",
442
+ "id",
443
+ "config"
444
+ ],
445
+ "additionalProperties": false,
446
+ "properties": {
447
+ "type": {
448
+ "const": "transcription_incremental",
449
+ "description": "Discriminator.",
450
+ "examples": [
451
+ "transcription_incremental"
452
+ ]
453
+ },
454
+ "id": {
455
+ "$ref": "#/$defs/id"
456
+ },
457
+ "config": {
458
+ "type": "object",
459
+ "additionalProperties": false,
460
+ "properties": {
461
+ "language": {
462
+ "type": "string",
463
+ "description": "BCP-47 language tag.",
464
+ "examples": [
465
+ "en-US"
466
+ ]
467
+ },
468
+ "min_partial_confidence": {
469
+ "type": "number",
470
+ "description": "Min confidence 0.0-1.0 for partial transcripts. Default 0.3.",
471
+ "examples": [
472
+ 0.3
473
+ ]
474
+ }
475
+ }
476
+ }
477
+ }
478
+ },
479
+ "stream_outgoing_audio": {
480
+ "type": "object",
481
+ "required": [
482
+ "type",
483
+ "id",
484
+ "config"
485
+ ],
486
+ "additionalProperties": false,
487
+ "properties": {
488
+ "type": {
489
+ "const": "outgoing_audio_stream",
490
+ "description": "Discriminator.",
491
+ "examples": [
492
+ "outgoing_audio_stream"
493
+ ]
494
+ },
495
+ "id": {
496
+ "$ref": "#/$defs/id"
497
+ },
498
+ "config": {
499
+ "type": "object",
500
+ "additionalProperties": false,
501
+ "properties": {
502
+ "chunk_millis": {
503
+ "type": "integer",
504
+ "description": "Chunk size in ms. Greater than 0. Default 20.",
505
+ "examples": [
506
+ 20
507
+ ]
508
+ },
509
+ "codec": {
510
+ "type": "string",
511
+ "enum": [
512
+ "opus",
513
+ "pcm_s16le"
514
+ ],
515
+ "description": "Outgoing audio codec.",
516
+ "examples": [
517
+ "opus"
518
+ ]
519
+ }
520
+ }
521
+ }
522
+ }
523
+ },
524
+ "stream_outgoing_video": {
525
+ "type": "object",
526
+ "required": [
527
+ "type",
528
+ "id",
529
+ "config"
530
+ ],
531
+ "additionalProperties": false,
532
+ "properties": {
533
+ "type": {
534
+ "const": "outgoing_video_stream",
535
+ "description": "Discriminator.",
536
+ "examples": [
537
+ "outgoing_video_stream"
538
+ ]
539
+ },
540
+ "id": {
541
+ "$ref": "#/$defs/id"
542
+ },
543
+ "config": {
544
+ "type": "object",
545
+ "additionalProperties": false,
546
+ "properties": {
547
+ "resolution": {
548
+ "$ref": "#/$defs/resolution"
549
+ },
550
+ "frame_rate": {
551
+ "$ref": "#/$defs/frame_rate"
552
+ },
553
+ "codec": {
554
+ "type": "string",
555
+ "enum": [
556
+ "hvc1",
557
+ "h264"
558
+ ],
559
+ "description": "Outgoing video codec.",
560
+ "examples": [
561
+ "hvc1"
562
+ ]
563
+ }
564
+ }
565
+ }
566
+ }
567
+ },
568
+ "trigger_mode": {
569
+ "type": "string",
570
+ "enum": [
571
+ "restart",
572
+ "single",
573
+ "queued"
574
+ ],
575
+ "description": "Concurrency mode. 'parallel' is reserved and will fail load.",
576
+ "examples": [
577
+ "restart"
578
+ ]
579
+ },
580
+ "trigger_on_failure": {
581
+ "type": "string",
582
+ "enum": [
583
+ "continue",
584
+ "abort"
585
+ ],
586
+ "description": "Default failure policy for block/app_callback failures.",
587
+ "examples": [
588
+ "continue"
589
+ ]
590
+ },
591
+ "trigger_display": {
592
+ "type": "object",
593
+ "additionalProperties": false,
594
+ "description": "Presentational metadata for connection UI. Ignored by interpreter.",
595
+ "properties": {
596
+ "label": {
597
+ "type": "string",
598
+ "maxLength": 48,
599
+ "description": "Button label override; max 48 chars.",
600
+ "examples": [
601
+ "Describe Scene"
602
+ ]
603
+ }
604
+ }
605
+ },
606
+ "trigger": {
607
+ "oneOf": [
608
+ {
609
+ "$ref": "#/$defs/trigger_voice_command"
610
+ },
611
+ {
612
+ "$ref": "#/$defs/trigger_wake_word"
613
+ },
614
+ {
615
+ "$ref": "#/$defs/trigger_push_to_talk"
616
+ },
617
+ {
618
+ "$ref": "#/$defs/trigger_manual_launch"
619
+ },
620
+ {
621
+ "$ref": "#/$defs/trigger_fallback"
622
+ },
623
+ {
624
+ "$ref": "#/$defs/trigger_connection_state_changed"
625
+ },
626
+ {
627
+ "$ref": "#/$defs/trigger_hinges_closed"
628
+ },
629
+ {
630
+ "$ref": "#/$defs/trigger_thermal_warning"
631
+ },
632
+ {
633
+ "$ref": "#/$defs/trigger_audio_route_changed"
634
+ },
635
+ {
636
+ "$ref": "#/$defs/trigger_phone_notification_forwarded"
637
+ },
638
+ {
639
+ "$ref": "#/$defs/trigger_location_updated"
640
+ },
641
+ {
642
+ "$ref": "#/$defs/trigger_incoming_call_detected"
643
+ },
644
+ {
645
+ "$ref": "#/$defs/trigger_app_lifecycle_changed"
646
+ }
647
+ ]
648
+ },
649
+ "trigger_common_tail": {
650
+ "type": "object",
651
+ "properties": {
652
+ "id": {
653
+ "$ref": "#/$defs/id"
654
+ },
655
+ "mode": {
656
+ "$ref": "#/$defs/trigger_mode"
657
+ },
658
+ "on_failure": {
659
+ "$ref": "#/$defs/trigger_on_failure"
660
+ },
661
+ "display": {
662
+ "$ref": "#/$defs/trigger_display"
663
+ },
664
+ "actions": {
665
+ "type": "array",
666
+ "maxItems": 32,
667
+ "description": "Sequence of actions to run when trigger fires.",
668
+ "items": {
669
+ "$ref": "#/$defs/action"
670
+ }
671
+ }
672
+ }
673
+ },
674
+ "trigger_voice_command": {
675
+ "type": "object",
676
+ "required": [
677
+ "type",
678
+ "phrase",
679
+ "actions"
680
+ ],
681
+ "additionalProperties": false,
682
+ "properties": {
683
+ "type": {
684
+ "const": "voice_command",
685
+ "description": "Discriminator.",
686
+ "examples": [
687
+ "voice_command"
688
+ ]
689
+ },
690
+ "id": {
691
+ "$ref": "#/$defs/id"
692
+ },
693
+ "phrase": {
694
+ "type": "string",
695
+ "description": "Spoken phrase. Supports named captures via {name}.",
696
+ "examples": [
697
+ "describe what you see",
698
+ "set a timer for {duration}"
699
+ ]
700
+ },
701
+ "match_mode": {
702
+ "type": "string",
703
+ "enum": [
704
+ "exact",
705
+ "starts_with",
706
+ "contains"
707
+ ],
708
+ "description": "Phrase match mode. Default contains.",
709
+ "examples": [
710
+ "contains"
711
+ ]
712
+ },
713
+ "min_confidence": {
714
+ "type": "number",
715
+ "description": "Min STT confidence 0.0-1.0. Default 0.5.",
716
+ "examples": [
717
+ 0.5
718
+ ]
719
+ },
720
+ "mode": {
721
+ "$ref": "#/$defs/trigger_mode"
722
+ },
723
+ "on_failure": {
724
+ "$ref": "#/$defs/trigger_on_failure"
725
+ },
726
+ "display": {
727
+ "$ref": "#/$defs/trigger_display"
728
+ },
729
+ "actions": {
730
+ "type": "array",
731
+ "maxItems": 32,
732
+ "items": {
733
+ "$ref": "#/$defs/action"
734
+ }
735
+ }
736
+ }
737
+ },
738
+ "trigger_wake_word": {
739
+ "type": "object",
740
+ "required": [
741
+ "type",
742
+ "phrase",
743
+ "actions"
744
+ ],
745
+ "additionalProperties": false,
746
+ "properties": {
747
+ "type": {
748
+ "const": "wake_word",
749
+ "description": "Discriminator.",
750
+ "examples": [
751
+ "wake_word"
752
+ ]
753
+ },
754
+ "id": {
755
+ "$ref": "#/$defs/id"
756
+ },
757
+ "phrase": {
758
+ "type": "string",
759
+ "description": "Wake word. Built-in: 'hey assistant', 'ok glasses', 'computer'.",
760
+ "examples": [
761
+ "hey assistant"
762
+ ]
763
+ },
764
+ "model_path": {
765
+ "type": "string",
766
+ "description": "Optional Picovoice Porcupine custom model path.",
767
+ "examples": [
768
+ "assets/custom.ppn"
769
+ ]
770
+ },
771
+ "mode": {
772
+ "$ref": "#/$defs/trigger_mode"
773
+ },
774
+ "on_failure": {
775
+ "$ref": "#/$defs/trigger_on_failure"
776
+ },
777
+ "display": {
778
+ "$ref": "#/$defs/trigger_display"
779
+ },
780
+ "actions": {
781
+ "type": "array",
782
+ "maxItems": 32,
783
+ "items": {
784
+ "$ref": "#/$defs/action"
785
+ }
786
+ }
787
+ }
788
+ },
789
+ "trigger_push_to_talk": {
790
+ "type": "object",
791
+ "required": [
792
+ "type",
793
+ "actions"
794
+ ],
795
+ "additionalProperties": false,
796
+ "properties": {
797
+ "type": {
798
+ "const": "push_to_talk",
799
+ "description": "Discriminator.",
800
+ "examples": [
801
+ "push_to_talk"
802
+ ]
803
+ },
804
+ "id": {
805
+ "$ref": "#/$defs/id"
806
+ },
807
+ "mode": {
808
+ "$ref": "#/$defs/trigger_mode"
809
+ },
810
+ "on_failure": {
811
+ "$ref": "#/$defs/trigger_on_failure"
812
+ },
813
+ "display": {
814
+ "$ref": "#/$defs/trigger_display"
815
+ },
816
+ "actions": {
817
+ "type": "array",
818
+ "maxItems": 32,
819
+ "items": {
820
+ "$ref": "#/$defs/action"
821
+ }
822
+ }
823
+ }
824
+ },
825
+ "trigger_manual_launch": {
826
+ "type": "object",
827
+ "required": [
828
+ "type",
829
+ "actions"
830
+ ],
831
+ "additionalProperties": false,
832
+ "properties": {
833
+ "type": {
834
+ "const": "manual_launch",
835
+ "description": "Discriminator.",
836
+ "examples": [
837
+ "manual_launch"
838
+ ]
839
+ },
840
+ "id": {
841
+ "$ref": "#/$defs/id"
842
+ },
843
+ "mode": {
844
+ "$ref": "#/$defs/trigger_mode"
845
+ },
846
+ "on_failure": {
847
+ "$ref": "#/$defs/trigger_on_failure"
848
+ },
849
+ "display": {
850
+ "$ref": "#/$defs/trigger_display"
851
+ },
852
+ "actions": {
853
+ "type": "array",
854
+ "maxItems": 32,
855
+ "items": {
856
+ "$ref": "#/$defs/action"
857
+ }
858
+ }
859
+ }
860
+ },
861
+ "trigger_fallback": {
862
+ "type": "object",
863
+ "required": [
864
+ "type",
865
+ "actions"
866
+ ],
867
+ "additionalProperties": false,
868
+ "description": "Fires when no voice_command matched. At most one per spec.",
869
+ "properties": {
870
+ "type": {
871
+ "const": "fallback",
872
+ "description": "Discriminator.",
873
+ "examples": [
874
+ "fallback"
875
+ ]
876
+ },
877
+ "id": {
878
+ "$ref": "#/$defs/id"
879
+ },
880
+ "mode": {
881
+ "$ref": "#/$defs/trigger_mode"
882
+ },
883
+ "on_failure": {
884
+ "$ref": "#/$defs/trigger_on_failure"
885
+ },
886
+ "display": {
887
+ "$ref": "#/$defs/trigger_display"
888
+ },
889
+ "actions": {
890
+ "type": "array",
891
+ "maxItems": 32,
892
+ "items": {
893
+ "$ref": "#/$defs/action"
894
+ }
895
+ }
896
+ }
897
+ },
898
+ "trigger_connection_state_changed": {
899
+ "type": "object",
900
+ "required": [
901
+ "type",
902
+ "actions"
903
+ ],
904
+ "additionalProperties": false,
905
+ "properties": {
906
+ "type": {
907
+ "const": "connection_state_changed",
908
+ "description": "Discriminator.",
909
+ "examples": [
910
+ "connection_state_changed"
911
+ ]
912
+ },
913
+ "id": {
914
+ "$ref": "#/$defs/id"
915
+ },
916
+ "on_transition": {
917
+ "type": "object",
918
+ "required": [
919
+ "to"
920
+ ],
921
+ "additionalProperties": false,
922
+ "description": "Filter which transitions fire this trigger. Bucket-only matching.",
923
+ "properties": {
924
+ "from": {
925
+ "type": "string",
926
+ "enum": [
927
+ "NotRegistered",
928
+ "Registered",
929
+ "DeviceDiscovered",
930
+ "Connecting",
931
+ "Connected",
932
+ "SessionActive",
933
+ "StreamActive",
934
+ "Disconnected"
935
+ ],
936
+ "description": "Source state bucket.",
937
+ "examples": [
938
+ "Connected"
939
+ ]
940
+ },
941
+ "to": {
942
+ "type": "string",
943
+ "enum": [
944
+ "NotRegistered",
945
+ "Registered",
946
+ "DeviceDiscovered",
947
+ "Connecting",
948
+ "Connected",
949
+ "SessionActive",
950
+ "StreamActive",
951
+ "Disconnected"
952
+ ],
953
+ "description": "Destination state bucket.",
954
+ "examples": [
955
+ "Disconnected"
956
+ ]
957
+ }
958
+ }
959
+ },
960
+ "mode": {
961
+ "$ref": "#/$defs/trigger_mode"
962
+ },
963
+ "on_failure": {
964
+ "$ref": "#/$defs/trigger_on_failure"
965
+ },
966
+ "display": {
967
+ "$ref": "#/$defs/trigger_display"
968
+ },
969
+ "actions": {
970
+ "type": "array",
971
+ "maxItems": 32,
972
+ "items": {
973
+ "$ref": "#/$defs/action"
974
+ }
975
+ }
976
+ }
977
+ },
978
+ "trigger_hinges_closed": {
979
+ "type": "object",
980
+ "required": [
981
+ "type",
982
+ "actions"
983
+ ],
984
+ "additionalProperties": false,
985
+ "properties": {
986
+ "type": {
987
+ "const": "hinges_closed",
988
+ "description": "Discriminator.",
989
+ "examples": [
990
+ "hinges_closed"
991
+ ]
992
+ },
993
+ "id": {
994
+ "$ref": "#/$defs/id"
995
+ },
996
+ "mode": {
997
+ "$ref": "#/$defs/trigger_mode"
998
+ },
999
+ "on_failure": {
1000
+ "$ref": "#/$defs/trigger_on_failure"
1001
+ },
1002
+ "display": {
1003
+ "$ref": "#/$defs/trigger_display"
1004
+ },
1005
+ "actions": {
1006
+ "type": "array",
1007
+ "maxItems": 32,
1008
+ "items": {
1009
+ "$ref": "#/$defs/action"
1010
+ }
1011
+ }
1012
+ }
1013
+ },
1014
+ "trigger_thermal_warning": {
1015
+ "type": "object",
1016
+ "required": [
1017
+ "type",
1018
+ "actions"
1019
+ ],
1020
+ "additionalProperties": false,
1021
+ "properties": {
1022
+ "type": {
1023
+ "const": "thermal_warning",
1024
+ "description": "Discriminator.",
1025
+ "examples": [
1026
+ "thermal_warning"
1027
+ ]
1028
+ },
1029
+ "id": {
1030
+ "$ref": "#/$defs/id"
1031
+ },
1032
+ "severity": {
1033
+ "type": "string",
1034
+ "enum": [
1035
+ "light",
1036
+ "moderate",
1037
+ "severe",
1038
+ "critical"
1039
+ ],
1040
+ "description": "Fires when thermal state crosses this level going up. Default moderate.",
1041
+ "examples": [
1042
+ "moderate"
1043
+ ]
1044
+ },
1045
+ "mode": {
1046
+ "$ref": "#/$defs/trigger_mode"
1047
+ },
1048
+ "on_failure": {
1049
+ "$ref": "#/$defs/trigger_on_failure"
1050
+ },
1051
+ "display": {
1052
+ "$ref": "#/$defs/trigger_display"
1053
+ },
1054
+ "actions": {
1055
+ "type": "array",
1056
+ "maxItems": 32,
1057
+ "items": {
1058
+ "$ref": "#/$defs/action"
1059
+ }
1060
+ }
1061
+ }
1062
+ },
1063
+ "trigger_audio_route_changed": {
1064
+ "type": "object",
1065
+ "required": [
1066
+ "type",
1067
+ "actions"
1068
+ ],
1069
+ "additionalProperties": false,
1070
+ "properties": {
1071
+ "type": {
1072
+ "const": "audio_route_changed",
1073
+ "description": "Discriminator.",
1074
+ "examples": [
1075
+ "audio_route_changed"
1076
+ ]
1077
+ },
1078
+ "id": {
1079
+ "$ref": "#/$defs/id"
1080
+ },
1081
+ "mode": {
1082
+ "$ref": "#/$defs/trigger_mode"
1083
+ },
1084
+ "on_failure": {
1085
+ "$ref": "#/$defs/trigger_on_failure"
1086
+ },
1087
+ "display": {
1088
+ "$ref": "#/$defs/trigger_display"
1089
+ },
1090
+ "actions": {
1091
+ "type": "array",
1092
+ "maxItems": 32,
1093
+ "items": {
1094
+ "$ref": "#/$defs/action"
1095
+ }
1096
+ }
1097
+ }
1098
+ },
1099
+ "trigger_phone_notification_forwarded": {
1100
+ "type": "object",
1101
+ "required": [
1102
+ "type",
1103
+ "actions"
1104
+ ],
1105
+ "additionalProperties": false,
1106
+ "properties": {
1107
+ "type": {
1108
+ "const": "phone_notification_forwarded",
1109
+ "description": "Discriminator.",
1110
+ "examples": [
1111
+ "phone_notification_forwarded"
1112
+ ]
1113
+ },
1114
+ "id": {
1115
+ "$ref": "#/$defs/id"
1116
+ },
1117
+ "mode": {
1118
+ "$ref": "#/$defs/trigger_mode"
1119
+ },
1120
+ "on_failure": {
1121
+ "$ref": "#/$defs/trigger_on_failure"
1122
+ },
1123
+ "display": {
1124
+ "$ref": "#/$defs/trigger_display"
1125
+ },
1126
+ "actions": {
1127
+ "type": "array",
1128
+ "maxItems": 32,
1129
+ "items": {
1130
+ "$ref": "#/$defs/action"
1131
+ }
1132
+ }
1133
+ }
1134
+ },
1135
+ "trigger_location_updated": {
1136
+ "type": "object",
1137
+ "required": [
1138
+ "type",
1139
+ "actions"
1140
+ ],
1141
+ "additionalProperties": false,
1142
+ "properties": {
1143
+ "type": {
1144
+ "const": "location_updated",
1145
+ "description": "Discriminator.",
1146
+ "examples": [
1147
+ "location_updated"
1148
+ ]
1149
+ },
1150
+ "id": {
1151
+ "$ref": "#/$defs/id"
1152
+ },
1153
+ "min_interval_millis": {
1154
+ "type": "integer",
1155
+ "description": "Min interval between firings in ms. Greater than 0. Default 5000.",
1156
+ "examples": [
1157
+ 5000
1158
+ ]
1159
+ },
1160
+ "min_displacement_meters": {
1161
+ "type": "number",
1162
+ "description": "Min displacement before firing in meters. At least 0. Default 10.",
1163
+ "examples": [
1164
+ 10
1165
+ ]
1166
+ },
1167
+ "mode": {
1168
+ "$ref": "#/$defs/trigger_mode"
1169
+ },
1170
+ "on_failure": {
1171
+ "$ref": "#/$defs/trigger_on_failure"
1172
+ },
1173
+ "display": {
1174
+ "$ref": "#/$defs/trigger_display"
1175
+ },
1176
+ "actions": {
1177
+ "type": "array",
1178
+ "maxItems": 32,
1179
+ "items": {
1180
+ "$ref": "#/$defs/action"
1181
+ }
1182
+ }
1183
+ }
1184
+ },
1185
+ "trigger_incoming_call_detected": {
1186
+ "type": "object",
1187
+ "required": [
1188
+ "type",
1189
+ "actions"
1190
+ ],
1191
+ "additionalProperties": false,
1192
+ "properties": {
1193
+ "type": {
1194
+ "const": "incoming_call_detected",
1195
+ "description": "Discriminator.",
1196
+ "examples": [
1197
+ "incoming_call_detected"
1198
+ ]
1199
+ },
1200
+ "id": {
1201
+ "$ref": "#/$defs/id"
1202
+ },
1203
+ "mode": {
1204
+ "$ref": "#/$defs/trigger_mode"
1205
+ },
1206
+ "on_failure": {
1207
+ "$ref": "#/$defs/trigger_on_failure"
1208
+ },
1209
+ "display": {
1210
+ "$ref": "#/$defs/trigger_display"
1211
+ },
1212
+ "actions": {
1213
+ "type": "array",
1214
+ "maxItems": 32,
1215
+ "items": {
1216
+ "$ref": "#/$defs/action"
1217
+ }
1218
+ }
1219
+ }
1220
+ },
1221
+ "trigger_app_lifecycle_changed": {
1222
+ "type": "object",
1223
+ "required": [
1224
+ "type",
1225
+ "actions"
1226
+ ],
1227
+ "additionalProperties": false,
1228
+ "properties": {
1229
+ "type": {
1230
+ "const": "app_lifecycle_changed",
1231
+ "description": "Discriminator.",
1232
+ "examples": [
1233
+ "app_lifecycle_changed"
1234
+ ]
1235
+ },
1236
+ "id": {
1237
+ "$ref": "#/$defs/id"
1238
+ },
1239
+ "to": {
1240
+ "type": "string",
1241
+ "enum": [
1242
+ "foreground",
1243
+ "background",
1244
+ "destroyed"
1245
+ ],
1246
+ "description": "Only fire on transitions TO this state.",
1247
+ "examples": [
1248
+ "background"
1249
+ ]
1250
+ },
1251
+ "mode": {
1252
+ "$ref": "#/$defs/trigger_mode"
1253
+ },
1254
+ "on_failure": {
1255
+ "$ref": "#/$defs/trigger_on_failure"
1256
+ },
1257
+ "display": {
1258
+ "$ref": "#/$defs/trigger_display"
1259
+ },
1260
+ "actions": {
1261
+ "type": "array",
1262
+ "maxItems": 32,
1263
+ "items": {
1264
+ "$ref": "#/$defs/action"
1265
+ }
1266
+ }
1267
+ }
1268
+ },
1269
+ "action": {
1270
+ "oneOf": [
1271
+ {
1272
+ "$ref": "#/$defs/action_block_call"
1273
+ },
1274
+ {
1275
+ "$ref": "#/$defs/action_app_callback"
1276
+ },
1277
+ {
1278
+ "$ref": "#/$defs/action_branch"
1279
+ },
1280
+ {
1281
+ "$ref": "#/$defs/action_set_variable"
1282
+ },
1283
+ {
1284
+ "$ref": "#/$defs/action_speak_text"
1285
+ },
1286
+ {
1287
+ "$ref": "#/$defs/action_earcon_beep"
1288
+ },
1289
+ {
1290
+ "$ref": "#/$defs/action_prompt"
1291
+ },
1292
+ {
1293
+ "$ref": "#/$defs/action_set_toggle"
1294
+ },
1295
+ {
1296
+ "$ref": "#/$defs/action_delay"
1297
+ },
1298
+ {
1299
+ "$ref": "#/$defs/action_abort"
1300
+ },
1301
+ {
1302
+ "$ref": "#/$defs/action_log"
1303
+ },
1304
+ {
1305
+ "$ref": "#/$defs/action_wait_for_connected"
1306
+ },
1307
+ {
1308
+ "$ref": "#/$defs/action_retry_with_backoff"
1309
+ },
1310
+ {
1311
+ "$ref": "#/$defs/action_buffer_and_replay"
1312
+ },
1313
+ {
1314
+ "$ref": "#/$defs/action_when_connected"
1315
+ }
1316
+ ]
1317
+ },
1318
+ "action_non_wrapper": {
1319
+ "oneOf": [
1320
+ {
1321
+ "$ref": "#/$defs/action_block_call"
1322
+ },
1323
+ {
1324
+ "$ref": "#/$defs/action_app_callback"
1325
+ },
1326
+ {
1327
+ "$ref": "#/$defs/action_branch"
1328
+ },
1329
+ {
1330
+ "$ref": "#/$defs/action_set_variable"
1331
+ },
1332
+ {
1333
+ "$ref": "#/$defs/action_speak_text"
1334
+ },
1335
+ {
1336
+ "$ref": "#/$defs/action_earcon_beep"
1337
+ },
1338
+ {
1339
+ "$ref": "#/$defs/action_prompt"
1340
+ },
1341
+ {
1342
+ "$ref": "#/$defs/action_set_toggle"
1343
+ },
1344
+ {
1345
+ "$ref": "#/$defs/action_delay"
1346
+ },
1347
+ {
1348
+ "$ref": "#/$defs/action_abort"
1349
+ },
1350
+ {
1351
+ "$ref": "#/$defs/action_log"
1352
+ },
1353
+ {
1354
+ "$ref": "#/$defs/action_wait_for_connected"
1355
+ },
1356
+ {
1357
+ "$ref": "#/$defs/action_buffer_and_replay"
1358
+ }
1359
+ ]
1360
+ },
1361
+ "action_no_branch": {
1362
+ "oneOf": [
1363
+ {
1364
+ "$ref": "#/$defs/action_block_call"
1365
+ },
1366
+ {
1367
+ "$ref": "#/$defs/action_app_callback"
1368
+ },
1369
+ {
1370
+ "$ref": "#/$defs/action_set_variable"
1371
+ },
1372
+ {
1373
+ "$ref": "#/$defs/action_speak_text"
1374
+ },
1375
+ {
1376
+ "$ref": "#/$defs/action_earcon_beep"
1377
+ },
1378
+ {
1379
+ "$ref": "#/$defs/action_prompt"
1380
+ },
1381
+ {
1382
+ "$ref": "#/$defs/action_set_toggle"
1383
+ },
1384
+ {
1385
+ "$ref": "#/$defs/action_delay"
1386
+ },
1387
+ {
1388
+ "$ref": "#/$defs/action_abort"
1389
+ },
1390
+ {
1391
+ "$ref": "#/$defs/action_log"
1392
+ },
1393
+ {
1394
+ "$ref": "#/$defs/action_wait_for_connected"
1395
+ },
1396
+ {
1397
+ "$ref": "#/$defs/action_retry_with_backoff"
1398
+ },
1399
+ {
1400
+ "$ref": "#/$defs/action_buffer_and_replay"
1401
+ },
1402
+ {
1403
+ "$ref": "#/$defs/action_when_connected"
1404
+ }
1405
+ ]
1406
+ },
1407
+ "action_block_call": {
1408
+ "type": "object",
1409
+ "required": [
1410
+ "type",
1411
+ "block_id"
1412
+ ],
1413
+ "additionalProperties": false,
1414
+ "properties": {
1415
+ "type": {
1416
+ "const": "block_call",
1417
+ "description": "Discriminator.",
1418
+ "examples": [
1419
+ "block_call"
1420
+ ]
1421
+ },
1422
+ "block_id": {
1423
+ "$ref": "#/$defs/id"
1424
+ },
1425
+ "save_as": {
1426
+ "$ref": "#/$defs/id"
1427
+ }
1428
+ }
1429
+ },
1430
+ "action_app_callback": {
1431
+ "type": "object",
1432
+ "required": [
1433
+ "type",
1434
+ "handler",
1435
+ "input"
1436
+ ],
1437
+ "additionalProperties": false,
1438
+ "properties": {
1439
+ "type": {
1440
+ "const": "app_callback",
1441
+ "description": "Discriminator.",
1442
+ "examples": [
1443
+ "app_callback"
1444
+ ]
1445
+ },
1446
+ "handler": {
1447
+ "$ref": "#/$defs/id"
1448
+ },
1449
+ "input": {
1450
+ "type": "object",
1451
+ "description": "Input payload. String values support {{template}} substitution.",
1452
+ "examples": [
1453
+ {
1454
+ "image": "{{photo}}",
1455
+ "prompt": "Describe"
1456
+ }
1457
+ ]
1458
+ },
1459
+ "save_as": {
1460
+ "$ref": "#/$defs/id"
1461
+ },
1462
+ "timeout_ms": {
1463
+ "type": "integer",
1464
+ "description": "Handler timeout in ms. Greater than 0. Default 10000.",
1465
+ "examples": [
1466
+ 10000
1467
+ ]
1468
+ }
1469
+ }
1470
+ },
1471
+ "action_branch": {
1472
+ "type": "object",
1473
+ "required": [
1474
+ "type",
1475
+ "condition",
1476
+ "then"
1477
+ ],
1478
+ "additionalProperties": false,
1479
+ "description": "Conditional. Max depth 1 — 'then' and 'else' arms must not contain another branch.",
1480
+ "properties": {
1481
+ "type": {
1482
+ "const": "branch",
1483
+ "description": "Discriminator.",
1484
+ "examples": [
1485
+ "branch"
1486
+ ]
1487
+ },
1488
+ "condition": {
1489
+ "$ref": "#/$defs/branch_condition"
1490
+ },
1491
+ "then": {
1492
+ "type": "array",
1493
+ "description": "Actions when condition is true. No nested branch.",
1494
+ "items": {
1495
+ "$ref": "#/$defs/action_no_branch"
1496
+ }
1497
+ },
1498
+ "else": {
1499
+ "type": "array",
1500
+ "description": "Actions when condition is false. No nested branch.",
1501
+ "items": {
1502
+ "$ref": "#/$defs/action_no_branch"
1503
+ }
1504
+ }
1505
+ }
1506
+ },
1507
+ "action_set_variable": {
1508
+ "type": "object",
1509
+ "required": [
1510
+ "type",
1511
+ "name",
1512
+ "value"
1513
+ ],
1514
+ "additionalProperties": false,
1515
+ "properties": {
1516
+ "type": {
1517
+ "const": "set_variable",
1518
+ "description": "Discriminator.",
1519
+ "examples": [
1520
+ "set_variable"
1521
+ ]
1522
+ },
1523
+ "name": {
1524
+ "$ref": "#/$defs/id"
1525
+ },
1526
+ "value": {
1527
+ "description": "Any JSON value. Strings support templates.",
1528
+ "examples": [
1529
+ "Hello {{user_name}}"
1530
+ ]
1531
+ },
1532
+ "fallback": {
1533
+ "description": "Written if value resolves to empty.",
1534
+ "examples": [
1535
+ "Hello friend"
1536
+ ]
1537
+ }
1538
+ }
1539
+ },
1540
+ "action_speak_text": {
1541
+ "type": "object",
1542
+ "required": [
1543
+ "type",
1544
+ "text"
1545
+ ],
1546
+ "additionalProperties": false,
1547
+ "properties": {
1548
+ "type": {
1549
+ "const": "speak_text",
1550
+ "description": "Discriminator.",
1551
+ "examples": [
1552
+ "speak_text"
1553
+ ]
1554
+ },
1555
+ "text": {
1556
+ "type": "string",
1557
+ "description": "Text to speak. Supports templates.",
1558
+ "examples": [
1559
+ "{{description}}"
1560
+ ]
1561
+ },
1562
+ "voice": {
1563
+ "type": "string",
1564
+ "description": "Optional voice id.",
1565
+ "examples": [
1566
+ "en-US-Wavenet-D"
1567
+ ]
1568
+ },
1569
+ "rate": {
1570
+ "type": "number",
1571
+ "description": "Playback rate 0.5-2.0. Default 1.0.",
1572
+ "examples": [
1573
+ 1
1574
+ ]
1575
+ },
1576
+ "pitch": {
1577
+ "type": "number",
1578
+ "description": "Pitch -1.0 to 1.0. Default 0.0.",
1579
+ "examples": [
1580
+ 0
1581
+ ]
1582
+ },
1583
+ "volume": {
1584
+ "type": "number",
1585
+ "description": "Volume 0.0-1.0. Default 1.0.",
1586
+ "examples": [
1587
+ 1
1588
+ ]
1589
+ },
1590
+ "wait_for_completion": {
1591
+ "type": "boolean",
1592
+ "description": "Block flow until TTS finishes. Default true.",
1593
+ "examples": [
1594
+ true
1595
+ ]
1596
+ }
1597
+ }
1598
+ },
1599
+ "action_earcon_beep": {
1600
+ "type": "object",
1601
+ "required": [
1602
+ "type",
1603
+ "sound"
1604
+ ],
1605
+ "additionalProperties": false,
1606
+ "properties": {
1607
+ "type": {
1608
+ "const": "earcon_beep",
1609
+ "description": "Discriminator.",
1610
+ "examples": [
1611
+ "earcon_beep"
1612
+ ]
1613
+ },
1614
+ "sound": {
1615
+ "type": "string",
1616
+ "enum": [
1617
+ "confirmation",
1618
+ "error",
1619
+ "notification",
1620
+ "start",
1621
+ "stop"
1622
+ ],
1623
+ "description": "Earcon sound.",
1624
+ "examples": [
1625
+ "confirmation"
1626
+ ]
1627
+ },
1628
+ "volume": {
1629
+ "type": "number",
1630
+ "description": "Volume 0.0-1.0. Default 0.8.",
1631
+ "examples": [
1632
+ 0.8
1633
+ ]
1634
+ }
1635
+ }
1636
+ },
1637
+ "action_prompt": {
1638
+ "type": "object",
1639
+ "required": [
1640
+ "type",
1641
+ "question",
1642
+ "save_as"
1643
+ ],
1644
+ "additionalProperties": false,
1645
+ "properties": {
1646
+ "type": {
1647
+ "const": "prompt",
1648
+ "description": "Discriminator.",
1649
+ "examples": [
1650
+ "prompt"
1651
+ ]
1652
+ },
1653
+ "question": {
1654
+ "type": "string",
1655
+ "description": "Question to ask. Spoken via TTS. Supports templates.",
1656
+ "examples": [
1657
+ "For how long?"
1658
+ ]
1659
+ },
1660
+ "save_as": {
1661
+ "$ref": "#/$defs/id"
1662
+ },
1663
+ "timeout_seconds": {
1664
+ "type": "number",
1665
+ "description": "Response timeout. Greater than 0, at most 30. Default 5.",
1666
+ "examples": [
1667
+ 5
1668
+ ]
1669
+ },
1670
+ "min_confidence": {
1671
+ "type": "number",
1672
+ "description": "Min STT confidence 0.0-1.0. Default 0.4.",
1673
+ "examples": [
1674
+ 0.4
1675
+ ]
1676
+ }
1677
+ }
1678
+ },
1679
+ "action_set_toggle": {
1680
+ "type": "object",
1681
+ "required": [
1682
+ "type",
1683
+ "key",
1684
+ "value"
1685
+ ],
1686
+ "additionalProperties": false,
1687
+ "properties": {
1688
+ "type": {
1689
+ "const": "set_toggle",
1690
+ "description": "Discriminator.",
1691
+ "examples": [
1692
+ "set_toggle"
1693
+ ]
1694
+ },
1695
+ "key": {
1696
+ "type": "string",
1697
+ "description": "Known toggle key (validated at load).",
1698
+ "examples": [
1699
+ "battery_save_mode"
1700
+ ]
1701
+ },
1702
+ "value": {
1703
+ "description": "Toggle value; type depends on key.",
1704
+ "examples": [
1705
+ true
1706
+ ]
1707
+ }
1708
+ }
1709
+ },
1710
+ "action_delay": {
1711
+ "type": "object",
1712
+ "required": [
1713
+ "type",
1714
+ "seconds"
1715
+ ],
1716
+ "additionalProperties": false,
1717
+ "properties": {
1718
+ "type": {
1719
+ "const": "delay",
1720
+ "description": "Discriminator.",
1721
+ "examples": [
1722
+ "delay"
1723
+ ]
1724
+ },
1725
+ "seconds": {
1726
+ "type": "number",
1727
+ "description": "Pause duration. Must be a literal number. Greater than 0, at most 3600.",
1728
+ "examples": [
1729
+ 2
1730
+ ]
1731
+ }
1732
+ }
1733
+ },
1734
+ "action_abort": {
1735
+ "type": "object",
1736
+ "required": [
1737
+ "type"
1738
+ ],
1739
+ "additionalProperties": false,
1740
+ "properties": {
1741
+ "type": {
1742
+ "const": "abort",
1743
+ "description": "Discriminator.",
1744
+ "examples": [
1745
+ "abort"
1746
+ ]
1747
+ },
1748
+ "reason": {
1749
+ "type": "string",
1750
+ "description": "Reason string.",
1751
+ "examples": [
1752
+ "user cancelled"
1753
+ ]
1754
+ }
1755
+ }
1756
+ },
1757
+ "action_log": {
1758
+ "type": "object",
1759
+ "required": [
1760
+ "type",
1761
+ "level",
1762
+ "message"
1763
+ ],
1764
+ "additionalProperties": false,
1765
+ "properties": {
1766
+ "type": {
1767
+ "const": "log",
1768
+ "description": "Discriminator.",
1769
+ "examples": [
1770
+ "log"
1771
+ ]
1772
+ },
1773
+ "level": {
1774
+ "type": "string",
1775
+ "enum": [
1776
+ "debug",
1777
+ "info",
1778
+ "warning",
1779
+ "error"
1780
+ ],
1781
+ "description": "Log level.",
1782
+ "examples": [
1783
+ "info"
1784
+ ]
1785
+ },
1786
+ "message": {
1787
+ "type": "string",
1788
+ "description": "Log message. Supports templates.",
1789
+ "examples": [
1790
+ "flow started"
1791
+ ]
1792
+ },
1793
+ "payload": {
1794
+ "type": "object",
1795
+ "description": "Structured payload. String values support templates.",
1796
+ "examples": [
1797
+ {
1798
+ "photo_width": "{{photo.width}}"
1799
+ }
1800
+ ]
1801
+ }
1802
+ }
1803
+ },
1804
+ "action_wait_for_connected": {
1805
+ "type": "object",
1806
+ "required": [
1807
+ "type",
1808
+ "timeout_seconds"
1809
+ ],
1810
+ "additionalProperties": false,
1811
+ "properties": {
1812
+ "type": {
1813
+ "const": "wait_for_connected",
1814
+ "description": "Discriminator.",
1815
+ "examples": [
1816
+ "wait_for_connected"
1817
+ ]
1818
+ },
1819
+ "timeout_seconds": {
1820
+ "type": "number",
1821
+ "description": "Max wait. Greater than 0, at most 120. Aborts with connection_timeout on timeout.",
1822
+ "examples": [
1823
+ 30
1824
+ ]
1825
+ }
1826
+ }
1827
+ },
1828
+ "action_retry_with_backoff": {
1829
+ "type": "object",
1830
+ "required": [
1831
+ "type",
1832
+ "action"
1833
+ ],
1834
+ "additionalProperties": false,
1835
+ "description": "Wrapper action. Inner 'action' must be non-wrapper.",
1836
+ "properties": {
1837
+ "type": {
1838
+ "const": "retry_with_backoff",
1839
+ "description": "Discriminator.",
1840
+ "examples": [
1841
+ "retry_with_backoff"
1842
+ ]
1843
+ },
1844
+ "action": {
1845
+ "$ref": "#/$defs/action_non_wrapper"
1846
+ },
1847
+ "max_attempts": {
1848
+ "type": "integer",
1849
+ "description": "Max attempts. Greater than 0. Default 3.",
1850
+ "examples": [
1851
+ 3
1852
+ ]
1853
+ },
1854
+ "initial_delay_ms": {
1855
+ "type": "integer",
1856
+ "description": "Initial delay in ms. Greater than 0. Default 1000.",
1857
+ "examples": [
1858
+ 1000
1859
+ ]
1860
+ },
1861
+ "multiplier": {
1862
+ "type": "number",
1863
+ "description": "Backoff multiplier. Greater than 0. Default 2.0.",
1864
+ "examples": [
1865
+ 2
1866
+ ]
1867
+ },
1868
+ "max_delay_ms": {
1869
+ "type": "integer",
1870
+ "description": "Max delay in ms. Greater than 0. Default 30000.",
1871
+ "examples": [
1872
+ 30000
1873
+ ]
1874
+ },
1875
+ "jitter": {
1876
+ "type": "number",
1877
+ "description": "Jitter fraction 0.0-1.0. Default 0.2.",
1878
+ "examples": [
1879
+ 0.2
1880
+ ]
1881
+ }
1882
+ }
1883
+ },
1884
+ "action_buffer_and_replay": {
1885
+ "type": "object",
1886
+ "required": [
1887
+ "type",
1888
+ "event"
1889
+ ],
1890
+ "additionalProperties": false,
1891
+ "properties": {
1892
+ "type": {
1893
+ "const": "buffer_and_replay",
1894
+ "description": "Discriminator.",
1895
+ "examples": [
1896
+ "buffer_and_replay"
1897
+ ]
1898
+ },
1899
+ "event": {
1900
+ "type": "string",
1901
+ "description": "Block type or trigger type to buffer.",
1902
+ "examples": [
1903
+ "capture_photo"
1904
+ ]
1905
+ },
1906
+ "max_buffered": {
1907
+ "type": "integer",
1908
+ "description": "Max buffered events. Greater than 0. Default 50.",
1909
+ "examples": [
1910
+ 50
1911
+ ]
1912
+ },
1913
+ "on_overflow": {
1914
+ "type": "string",
1915
+ "enum": [
1916
+ "drop_oldest",
1917
+ "drop_newest"
1918
+ ],
1919
+ "description": "Overflow policy.",
1920
+ "examples": [
1921
+ "drop_oldest"
1922
+ ]
1923
+ }
1924
+ }
1925
+ },
1926
+ "action_when_connected": {
1927
+ "type": "object",
1928
+ "required": [
1929
+ "type",
1930
+ "require",
1931
+ "action"
1932
+ ],
1933
+ "additionalProperties": false,
1934
+ "description": "Wrapper action. Inner 'action' must be non-wrapper.",
1935
+ "properties": {
1936
+ "type": {
1937
+ "const": "when_connected",
1938
+ "description": "Discriminator.",
1939
+ "examples": [
1940
+ "when_connected"
1941
+ ]
1942
+ },
1943
+ "require": {
1944
+ "type": "array",
1945
+ "description": "Predicate strings. Valid forms: 'connected', 'phone_battery_above:N', 'thermal_below:<level>', 'audio_route:<route>', 'toggle_on:<key>', 'toggle_off:<key>'.",
1946
+ "items": {
1947
+ "type": "string"
1948
+ },
1949
+ "examples": [
1950
+ [
1951
+ "connected",
1952
+ "thermal_below:moderate"
1953
+ ]
1954
+ ]
1955
+ },
1956
+ "action": {
1957
+ "$ref": "#/$defs/action_non_wrapper"
1958
+ },
1959
+ "on_unmet": {
1960
+ "type": "string",
1961
+ "enum": [
1962
+ "skip",
1963
+ "abort"
1964
+ ],
1965
+ "description": "Behavior when predicates unmet.",
1966
+ "examples": [
1967
+ "skip"
1968
+ ]
1969
+ }
1970
+ }
1971
+ },
1972
+ "branch_condition": {
1973
+ "oneOf": [
1974
+ {
1975
+ "$ref": "#/$defs/branch_condition_simple"
1976
+ },
1977
+ {
1978
+ "$ref": "#/$defs/branch_condition_all"
1979
+ },
1980
+ {
1981
+ "$ref": "#/$defs/branch_condition_any"
1982
+ }
1983
+ ]
1984
+ },
1985
+ "branch_condition_simple": {
1986
+ "type": "object",
1987
+ "required": [
1988
+ "variable",
1989
+ "operator"
1990
+ ],
1991
+ "additionalProperties": false,
1992
+ "properties": {
1993
+ "variable": {
1994
+ "type": "string",
1995
+ "description": "Variable name. Supports dot-path and special namespaces (toggles.*, trigger_payload.*, hardware_state.*).",
1996
+ "examples": [
1997
+ "description",
1998
+ "photo.width",
1999
+ "toggles.privacy_mode"
2000
+ ]
2001
+ },
2002
+ "operator": {
2003
+ "type": "string",
2004
+ "enum": [
2005
+ "equals",
2006
+ "not_equals",
2007
+ "contains",
2008
+ "not_contains",
2009
+ "is_empty",
2010
+ "not_empty",
2011
+ "greater_than",
2012
+ "less_than",
2013
+ "gte",
2014
+ "lte",
2015
+ "starts_with",
2016
+ "ends_with"
2017
+ ],
2018
+ "description": "Comparison operator.",
2019
+ "examples": [
2020
+ "equals"
2021
+ ]
2022
+ },
2023
+ "value": {
2024
+ "description": "Comparand. Optional for is_empty/not_empty, required otherwise."
2025
+ }
2026
+ }
2027
+ },
2028
+ "branch_condition_all": {
2029
+ "type": "object",
2030
+ "required": [
2031
+ "all"
2032
+ ],
2033
+ "additionalProperties": false,
2034
+ "properties": {
2035
+ "all": {
2036
+ "type": "array",
2037
+ "description": "AND combinator. Nesting not capped.",
2038
+ "items": {
2039
+ "$ref": "#/$defs/branch_condition"
2040
+ }
2041
+ }
2042
+ }
2043
+ },
2044
+ "branch_condition_any": {
2045
+ "type": "object",
2046
+ "required": [
2047
+ "any"
2048
+ ],
2049
+ "additionalProperties": false,
2050
+ "properties": {
2051
+ "any": {
2052
+ "type": "array",
2053
+ "description": "OR combinator. Nesting not capped.",
2054
+ "items": {
2055
+ "$ref": "#/$defs/branch_condition"
2056
+ }
2057
+ }
2058
+ }
2059
+ }
2060
+ }
2061
+ };
2062
+ export const manifestSchema = {
2063
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2064
+ "$id": "extentos://schema/manifest/v1",
2065
+ "type": "object",
2066
+ "required": [
2067
+ "manifestVersion",
2068
+ "platform",
2069
+ "glasses",
2070
+ "appPackage",
2071
+ "extentos",
2072
+ "spec",
2073
+ "generatedFiles",
2074
+ "permissions",
2075
+ "integration"
2076
+ ],
2077
+ "additionalProperties": false,
2078
+ "description": "Machine-readable Extentos integration state. Written by MCP tools, read by inspectIntegration and validateIntegration.",
2079
+ "properties": {
2080
+ "manifestVersion": {
2081
+ "type": "integer",
2082
+ "const": 1,
2083
+ "description": "Manifest format version. Only 1 is valid for MVP.",
2084
+ "examples": [
2085
+ 1
2086
+ ]
2087
+ },
2088
+ "platform": {
2089
+ "type": "string",
2090
+ "enum": [
2091
+ "android",
2092
+ "ios"
2093
+ ],
2094
+ "description": "Platform this manifest describes.",
2095
+ "examples": [
2096
+ "android"
2097
+ ]
2098
+ },
2099
+ "glasses": {
2100
+ "type": "string",
2101
+ "enum": [
2102
+ "meta_rayban"
2103
+ ],
2104
+ "description": "Target glasses vendor. Only meta_rayban for MVP.",
2105
+ "examples": [
2106
+ "meta_rayban"
2107
+ ]
2108
+ },
2109
+ "appPackage": {
2110
+ "type": "string",
2111
+ "description": "Developer app identifier. Android: package name. iOS: Bundle ID.",
2112
+ "examples": [
2113
+ "com.example.myapp"
2114
+ ]
2115
+ },
2116
+ "extentos": {
2117
+ "type": "object",
2118
+ "required": [
2119
+ "libraryVersion",
2120
+ "specVersion",
2121
+ "installedAt",
2122
+ "lastUpdatedAt"
2123
+ ],
2124
+ "additionalProperties": false,
2125
+ "properties": {
2126
+ "libraryVersion": {
2127
+ "type": "string",
2128
+ "description": "Installed library version.",
2129
+ "examples": [
2130
+ "1.0.0"
2131
+ ]
2132
+ },
2133
+ "specVersion": {
2134
+ "type": "string",
2135
+ "description": "Spec schema version.",
2136
+ "examples": [
2137
+ "1.0"
2138
+ ]
2139
+ },
2140
+ "installedAt": {
2141
+ "type": "string",
2142
+ "description": "ISO-8601 timestamp of first install.",
2143
+ "examples": [
2144
+ "2026-04-16T12:00:00Z"
2145
+ ]
2146
+ },
2147
+ "lastUpdatedAt": {
2148
+ "type": "string",
2149
+ "description": "ISO-8601 timestamp of last integration mutation.",
2150
+ "examples": [
2151
+ "2026-04-16T14:30:00Z"
2152
+ ]
2153
+ }
2154
+ }
2155
+ },
2156
+ "spec": {
2157
+ "type": "object",
2158
+ "required": [
2159
+ "path",
2160
+ "hash"
2161
+ ],
2162
+ "additionalProperties": false,
2163
+ "properties": {
2164
+ "path": {
2165
+ "type": "string",
2166
+ "description": "Path to spec file relative to project root.",
2167
+ "examples": [
2168
+ "app/src/main/assets/extentos.spec.json",
2169
+ "Resources/extentos.spec.json"
2170
+ ]
2171
+ },
2172
+ "hash": {
2173
+ "type": "string",
2174
+ "description": "SHA-256 of spec file contents, prefixed with 'sha256:'. Detects out-of-band edits.",
2175
+ "examples": [
2176
+ "sha256:a1b2c3d4e5f6"
2177
+ ]
2178
+ }
2179
+ }
2180
+ },
2181
+ "generatedFiles": {
2182
+ "type": "array",
2183
+ "description": "Every generated file with metadata.",
2184
+ "items": {
2185
+ "type": "object",
2186
+ "required": [
2187
+ "path",
2188
+ "template",
2189
+ "hash",
2190
+ "generatedAt",
2191
+ "generatedByTool"
2192
+ ],
2193
+ "additionalProperties": false,
2194
+ "properties": {
2195
+ "path": {
2196
+ "type": "string",
2197
+ "description": "Relative path from project root.",
2198
+ "examples": [
2199
+ "app/src/main/java/com/example/myapp/extentos/ExtentosBootstrap.kt"
2200
+ ]
2201
+ },
2202
+ "template": {
2203
+ "type": "string",
2204
+ "enum": [
2205
+ "connection_module",
2206
+ "callback_handler",
2207
+ "stream_consumer"
2208
+ ],
2209
+ "description": "Template name.",
2210
+ "examples": [
2211
+ "connection_module"
2212
+ ]
2213
+ },
2214
+ "hash": {
2215
+ "type": "string",
2216
+ "description": "SHA-256 of file contents at generation time.",
2217
+ "examples": [
2218
+ "sha256:e5f6g7h8"
2219
+ ]
2220
+ },
2221
+ "generatedAt": {
2222
+ "type": "string",
2223
+ "description": "ISO-8601 timestamp.",
2224
+ "examples": [
2225
+ "2026-04-16T12:00:00Z"
2226
+ ]
2227
+ },
2228
+ "generatedByTool": {
2229
+ "type": "string",
2230
+ "description": "MCP tool that created this file.",
2231
+ "examples": [
2232
+ "generateConnectionModule"
2233
+ ]
2234
+ }
2235
+ }
2236
+ }
2237
+ },
2238
+ "gradle": {
2239
+ "type": "object",
2240
+ "required": [
2241
+ "coordinate",
2242
+ "buildFile"
2243
+ ],
2244
+ "additionalProperties": false,
2245
+ "description": "Android only. Mutually exclusive with spm.",
2246
+ "properties": {
2247
+ "coordinate": {
2248
+ "type": "string",
2249
+ "description": "Expected Gradle dependency coordinate.",
2250
+ "examples": [
2251
+ "com.extentos:glasses:1.0.0"
2252
+ ]
2253
+ },
2254
+ "buildFile": {
2255
+ "type": "string",
2256
+ "description": "Path to build.gradle.kts.",
2257
+ "examples": [
2258
+ "app/build.gradle.kts"
2259
+ ]
2260
+ },
2261
+ "additionalArtifacts": {
2262
+ "type": "array",
2263
+ "description": "Additional Gradle dependencies beyond the core coordinate.",
2264
+ "items": {
2265
+ "type": "object",
2266
+ "required": [
2267
+ "coordinate",
2268
+ "configuration"
2269
+ ],
2270
+ "additionalProperties": false,
2271
+ "properties": {
2272
+ "coordinate": {
2273
+ "type": "string",
2274
+ "description": "Gradle coordinate.",
2275
+ "examples": [
2276
+ "com.extentos:glasses-ui:1.0.0"
2277
+ ]
2278
+ },
2279
+ "configuration": {
2280
+ "type": "string",
2281
+ "enum": [
2282
+ "implementation",
2283
+ "debugImplementation"
2284
+ ],
2285
+ "description": "Gradle configuration.",
2286
+ "examples": [
2287
+ "implementation"
2288
+ ]
2289
+ }
2290
+ }
2291
+ }
2292
+ }
2293
+ }
2294
+ },
2295
+ "spm": {
2296
+ "type": "object",
2297
+ "required": [
2298
+ "package",
2299
+ "packageURL",
2300
+ "version",
2301
+ "projectFile"
2302
+ ],
2303
+ "additionalProperties": false,
2304
+ "description": "iOS only. Mutually exclusive with gradle.",
2305
+ "properties": {
2306
+ "package": {
2307
+ "type": "string",
2308
+ "description": "SPM package name.",
2309
+ "examples": [
2310
+ "Extentos"
2311
+ ]
2312
+ },
2313
+ "packageURL": {
2314
+ "type": "string",
2315
+ "description": "Git URL of the Extentos SPM package.",
2316
+ "examples": [
2317
+ "https://github.com/extentos/extentos-ios"
2318
+ ]
2319
+ },
2320
+ "version": {
2321
+ "type": "string",
2322
+ "description": "Resolved SPM version.",
2323
+ "examples": [
2324
+ "1.0.0"
2325
+ ]
2326
+ },
2327
+ "projectFile": {
2328
+ "type": "string",
2329
+ "description": "Path to .xcodeproj/project.pbxproj or Package.swift.",
2330
+ "examples": [
2331
+ "MyApp.xcodeproj/project.pbxproj"
2332
+ ]
2333
+ },
2334
+ "additionalProducts": {
2335
+ "type": "array",
2336
+ "description": "Additional SPM products linked to targets.",
2337
+ "items": {
2338
+ "type": "object",
2339
+ "required": [
2340
+ "product",
2341
+ "target"
2342
+ ],
2343
+ "additionalProperties": false,
2344
+ "properties": {
2345
+ "product": {
2346
+ "type": "string",
2347
+ "description": "SPM product name.",
2348
+ "examples": [
2349
+ "GlassesUI"
2350
+ ]
2351
+ },
2352
+ "target": {
2353
+ "type": "string",
2354
+ "description": "Xcode target name.",
2355
+ "examples": [
2356
+ "MyApp"
2357
+ ]
2358
+ },
2359
+ "debugOnly": {
2360
+ "type": "boolean",
2361
+ "description": "Link only in debug configuration.",
2362
+ "examples": [
2363
+ true
2364
+ ]
2365
+ }
2366
+ }
2367
+ }
2368
+ }
2369
+ }
2370
+ },
2371
+ "permissions": {
2372
+ "type": "array",
2373
+ "description": "Expected platform permissions derived from spec. Android: android.permission.*. iOS: Info.plist keys.",
2374
+ "items": {
2375
+ "type": "string"
2376
+ },
2377
+ "examples": [
2378
+ [
2379
+ "android.permission.BLUETOOTH_CONNECT",
2380
+ "android.permission.CAMERA"
2381
+ ]
2382
+ ]
2383
+ },
2384
+ "integration": {
2385
+ "type": "object",
2386
+ "required": [
2387
+ "blocks",
2388
+ "streams",
2389
+ "triggers",
2390
+ "handlerNames",
2391
+ "togglesOverridden"
2392
+ ],
2393
+ "additionalProperties": false,
2394
+ "properties": {
2395
+ "blocks": {
2396
+ "type": "array",
2397
+ "description": "Block types currently in the spec.",
2398
+ "items": {
2399
+ "type": "string"
2400
+ },
2401
+ "examples": [
2402
+ [
2403
+ "capture_photo"
2404
+ ]
2405
+ ]
2406
+ },
2407
+ "streams": {
2408
+ "type": "array",
2409
+ "description": "Stream types currently in the spec.",
2410
+ "items": {
2411
+ "type": "string"
2412
+ },
2413
+ "examples": [
2414
+ [
2415
+ "transcription_incremental"
2416
+ ]
2417
+ ]
2418
+ },
2419
+ "triggers": {
2420
+ "type": "array",
2421
+ "description": "Trigger types currently in the spec.",
2422
+ "items": {
2423
+ "type": "string"
2424
+ },
2425
+ "examples": [
2426
+ [
2427
+ "voice_command",
2428
+ "fallback"
2429
+ ]
2430
+ ]
2431
+ },
2432
+ "handlerNames": {
2433
+ "type": "array",
2434
+ "description": "app_callback handler names in the spec.",
2435
+ "items": {
2436
+ "type": "string"
2437
+ },
2438
+ "examples": [
2439
+ [
2440
+ "vision"
2441
+ ]
2442
+ ]
2443
+ },
2444
+ "togglesOverridden": {
2445
+ "type": "array",
2446
+ "description": "Toggle keys explicitly set in spec triggers.",
2447
+ "items": {
2448
+ "type": "string"
2449
+ },
2450
+ "examples": [
2451
+ [
2452
+ "battery_save_mode"
2453
+ ]
2454
+ ]
2455
+ }
2456
+ }
2457
+ }
2458
+ }
2459
+ };
2460
+ export const connectionPageSchema = {
2461
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2462
+ "$id": "extentos://schema/connection-page/v1",
2463
+ "type": "object",
2464
+ "required": [
2465
+ "schemaVersion"
2466
+ ],
2467
+ "description": "Optional ExtentosConnectionPage theming and section visibility. All fields beyond schemaVersion are optional; unknown fields are tolerated (additive contract).",
2468
+ "properties": {
2469
+ "schemaVersion": {
2470
+ "type": "integer",
2471
+ "const": 1,
2472
+ "description": "Connection-page config format version. Only 1 is valid for MVP.",
2473
+ "examples": [
2474
+ 1
2475
+ ]
2476
+ },
2477
+ "sections": {
2478
+ "type": "object",
2479
+ "description": "Which sections render on the connection page. Status section always renders.",
2480
+ "properties": {
2481
+ "capabilities": {
2482
+ "type": "boolean",
2483
+ "description": "Show capabilities section. Default true.",
2484
+ "examples": [
2485
+ true
2486
+ ]
2487
+ },
2488
+ "triggers": {
2489
+ "type": "boolean",
2490
+ "description": "Show triggers section. Default true.",
2491
+ "examples": [
2492
+ true
2493
+ ]
2494
+ },
2495
+ "toggles": {
2496
+ "type": "boolean",
2497
+ "description": "Show toggles section. Default true.",
2498
+ "examples": [
2499
+ true
2500
+ ]
2501
+ }
2502
+ }
2503
+ },
2504
+ "appearance": {
2505
+ "type": "object",
2506
+ "description": "Layer 2 theming tokens. Field-by-field merge over built-in Appearance.Default. Any field omitted falls back to default.",
2507
+ "properties": {
2508
+ "colors": {
2509
+ "type": "object",
2510
+ "description": "11 color tokens.",
2511
+ "properties": {
2512
+ "primary": {
2513
+ "type": "string",
2514
+ "description": "Primary accent color, hex.",
2515
+ "examples": [
2516
+ "#3B82F6"
2517
+ ]
2518
+ },
2519
+ "surface": {
2520
+ "type": "string",
2521
+ "description": "Primary surface color.",
2522
+ "examples": [
2523
+ "#0A0A0F"
2524
+ ]
2525
+ },
2526
+ "surfaceVariant": {
2527
+ "type": "string",
2528
+ "description": "Secondary surface color.",
2529
+ "examples": [
2530
+ "#16161A"
2531
+ ]
2532
+ },
2533
+ "onSurface": {
2534
+ "type": "string",
2535
+ "description": "Primary text color on surface.",
2536
+ "examples": [
2537
+ "#FFFFFF"
2538
+ ]
2539
+ },
2540
+ "onSurfaceSecondary": {
2541
+ "type": "string",
2542
+ "description": "Secondary text color on surface.",
2543
+ "examples": [
2544
+ "#A3A3A3"
2545
+ ]
2546
+ },
2547
+ "onSurfaceMuted": {
2548
+ "type": "string",
2549
+ "description": "Muted text color on surface.",
2550
+ "examples": [
2551
+ "#6B7280"
2552
+ ]
2553
+ },
2554
+ "accent": {
2555
+ "type": "string",
2556
+ "description": "Secondary accent color.",
2557
+ "examples": [
2558
+ "#10B981"
2559
+ ]
2560
+ },
2561
+ "success": {
2562
+ "type": "string",
2563
+ "description": "Success color.",
2564
+ "examples": [
2565
+ "#10B981"
2566
+ ]
2567
+ },
2568
+ "warning": {
2569
+ "type": "string",
2570
+ "description": "Warning color.",
2571
+ "examples": [
2572
+ "#F59E0B"
2573
+ ]
2574
+ },
2575
+ "error": {
2576
+ "type": "string",
2577
+ "description": "Error color.",
2578
+ "examples": [
2579
+ "#EF4444"
2580
+ ]
2581
+ },
2582
+ "divider": {
2583
+ "type": "string",
2584
+ "description": "Divider/border color.",
2585
+ "examples": [
2586
+ "#27272A"
2587
+ ]
2588
+ }
2589
+ }
2590
+ },
2591
+ "typography": {
2592
+ "type": "object",
2593
+ "description": "8 typography tokens.",
2594
+ "properties": {
2595
+ "sectionLabel": {
2596
+ "$ref": "#/$defs/font_token"
2597
+ },
2598
+ "statusLabel": {
2599
+ "$ref": "#/$defs/font_token"
2600
+ },
2601
+ "statusSub": {
2602
+ "$ref": "#/$defs/font_token"
2603
+ },
2604
+ "metaLabel": {
2605
+ "$ref": "#/$defs/font_token"
2606
+ },
2607
+ "metaValue": {
2608
+ "$ref": "#/$defs/font_token"
2609
+ },
2610
+ "triggerPhrase": {
2611
+ "$ref": "#/$defs/font_token"
2612
+ },
2613
+ "triggerBadge": {
2614
+ "$ref": "#/$defs/font_token"
2615
+ },
2616
+ "capabilityName": {
2617
+ "$ref": "#/$defs/font_token"
2618
+ }
2619
+ }
2620
+ },
2621
+ "shapes": {
2622
+ "type": "object",
2623
+ "description": "3 shape tokens.",
2624
+ "properties": {
2625
+ "card": {
2626
+ "$ref": "#/$defs/shape_token"
2627
+ },
2628
+ "section": {
2629
+ "$ref": "#/$defs/shape_token"
2630
+ },
2631
+ "chip": {
2632
+ "$ref": "#/$defs/shape_token"
2633
+ }
2634
+ }
2635
+ }
2636
+ }
2637
+ }
2638
+ },
2639
+ "$defs": {
2640
+ "font_token": {
2641
+ "type": "object",
2642
+ "description": "Font token.",
2643
+ "properties": {
2644
+ "family": {
2645
+ "type": "string",
2646
+ "description": "Font family name.",
2647
+ "examples": [
2648
+ "SF Pro Text",
2649
+ "Roboto"
2650
+ ]
2651
+ },
2652
+ "weight": {
2653
+ "type": "integer",
2654
+ "description": "Font weight 100-900.",
2655
+ "examples": [
2656
+ 600
2657
+ ]
2658
+ },
2659
+ "size": {
2660
+ "type": "number",
2661
+ "description": "Font size in sp (Android) / pt (iOS).",
2662
+ "examples": [
2663
+ 14
2664
+ ]
2665
+ },
2666
+ "lineHeight": {
2667
+ "type": "number",
2668
+ "description": "Optional line height multiplier.",
2669
+ "examples": [
2670
+ 1.2
2671
+ ]
2672
+ },
2673
+ "letterSpacing": {
2674
+ "type": "number",
2675
+ "description": "Optional letter spacing em.",
2676
+ "examples": [
2677
+ 0.02
2678
+ ]
2679
+ }
2680
+ }
2681
+ },
2682
+ "shape_token": {
2683
+ "type": "object",
2684
+ "description": "Shape token.",
2685
+ "properties": {
2686
+ "cornerRadius": {
2687
+ "type": "number",
2688
+ "description": "Corner radius in dp (Android) / pt (iOS).",
2689
+ "examples": [
2690
+ 16
2691
+ ]
2692
+ }
2693
+ }
2694
+ }
2695
+ }
2696
+ };
2697
+ //# sourceMappingURL=schemas.js.map