@extentos/mcp-server 0.0.74 → 0.0.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/tools/data/codeExamples.d.ts +53 -0
- package/dist/tools/data/codeExamples.d.ts.map +1 -1
- package/dist/tools/data/codeExamples.js +254 -62
- package/dist/tools/data/codeExamples.js.map +1 -1
- package/dist/tools/data/version.js +7 -7
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +6 -8
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/docs/index.d.ts.map +1 -1
- package/dist/tools/docs/index.js +16 -7
- package/dist/tools/docs/index.js.map +1 -1
- package/dist/tools/handlers/createSimulatorSession.d.ts.map +1 -1
- package/dist/tools/handlers/createSimulatorSession.js +12 -1
- package/dist/tools/handlers/createSimulatorSession.js.map +1 -1
- package/dist/tools/handlers/generateConnectionModule.d.ts.map +1 -1
- package/dist/tools/handlers/generateConnectionModule.js +20 -13
- package/dist/tools/handlers/generateConnectionModule.js.map +1 -1
- package/dist/tools/handlers/getCodeExample.d.ts.map +1 -1
- package/dist/tools/handlers/getCodeExample.js +11 -1
- package/dist/tools/handlers/getCodeExample.js.map +1 -1
- package/dist/tools/handlers/getCredentialGuide.js +57 -8
- package/dist/tools/handlers/getCredentialGuide.js.map +1 -1
- package/dist/tools/handlers/getEventLog.d.ts.map +1 -1
- package/dist/tools/handlers/getEventLog.js +8 -10
- package/dist/tools/handlers/getEventLog.js.map +1 -1
- package/dist/tools/handlers/inspectIntegration.d.ts.map +1 -1
- package/dist/tools/handlers/inspectIntegration.js +8 -3
- package/dist/tools/handlers/inspectIntegration.js.map +1 -1
- package/dist/tools/handlers/validateIntegration.d.ts.map +1 -1
- package/dist/tools/handlers/validateIntegration.js +9 -3
- package/dist/tools/handlers/validateIntegration.js.map +1 -1
- package/dist/tools/util/generatedHash.d.ts +24 -8
- package/dist/tools/util/generatedHash.d.ts.map +1 -1
- package/dist/tools/util/generatedHash.js +88 -11
- package/dist/tools/util/generatedHash.js.map +1 -1
- package/package.json +1 -1
- package/dist/tools/data/examplePatterns.d.ts +0 -4
- package/dist/tools/data/examplePatterns.d.ts.map +0 -1
- package/dist/tools/data/examplePatterns.js +0 -546
- package/dist/tools/data/examplePatterns.js.map +0 -1
- package/dist/tools/data/presetTriggers.d.ts +0 -4
- package/dist/tools/data/presetTriggers.d.ts.map +0 -1
- package/dist/tools/data/presetTriggers.js +0 -47
- package/dist/tools/data/presetTriggers.js.map +0 -1
- package/dist/tools/handlers/generateConsumer.d.ts +0 -3
- package/dist/tools/handlers/generateConsumer.d.ts.map +0 -1
- package/dist/tools/handlers/generateConsumer.js +0 -477
- package/dist/tools/handlers/generateConsumer.js.map +0 -1
- package/dist/tools/handlers/getExampleSpec.d.ts +0 -3
- package/dist/tools/handlers/getExampleSpec.d.ts.map +0 -1
- package/dist/tools/handlers/getExampleSpec.js +0 -50
- package/dist/tools/handlers/getExampleSpec.js.map +0 -1
- package/dist/tools/handlers/initSpec.d.ts +0 -3
- package/dist/tools/handlers/initSpec.d.ts.map +0 -1
- package/dist/tools/handlers/initSpec.js +0 -350
- package/dist/tools/handlers/initSpec.js.map +0 -1
- package/dist/tools/handlers/planIntegration.d.ts +0 -3
- package/dist/tools/handlers/planIntegration.d.ts.map +0 -1
- package/dist/tools/handlers/planIntegration.js +0 -293
- package/dist/tools/handlers/planIntegration.js.map +0 -1
- package/dist/tools/handlers/updateSpec.d.ts +0 -3
- package/dist/tools/handlers/updateSpec.d.ts.map +0 -1
- package/dist/tools/handlers/updateSpec.js +0 -579
- package/dist/tools/handlers/updateSpec.js.map +0 -1
- package/dist/tools/handlers/validateSpec.d.ts +0 -3
- package/dist/tools/handlers/validateSpec.d.ts.map +0 -1
- package/dist/tools/handlers/validateSpec.js +0 -33
- package/dist/tools/handlers/validateSpec.js.map +0 -1
- package/dist/tools/templates/callbackHandler.d.ts +0 -11
- package/dist/tools/templates/callbackHandler.d.ts.map +0 -1
- package/dist/tools/templates/callbackHandler.js +0 -215
- package/dist/tools/templates/callbackHandler.js.map +0 -1
- package/dist/tools/templates/streamConsumer.d.ts +0 -8
- package/dist/tools/templates/streamConsumer.d.ts.map +0 -1
- package/dist/tools/templates/streamConsumer.js +0 -322
- package/dist/tools/templates/streamConsumer.js.map +0 -1
- package/dist/tools/util/userCodeMerge.d.ts +0 -69
- package/dist/tools/util/userCodeMerge.d.ts.map +0 -1
- package/dist/tools/util/userCodeMerge.js +0 -168
- package/dist/tools/util/userCodeMerge.js.map +0 -1
- package/dist/tools/validation/validateSpec.d.ts +0 -22
- package/dist/tools/validation/validateSpec.d.ts.map +0 -1
- package/dist/tools/validation/validateSpec.js +0 -623
- package/dist/tools/validation/validateSpec.js.map +0 -1
|
@@ -1,623 +0,0 @@
|
|
|
1
|
-
// Full spec validator. Runs:
|
|
2
|
-
// 1. JSON Schema (draft 2020-12) via ajv against the embedded extentos-spec.schema.json
|
|
3
|
-
// 2. 13 cross-reference / semantic rules from SPEC_SCHEMA.md § Spec validation rules
|
|
4
|
-
// Rule labels mirror the canonical numbering in the doc.
|
|
5
|
-
import { Ajv2020 } from "ajv/dist/2020.js";
|
|
6
|
-
import { specSchema } from "../../generated/schemas.js";
|
|
7
|
-
import { BLOCK_RETURN_FIELDS } from "../data/capabilities.js";
|
|
8
|
-
import { derivePermissions } from "../util/permissions.js";
|
|
9
|
-
const TOGGLE_KEYS = new Set([
|
|
10
|
-
"listening_mode",
|
|
11
|
-
"camera_streaming_enabled",
|
|
12
|
-
"audio_capture_enabled",
|
|
13
|
-
"transcription_enabled",
|
|
14
|
-
"battery_save_mode",
|
|
15
|
-
"voice_confirmations",
|
|
16
|
-
"audio_video_coexistence_policy",
|
|
17
|
-
"privacy_mode",
|
|
18
|
-
]);
|
|
19
|
-
const HARDWARE_STATE_FIELDS = new Set([
|
|
20
|
-
"hardware_state.connected",
|
|
21
|
-
"hardware_state.thermal",
|
|
22
|
-
"hardware_state.battery",
|
|
23
|
-
"hardware_state.audio_route",
|
|
24
|
-
]);
|
|
25
|
-
const TRIGGER_PAYLOAD_PREFIX = "trigger_payload.";
|
|
26
|
-
const TOGGLES_PREFIX = "toggles.";
|
|
27
|
-
const HARDWARE_STATE_PREFIX = "hardware_state.";
|
|
28
|
-
const WRAPPER_ACTION_TYPES = new Set(["retry_with_backoff", "when_connected"]);
|
|
29
|
-
const AUDIO_ROUTES = new Set([
|
|
30
|
-
"glasses_speaker",
|
|
31
|
-
"phone_speaker",
|
|
32
|
-
"bluetooth_earbuds",
|
|
33
|
-
"wired_earbuds",
|
|
34
|
-
]);
|
|
35
|
-
const THERMAL_LEVELS = new Set(["none", "light", "moderate", "severe", "critical"]);
|
|
36
|
-
const ID_PATTERN = /^[a-z][a-z0-9_]{0,31}$/;
|
|
37
|
-
const TEMPLATE_PATTERN = /\{\{([a-zA-Z0-9_.]+)\}\}/g;
|
|
38
|
-
let cachedAjv = null;
|
|
39
|
-
let cachedValidate = null;
|
|
40
|
-
function ensureAjv() {
|
|
41
|
-
if (cachedAjv && cachedValidate)
|
|
42
|
-
return { ajv: cachedAjv, validate: cachedValidate };
|
|
43
|
-
const ajv = new Ajv2020({ allErrors: true, strict: false });
|
|
44
|
-
const validate = ajv.compile(specSchema);
|
|
45
|
-
cachedAjv = ajv;
|
|
46
|
-
cachedValidate = validate;
|
|
47
|
-
return { ajv, validate };
|
|
48
|
-
}
|
|
49
|
-
export function validateSpec(spec) {
|
|
50
|
-
const errors = [];
|
|
51
|
-
const warnings = [];
|
|
52
|
-
const { validate } = ensureAjv();
|
|
53
|
-
const schemaOk = validate(spec);
|
|
54
|
-
if (!schemaOk && Array.isArray(validate.errors)) {
|
|
55
|
-
const raw = validate.errors;
|
|
56
|
-
errors.push(...collapseAjvErrors(raw));
|
|
57
|
-
}
|
|
58
|
-
if (!spec || typeof spec !== "object") {
|
|
59
|
-
return emptyResult(errors, warnings);
|
|
60
|
-
}
|
|
61
|
-
const s = spec;
|
|
62
|
-
// Rule 1: extentos_version
|
|
63
|
-
if (!s.extentos_version) {
|
|
64
|
-
errors.push({
|
|
65
|
-
path: "/extentos_version",
|
|
66
|
-
rule: "R1:VersionMissing",
|
|
67
|
-
message: "extentos_version is required.",
|
|
68
|
-
suggestion: 'Add "extentos_version": "1.0" at the top level.',
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
else if (s.extentos_version !== "1.0") {
|
|
72
|
-
errors.push({
|
|
73
|
-
path: "/extentos_version",
|
|
74
|
-
rule: "R1:VersionUnknown",
|
|
75
|
-
message: `Unsupported extentos_version ${JSON.stringify(s.extentos_version)}; only "1.0" is valid for MVP.`,
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
// Rule 2: target.vendor
|
|
79
|
-
const target = s.target;
|
|
80
|
-
if (!target || !target.vendor) {
|
|
81
|
-
errors.push({
|
|
82
|
-
path: "/target/vendor",
|
|
83
|
-
rule: "R2:VendorMissing",
|
|
84
|
-
message: "target.vendor is required.",
|
|
85
|
-
suggestion: 'Add "target": { "vendor": "meta_rayban" }.',
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
else if (target.vendor !== "meta_rayban") {
|
|
89
|
-
errors.push({
|
|
90
|
-
path: "/target/vendor",
|
|
91
|
-
rule: "R2:VendorUnknown",
|
|
92
|
-
message: `Unknown target.vendor ${JSON.stringify(target.vendor)}; only "meta_rayban" is supported for MVP.`,
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
const blocks = Array.isArray(s.blocks) ? s.blocks : [];
|
|
96
|
-
const streams = Array.isArray(s.streams) ? s.streams : [];
|
|
97
|
-
const triggers = Array.isArray(s.triggers) ? s.triggers : [];
|
|
98
|
-
// Rule 5: id uniqueness & pattern across blocks, streams
|
|
99
|
-
const usedIds = new Map();
|
|
100
|
-
function claimId(where, value, path) {
|
|
101
|
-
if (typeof value !== "string")
|
|
102
|
-
return null;
|
|
103
|
-
if (!ID_PATTERN.test(value)) {
|
|
104
|
-
errors.push({
|
|
105
|
-
path,
|
|
106
|
-
rule: "R5:IdPattern",
|
|
107
|
-
message: `id "${value}" must match ${ID_PATTERN}.`,
|
|
108
|
-
});
|
|
109
|
-
return null;
|
|
110
|
-
}
|
|
111
|
-
const prior = usedIds.get(value);
|
|
112
|
-
if (prior) {
|
|
113
|
-
errors.push({
|
|
114
|
-
path,
|
|
115
|
-
rule: "R5:IdDuplicate",
|
|
116
|
-
message: `id "${value}" is already used in ${prior}.`,
|
|
117
|
-
});
|
|
118
|
-
return null;
|
|
119
|
-
}
|
|
120
|
-
usedIds.set(value, where);
|
|
121
|
-
return value;
|
|
122
|
-
}
|
|
123
|
-
blocks.forEach((b, i) => {
|
|
124
|
-
claimId(`blocks[${i}]`, b.id, `/blocks/${i}/id`);
|
|
125
|
-
checkBlockStopConditions(b, i, warnings);
|
|
126
|
-
});
|
|
127
|
-
streams.forEach((st, i) => claimId(`streams[${i}]`, st.id, `/streams/${i}/id`));
|
|
128
|
-
// Phase 6 §4.1 — concurrent audio_chunks + transcription_incremental on
|
|
129
|
-
// Android may degrade STT depending on the OEM audio framework. Library
|
|
130
|
-
// emits a runtime probe Log.w when this is observed; validateIntegration
|
|
131
|
-
// surfaces it pre-flight so the agent can flag the risk in code review.
|
|
132
|
-
const hasAudioChunks = streams.some((st) => st.type === "audio_chunks");
|
|
133
|
-
const hasTranscription = streams.some((st) => st.type === "transcription_incremental");
|
|
134
|
-
if (hasAudioChunks && hasTranscription) {
|
|
135
|
-
warnings.push({
|
|
136
|
-
path: "/streams",
|
|
137
|
-
rule: "R-Phase6:ConcurrentAudioStreams",
|
|
138
|
-
message: "Both audio_chunks and transcription_incremental are declared. On Android, some OEM audio frameworks (notably Samsung) degrade SpeechRecognizer when AudioRecord is also active on the SCO mic. The library emits a runtime warning to Logcat with kind \"stt_audio_conflict\" if STT produces no output in the first 5 seconds.",
|
|
139
|
-
suggestion: "Verify on real Android hardware (Pixel + Samsung). If STT silently fails, drop audio_chunks for the duration the spec needs transcription, or split into two specs the agent loads conditionally.",
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
// Triggers participate in id uniqueness per the same rule surface
|
|
143
|
-
triggers.forEach((t, i) => {
|
|
144
|
-
if (t.id !== undefined)
|
|
145
|
-
claimId(`triggers[${i}]`, t.id, `/triggers/${i}/id`);
|
|
146
|
-
});
|
|
147
|
-
// Rule 8: only one fallback trigger
|
|
148
|
-
const fallbackCount = triggers.filter((t) => t.type === "fallback").length;
|
|
149
|
-
if (fallbackCount > 1) {
|
|
150
|
-
errors.push({
|
|
151
|
-
path: "/triggers",
|
|
152
|
-
rule: "R8:FallbackOnce",
|
|
153
|
-
message: `Found ${fallbackCount} fallback triggers; at most one is allowed.`,
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
// Rule 7: mode: parallel reserved
|
|
157
|
-
triggers.forEach((t, i) => {
|
|
158
|
-
if (t.mode === "parallel") {
|
|
159
|
-
errors.push({
|
|
160
|
-
path: `/triggers/${i}/mode`,
|
|
161
|
-
rule: "R7:ParallelReserved",
|
|
162
|
-
message: 'mode: "parallel" is reserved and not allowed.',
|
|
163
|
-
suggestion: "Use mode: restart | single | queued.",
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
});
|
|
167
|
-
// Per-trigger action walking — branch depth, wrapper nesting, set_toggle keys, template refs
|
|
168
|
-
const blockIds = new Set(blocks.map((b) => b.id).filter((x) => typeof x === "string"));
|
|
169
|
-
// R13: track each block's type so we can resolve `block_call save_as` bindings
|
|
170
|
-
// back to their declared block-output schema (BLOCK_RETURN_FIELDS).
|
|
171
|
-
const blockTypeById = new Map();
|
|
172
|
-
for (const b of blocks) {
|
|
173
|
-
if (typeof b.id === "string" && typeof b.type === "string") {
|
|
174
|
-
blockTypeById.set(b.id, b.type);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
const handlerNames = new Set();
|
|
178
|
-
let actionCount = 0;
|
|
179
|
-
triggers.forEach((trigger, ti) => {
|
|
180
|
-
const triggerPath = `/triggers/${ti}`;
|
|
181
|
-
// R13: knownVars maps each declared variable to a typed binding so
|
|
182
|
-
// template field paths can be validated against the bound block's
|
|
183
|
-
// returns set. block_call.save_as → "block_returns" with the block type;
|
|
184
|
-
// app_callback / set_variable / ask_user / voice_command captures →
|
|
185
|
-
// "free" (no field schema available).
|
|
186
|
-
const knownVars = new Map();
|
|
187
|
-
if (trigger.type === "voice_command" && typeof trigger.phrase === "string") {
|
|
188
|
-
// Named captures are promoted to top-level variables
|
|
189
|
-
const capturePattern = /\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g;
|
|
190
|
-
let m;
|
|
191
|
-
while ((m = capturePattern.exec(trigger.phrase)) !== null) {
|
|
192
|
-
knownVars.set(m[1], { kind: "free" });
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
const actions = Array.isArray(trigger.actions) ? trigger.actions : [];
|
|
196
|
-
walkActions(actions, `${triggerPath}/actions`, 0, knownVars, {
|
|
197
|
-
errors,
|
|
198
|
-
warnings,
|
|
199
|
-
blockIds,
|
|
200
|
-
blockTypeById,
|
|
201
|
-
handlerNames,
|
|
202
|
-
countAction: () => actionCount++,
|
|
203
|
-
});
|
|
204
|
-
});
|
|
205
|
-
// Validate block_call references to block ids
|
|
206
|
-
triggers.forEach((trigger, ti) => {
|
|
207
|
-
const actions = Array.isArray(trigger.actions) ? trigger.actions : [];
|
|
208
|
-
actions.forEach((a, ai) => checkBlockCallRefs(a, `/triggers/${ti}/actions/${ai}`, blockIds, errors));
|
|
209
|
-
});
|
|
210
|
-
// Derived permissions (minimal surface — expanded by getPermissions tool)
|
|
211
|
-
const permissions = derivePermissions(blocks, streams, triggers);
|
|
212
|
-
const valid = errors.length === 0;
|
|
213
|
-
return {
|
|
214
|
-
status: valid ? "valid" : "invalid",
|
|
215
|
-
valid,
|
|
216
|
-
errors,
|
|
217
|
-
warnings,
|
|
218
|
-
stats: {
|
|
219
|
-
blocks: blocks.length,
|
|
220
|
-
streams: streams.length,
|
|
221
|
-
triggers: triggers.length,
|
|
222
|
-
actions: actionCount,
|
|
223
|
-
handlerNames: [...handlerNames].sort(),
|
|
224
|
-
permissions,
|
|
225
|
-
},
|
|
226
|
-
};
|
|
227
|
-
}
|
|
228
|
-
// Phase 6 §2.3 — only `voice_command` stop conditions fire at runtime;
|
|
229
|
-
// other types are accepted by the spec parser (so legal specs round-trip)
|
|
230
|
-
// but no-op on real hardware. Surface a warning so the agent doesn't
|
|
231
|
-
// silently rely on them. Mirrors the library-side warnings in
|
|
232
|
-
// android-library/.../SpecValidator.kt + ios-library/.../SpecValidator.swift.
|
|
233
|
-
function checkBlockStopConditions(block, index, warnings) {
|
|
234
|
-
const blockType = block.type;
|
|
235
|
-
if (blockType !== "capture_video" && blockType !== "record_audio")
|
|
236
|
-
return;
|
|
237
|
-
const params = block.params;
|
|
238
|
-
if (!params)
|
|
239
|
-
return;
|
|
240
|
-
const stopConditions = params.stop_conditions;
|
|
241
|
-
if (!Array.isArray(stopConditions))
|
|
242
|
-
return;
|
|
243
|
-
stopConditions.forEach((sc, sci) => {
|
|
244
|
-
if (typeof sc !== "object" || sc === null)
|
|
245
|
-
return;
|
|
246
|
-
const type = sc.type;
|
|
247
|
-
if (type === "voice_command")
|
|
248
|
-
return;
|
|
249
|
-
if (type !== "capture_button" && type !== "tap" && type !== "double_tap" && type !== "ai_vision")
|
|
250
|
-
return;
|
|
251
|
-
warnings.push({
|
|
252
|
-
path: `/blocks/${index}/params/stop_conditions/${sci}`,
|
|
253
|
-
rule: "R-Phase6:StopConditionDeferred",
|
|
254
|
-
message: `stop_condition type "${type}" is accepted by the spec format but not yet enforced at runtime in Phase 6. Only "voice_command" stop conditions fire on real hardware.`,
|
|
255
|
-
suggestion: 'Use a voice_command stop condition (e.g. { type: "voice_command", phrase: "stop" }) for now. Hardware-event stop conditions unblock when Meta DAT exposes button/gesture events to third-party apps.',
|
|
256
|
-
});
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
function walkActions(actions, basePath, branchDepth, knownVars, ctx, inWrapper = false) {
|
|
260
|
-
actions.forEach((action, idx) => {
|
|
261
|
-
ctx.countAction();
|
|
262
|
-
const path = `${basePath}/${idx}`;
|
|
263
|
-
const type = action.type;
|
|
264
|
-
if (type === "branch") {
|
|
265
|
-
// Rule 3
|
|
266
|
-
if (branchDepth >= 1) {
|
|
267
|
-
ctx.errors.push({
|
|
268
|
-
path,
|
|
269
|
-
rule: "R3:BranchDepth",
|
|
270
|
-
message: "branch is nested inside another branch; max depth is 1.",
|
|
271
|
-
suggestion: "Flatten the logic using sibling actions or a set_variable gate.",
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
checkTemplatesInObject(action.condition, `${path}/condition`, knownVars, ctx);
|
|
275
|
-
const thenActions = Array.isArray(action.then) ? action.then : [];
|
|
276
|
-
const elseActions = Array.isArray(action.else) ? action.else : [];
|
|
277
|
-
walkActions(thenActions, `${path}/then`, branchDepth + 1, knownVars, ctx, inWrapper);
|
|
278
|
-
walkActions(elseActions, `${path}/else`, branchDepth + 1, knownVars, ctx, inWrapper);
|
|
279
|
-
return;
|
|
280
|
-
}
|
|
281
|
-
if (type === "set_toggle") {
|
|
282
|
-
const key = action.key;
|
|
283
|
-
if (typeof key !== "string" || !TOGGLE_KEYS.has(key)) {
|
|
284
|
-
ctx.errors.push({
|
|
285
|
-
path: `${path}/key`,
|
|
286
|
-
rule: "R10:UnknownToggle",
|
|
287
|
-
message: `set_toggle.key ${JSON.stringify(key)} is not a known toggle name.`,
|
|
288
|
-
suggestion: `Known toggles: ${[...TOGGLE_KEYS].sort().join(", ")}.`,
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
if (type === "retry_with_backoff" || type === "when_connected") {
|
|
293
|
-
if (inWrapper) {
|
|
294
|
-
ctx.errors.push({
|
|
295
|
-
path,
|
|
296
|
-
rule: "R11:WrapperNesting",
|
|
297
|
-
message: `${type} cannot be nested inside another wrapper action.`,
|
|
298
|
-
});
|
|
299
|
-
}
|
|
300
|
-
// Rule 12: when_connected.require predicates
|
|
301
|
-
if (type === "when_connected" && Array.isArray(action.require)) {
|
|
302
|
-
for (let i = 0; i < action.require.length; i++) {
|
|
303
|
-
const pred = action.require[i];
|
|
304
|
-
if (typeof pred !== "string" || !isValidWhenConnectedPredicate(pred)) {
|
|
305
|
-
ctx.errors.push({
|
|
306
|
-
path: `${path}/require/${i}`,
|
|
307
|
-
rule: "R12:UnknownPredicate",
|
|
308
|
-
message: `when_connected.require predicate ${JSON.stringify(pred)} is not a known form.`,
|
|
309
|
-
suggestion: "Valid: connected, phone_battery_above:<0-100>, thermal_below:<level>, audio_route:<route>, toggle_on:<key>, toggle_off:<key>.",
|
|
310
|
-
});
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
// Wrappers contain a single nested action
|
|
315
|
-
const wrapped = action.action;
|
|
316
|
-
if (wrapped) {
|
|
317
|
-
if (typeof wrapped.type === "string" && WRAPPER_ACTION_TYPES.has(wrapped.type)) {
|
|
318
|
-
ctx.errors.push({
|
|
319
|
-
path: `${path}/action`,
|
|
320
|
-
rule: "R11:WrapperNesting",
|
|
321
|
-
message: `${type} wraps a ${wrapped.type}; wrapper actions may not nest other wrapper actions.`,
|
|
322
|
-
});
|
|
323
|
-
}
|
|
324
|
-
walkActions([wrapped], `${path}/action`, branchDepth, knownVars, ctx, true);
|
|
325
|
-
}
|
|
326
|
-
return;
|
|
327
|
-
}
|
|
328
|
-
// Variables produced by this action flow forward. block_call carries
|
|
329
|
-
// the block's typed returns schema for R13; the others are "free" since
|
|
330
|
-
// the spec format gives us no field-level guarantee.
|
|
331
|
-
if (type === "block_call" && typeof action.save_as === "string") {
|
|
332
|
-
const blockId = typeof action.block_id === "string" ? action.block_id : null;
|
|
333
|
-
const blockType = blockId ? ctx.blockTypeById.get(blockId) : undefined;
|
|
334
|
-
knownVars.set(action.save_as, blockType !== undefined
|
|
335
|
-
? { kind: "block_returns", blockType }
|
|
336
|
-
: { kind: "free" });
|
|
337
|
-
}
|
|
338
|
-
if (type === "app_callback") {
|
|
339
|
-
if (typeof action.handler === "string")
|
|
340
|
-
ctx.handlerNames.add(action.handler);
|
|
341
|
-
if (typeof action.save_as === "string")
|
|
342
|
-
knownVars.set(action.save_as, { kind: "free" });
|
|
343
|
-
}
|
|
344
|
-
if (type === "set_variable" && typeof action.name === "string") {
|
|
345
|
-
knownVars.set(action.name, { kind: "free" });
|
|
346
|
-
}
|
|
347
|
-
if (type === "ask_user" && typeof action.save_as === "string") {
|
|
348
|
-
knownVars.set(action.save_as, { kind: "free" });
|
|
349
|
-
}
|
|
350
|
-
checkTemplatesInObject(action, path, knownVars, ctx);
|
|
351
|
-
});
|
|
352
|
-
}
|
|
353
|
-
function isValidWhenConnectedPredicate(p) {
|
|
354
|
-
if (p === "connected")
|
|
355
|
-
return true;
|
|
356
|
-
const batteryMatch = /^phone_battery_above:(\d{1,3})$/.exec(p);
|
|
357
|
-
if (batteryMatch) {
|
|
358
|
-
const n = Number(batteryMatch[1]);
|
|
359
|
-
return n >= 0 && n <= 100;
|
|
360
|
-
}
|
|
361
|
-
const thermalMatch = /^thermal_below:(\w+)$/.exec(p);
|
|
362
|
-
if (thermalMatch)
|
|
363
|
-
return THERMAL_LEVELS.has(thermalMatch[1]);
|
|
364
|
-
const audioMatch = /^audio_route:(\w+)$/.exec(p);
|
|
365
|
-
if (audioMatch)
|
|
366
|
-
return AUDIO_ROUTES.has(audioMatch[1]);
|
|
367
|
-
const toggleMatch = /^toggle_(on|off):(\w+)$/.exec(p);
|
|
368
|
-
if (toggleMatch)
|
|
369
|
-
return TOGGLE_KEYS.has(toggleMatch[2]);
|
|
370
|
-
return false;
|
|
371
|
-
}
|
|
372
|
-
function checkTemplatesInObject(obj, path, knownVars, ctx) {
|
|
373
|
-
walkTemplates(obj, path, (template, ownerPath) => {
|
|
374
|
-
const dotIndex = template.indexOf(".");
|
|
375
|
-
const root = dotIndex === -1 ? template : template.slice(0, dotIndex);
|
|
376
|
-
if (template.startsWith(TOGGLES_PREFIX) ||
|
|
377
|
-
template.startsWith(HARDWARE_STATE_PREFIX) ||
|
|
378
|
-
template.startsWith(TRIGGER_PAYLOAD_PREFIX) ||
|
|
379
|
-
HARDWARE_STATE_FIELDS.has(template)) {
|
|
380
|
-
return;
|
|
381
|
-
}
|
|
382
|
-
const binding = knownVars.get(root);
|
|
383
|
-
if (binding === undefined) {
|
|
384
|
-
ctx.errors.push({
|
|
385
|
-
path: ownerPath,
|
|
386
|
-
rule: "R6:TemplateUnresolved",
|
|
387
|
-
message: `Template {{${template}}} does not resolve to any variable written earlier, toggle, trigger_payload, or hardware_state.`,
|
|
388
|
-
suggestion: "Produce the variable earlier in the flow via block_call.save_as / app_callback.save_as / set_variable, or reference toggles.<key>, trigger_payload.<field>, or hardware_state.<field>.",
|
|
389
|
-
});
|
|
390
|
-
return;
|
|
391
|
-
}
|
|
392
|
-
// R13 — only block_call save_as bindings carry a typed returns schema.
|
|
393
|
-
// app_callback save_as / set_variable / ask_user / voice_command captures
|
|
394
|
-
// are JSON-shaped at runtime but the spec format gives no field guarantee,
|
|
395
|
-
// so we don't enforce field paths on them.
|
|
396
|
-
if (binding.kind !== "block_returns")
|
|
397
|
-
return;
|
|
398
|
-
if (dotIndex === -1)
|
|
399
|
-
return; // bare {{clip}} is allowed; resolves to URI for capture_photo / capture_video
|
|
400
|
-
const tail = template.slice(dotIndex + 1);
|
|
401
|
-
// Only validate single-hop field references — `{{clip.duration_ms}}`.
|
|
402
|
-
// Multi-hop (`{{clip.foo.bar}}`) into a flat returns shape is nonsense
|
|
403
|
-
// at runtime but emit it as the same R13 with the first-hop field, which
|
|
404
|
-
// is what would fail to resolve. If the first hop IS valid (e.g. an
|
|
405
|
-
// unforeseen nested-object return), we let it pass to avoid false
|
|
406
|
-
// positives — the resolver is the ultimate authority.
|
|
407
|
-
const firstField = tail.indexOf(".") === -1 ? tail : tail.slice(0, tail.indexOf("."));
|
|
408
|
-
const fields = BLOCK_RETURN_FIELDS[binding.blockType];
|
|
409
|
-
if (fields === undefined)
|
|
410
|
-
return; // block type not in the catalog (extension or new)
|
|
411
|
-
if (fields.has(firstField))
|
|
412
|
-
return;
|
|
413
|
-
const known = [...fields].sort().join(", ");
|
|
414
|
-
const suggestion = closestField(firstField, fields);
|
|
415
|
-
ctx.errors.push({
|
|
416
|
-
path: ownerPath,
|
|
417
|
-
rule: "R13:UnknownReturnField",
|
|
418
|
-
message: `Template {{${template}}} references field "${firstField}" on a ${binding.blockType} block_call binding, but ${binding.blockType} returns only { ${known} }.`,
|
|
419
|
-
suggestion: suggestion
|
|
420
|
-
? `Did you mean "{{${root}.${suggestion}}}"? Field names are snake_case to match the runtime payload — \`{{clip.duration_ms}}\`, NOT \`{{clip.durationMs}}\`.`
|
|
421
|
-
: `Field names are snake_case to match the runtime payload — e.g. \`{{clip.duration_ms}}\`, NOT \`{{clip.durationMs}}\`. Available: ${known}.`,
|
|
422
|
-
});
|
|
423
|
-
});
|
|
424
|
-
}
|
|
425
|
-
// Minimal Levenshtein closest-match suggester — only used when R13 fails so a
|
|
426
|
-
// 4-element loop per error is fine. Returns the closest field if its edit
|
|
427
|
-
// distance is <= 3 (catches camelCase/typos but not totally-different names).
|
|
428
|
-
function closestField(input, candidates) {
|
|
429
|
-
let best;
|
|
430
|
-
let bestDist = Number.POSITIVE_INFINITY;
|
|
431
|
-
for (const c of candidates) {
|
|
432
|
-
const d = editDistance(input, c);
|
|
433
|
-
if (d < bestDist) {
|
|
434
|
-
best = c;
|
|
435
|
-
bestDist = d;
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
return bestDist <= 3 ? best : undefined;
|
|
439
|
-
}
|
|
440
|
-
function editDistance(a, b) {
|
|
441
|
-
if (a === b)
|
|
442
|
-
return 0;
|
|
443
|
-
const m = a.length;
|
|
444
|
-
const n = b.length;
|
|
445
|
-
if (m === 0)
|
|
446
|
-
return n;
|
|
447
|
-
if (n === 0)
|
|
448
|
-
return m;
|
|
449
|
-
const prev = new Array(n + 1);
|
|
450
|
-
const curr = new Array(n + 1);
|
|
451
|
-
for (let j = 0; j <= n; j++)
|
|
452
|
-
prev[j] = j;
|
|
453
|
-
for (let i = 1; i <= m; i++) {
|
|
454
|
-
curr[0] = i;
|
|
455
|
-
for (let j = 1; j <= n; j++) {
|
|
456
|
-
const cost = a.charCodeAt(i - 1) === b.charCodeAt(j - 1) ? 0 : 1;
|
|
457
|
-
curr[j] = Math.min(curr[j - 1] + 1, prev[j] + 1, prev[j - 1] + cost);
|
|
458
|
-
}
|
|
459
|
-
for (let j = 0; j <= n; j++)
|
|
460
|
-
prev[j] = curr[j];
|
|
461
|
-
}
|
|
462
|
-
return prev[n];
|
|
463
|
-
}
|
|
464
|
-
function walkTemplates(v, path, onFound) {
|
|
465
|
-
if (typeof v === "string") {
|
|
466
|
-
let m;
|
|
467
|
-
TEMPLATE_PATTERN.lastIndex = 0;
|
|
468
|
-
while ((m = TEMPLATE_PATTERN.exec(v)) !== null) {
|
|
469
|
-
onFound(m[1], path);
|
|
470
|
-
}
|
|
471
|
-
return;
|
|
472
|
-
}
|
|
473
|
-
if (Array.isArray(v)) {
|
|
474
|
-
v.forEach((item, i) => walkTemplates(item, `${path}/${i}`, onFound));
|
|
475
|
-
return;
|
|
476
|
-
}
|
|
477
|
-
if (v && typeof v === "object") {
|
|
478
|
-
for (const [k, val] of Object.entries(v)) {
|
|
479
|
-
walkTemplates(val, `${path}/${k}`, onFound);
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
function checkBlockCallRefs(action, path, blockIds, errors) {
|
|
484
|
-
if (action.type === "block_call" && typeof action.block_id === "string" && !blockIds.has(action.block_id)) {
|
|
485
|
-
errors.push({
|
|
486
|
-
path: `${path}/block_id`,
|
|
487
|
-
rule: "X:UnknownBlockRef",
|
|
488
|
-
message: `block_call references block_id "${action.block_id}" which is not declared in the blocks array.`,
|
|
489
|
-
});
|
|
490
|
-
}
|
|
491
|
-
if (action.type === "branch") {
|
|
492
|
-
const thenA = Array.isArray(action.then) ? action.then : [];
|
|
493
|
-
const elseA = Array.isArray(action.else) ? action.else : [];
|
|
494
|
-
thenA.forEach((a, i) => checkBlockCallRefs(a, `${path}/then/${i}`, blockIds, errors));
|
|
495
|
-
elseA.forEach((a, i) => checkBlockCallRefs(a, `${path}/else/${i}`, blockIds, errors));
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
// Collapses Ajv's oneOf cascade into digestible diagnostics. A single
|
|
499
|
-
// malformed action against a 15-variant oneOf can emit 300+ errors by default
|
|
500
|
-
// — one const failure per alternative discriminator, PLUS one required-field
|
|
501
|
-
// failure per alternative at the parent path. Agents choke on that. We fold
|
|
502
|
-
// each path into a single "no_matching_variant" entry when the cascade
|
|
503
|
-
// pattern is detected, dedupe the rest, cap total output, and enrich
|
|
504
|
-
// additionalProperties errors with the offending key name (F-R4-11).
|
|
505
|
-
const MAX_ERRORS = 50;
|
|
506
|
-
const CASCADE_THRESHOLD = 5;
|
|
507
|
-
function collapseAjvErrors(raw) {
|
|
508
|
-
const byPath = new Map();
|
|
509
|
-
for (const e of raw) {
|
|
510
|
-
const path = e.instancePath || "/";
|
|
511
|
-
const bucket = byPath.get(path);
|
|
512
|
-
if (bucket)
|
|
513
|
-
bucket.push(e);
|
|
514
|
-
else
|
|
515
|
-
byPath.set(path, [e]);
|
|
516
|
-
}
|
|
517
|
-
const collapsed = [];
|
|
518
|
-
for (const [path, bucket] of byPath) {
|
|
519
|
-
const hasConstFailure = bucket.some((e) => e.keyword === "const");
|
|
520
|
-
const hasOneOfFailure = bucket.some((e) => e.keyword === "oneOf");
|
|
521
|
-
const requiredCount = bucket.filter((e) => e.keyword === "required").length;
|
|
522
|
-
// Pattern A — type-field discriminator cascade. Path is something like
|
|
523
|
-
// /triggers/0/type or /blocks/0/type and the bucket is full of const
|
|
524
|
-
// failures (one per non-matching variant). Replace with a single
|
|
525
|
-
// no_matching_variant entry that also calls out the snake_case footgun.
|
|
526
|
-
if (bucket.length >= CASCADE_THRESHOLD && hasConstFailure) {
|
|
527
|
-
collapsed.push({
|
|
528
|
-
path,
|
|
529
|
-
rule: "schema:no_matching_variant",
|
|
530
|
-
message: "Value does not match any allowed variant at this path. Most common cause: wrong `type` value, or spec field names in camelCase — spec uses snake_case (e.g. `block_id`, `save_as`, `match_mode`, not `blockId`, `saveAs`, `matchMode`).",
|
|
531
|
-
suggestion: "Verify the `type` string is in the allowed set and that sibling field names are snake_case.",
|
|
532
|
-
});
|
|
533
|
-
continue;
|
|
534
|
-
}
|
|
535
|
-
// Pattern B — parent-object oneOf cascade (F-R4-14). Path is the parent
|
|
536
|
-
// object (e.g. /triggers/0/actions/2) and AJV reported BOTH a oneOf
|
|
537
|
-
// failure AND many `required` failures (one per non-matching variant's
|
|
538
|
-
// missing required fields). The required errors are pure cascade noise
|
|
539
|
-
// — the actual root cause is at a deeper path (a /type discriminator
|
|
540
|
-
// mismatch, a pattern violation on a sibling field like /save_as, or an
|
|
541
|
-
// additionalProperties on a nested params object). Collapse all the
|
|
542
|
-
// required-cascade errors into one pointer; preserve any non-required,
|
|
543
|
-
// non-oneOf errors at this level (rare, but possible).
|
|
544
|
-
if (hasOneOfFailure && requiredCount >= CASCADE_THRESHOLD) {
|
|
545
|
-
collapsed.push({
|
|
546
|
-
path,
|
|
547
|
-
rule: "schema:no_matching_variant",
|
|
548
|
-
message: "No variant of this oneOf union matched. Most common causes: wrong `type` discriminator, an unknown field at this path (look for additionalProperties errors at child paths), or a sibling field with an invalid format (look for pattern / enum / type errors at child paths). The cascade of \"must have required property X\" errors from non-matching variants has been suppressed — check deeper paths under this one for the precise issue.",
|
|
549
|
-
suggestion: "Look at sibling errors below this path for the actual root cause.",
|
|
550
|
-
});
|
|
551
|
-
const seen = new Set();
|
|
552
|
-
for (const e of bucket) {
|
|
553
|
-
if (e.keyword === "required" || e.keyword === "oneOf")
|
|
554
|
-
continue;
|
|
555
|
-
const key = `${e.keyword}|${e.message ?? ""}`;
|
|
556
|
-
if (seen.has(key))
|
|
557
|
-
continue;
|
|
558
|
-
seen.add(key);
|
|
559
|
-
collapsed.push({
|
|
560
|
-
path,
|
|
561
|
-
rule: `schema:${e.keyword}`,
|
|
562
|
-
message: enrichAjvMessage(e),
|
|
563
|
-
});
|
|
564
|
-
}
|
|
565
|
-
continue;
|
|
566
|
-
}
|
|
567
|
-
// Normal path — dedupe and emit, enriching additionalProperties with the
|
|
568
|
-
// offending key (F-R4-11) and required with the missing field.
|
|
569
|
-
const seen = new Set();
|
|
570
|
-
for (const e of bucket) {
|
|
571
|
-
const enriched = enrichAjvMessage(e);
|
|
572
|
-
const key = `${e.keyword}|${enriched}`;
|
|
573
|
-
if (seen.has(key))
|
|
574
|
-
continue;
|
|
575
|
-
seen.add(key);
|
|
576
|
-
collapsed.push({
|
|
577
|
-
path,
|
|
578
|
-
rule: `schema:${e.keyword}`,
|
|
579
|
-
message: enriched,
|
|
580
|
-
});
|
|
581
|
-
}
|
|
582
|
-
}
|
|
583
|
-
if (collapsed.length > MAX_ERRORS) {
|
|
584
|
-
return [
|
|
585
|
-
...collapsed.slice(0, MAX_ERRORS),
|
|
586
|
-
{
|
|
587
|
-
path: "/",
|
|
588
|
-
rule: "schema:errors_truncated",
|
|
589
|
-
message: `${collapsed.length - MAX_ERRORS} further errors suppressed. Fix the errors above and re-run validateSpec.`,
|
|
590
|
-
},
|
|
591
|
-
];
|
|
592
|
-
}
|
|
593
|
-
return collapsed;
|
|
594
|
-
}
|
|
595
|
-
// Enrich AJV error messages with the offending property name where known.
|
|
596
|
-
// AJV exposes the offender via error.params (e.g. params.additionalProperty,
|
|
597
|
-
// params.missingProperty). Without this, agents see "must NOT have additional
|
|
598
|
-
// properties" and have to guess which key is the offender — F-R4-11 from R4
|
|
599
|
-
// dogfood, where I burned three round-trips guessing whether the rejected
|
|
600
|
-
// key was duration_seconds, max_duration_seconds, stop_conditions, or
|
|
601
|
-
// include_audio.
|
|
602
|
-
function enrichAjvMessage(e) {
|
|
603
|
-
const base = e.message ?? "schema violation";
|
|
604
|
-
if (!e.params || typeof e.params !== "object")
|
|
605
|
-
return base;
|
|
606
|
-
if (e.keyword === "additionalProperties" && typeof e.params.additionalProperty === "string") {
|
|
607
|
-
return `${base} — unknown property: "${e.params.additionalProperty}".`;
|
|
608
|
-
}
|
|
609
|
-
if (e.keyword === "required" && typeof e.params.missingProperty === "string") {
|
|
610
|
-
return `${base} — missing: "${e.params.missingProperty}".`;
|
|
611
|
-
}
|
|
612
|
-
return base;
|
|
613
|
-
}
|
|
614
|
-
function emptyResult(errors, warnings) {
|
|
615
|
-
return {
|
|
616
|
-
status: "invalid",
|
|
617
|
-
valid: false,
|
|
618
|
-
errors,
|
|
619
|
-
warnings,
|
|
620
|
-
stats: { blocks: 0, streams: 0, triggers: 0, actions: 0, handlerNames: [], permissions: [] },
|
|
621
|
-
};
|
|
622
|
-
}
|
|
623
|
-
//# sourceMappingURL=validateSpec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validateSpec.js","sourceRoot":"","sources":["../../../src/tools/validation/validateSpec.ts"],"names":[],"mappings":"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"}
|