@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,546 @@
1
+ // validateIntegration — whole-project correctness gate before testing.
2
+ // Spec: docs/mcp/MCP_TOOLS.md § validateIntegration
3
+ // 13 checks: 11 universal + 2 bootstrap.
4
+ import { readFileSync, existsSync, readdirSync } from "node:fs";
5
+ import { createHash } from "node:crypto";
6
+ import { join, isAbsolute, resolve } from "node:path";
7
+ import { okResponse } from "../response.js";
8
+ import { validateSpec } from "../validation/validateSpec.js";
9
+ import { deriveAndroid, deriveIos } from "../util/permissions.js";
10
+ const GEN_MARKER = "EXTENTOS-GENERATED";
11
+ export function handleValidateIntegration(raw) {
12
+ const args = raw && typeof raw === "object" ? raw : {};
13
+ const projectPath = resolveProjectPath(args.projectPath);
14
+ const checks = [];
15
+ const manifestPath = join(projectPath, "extentos.manifest.json");
16
+ const manifestExists = existsSync(manifestPath);
17
+ checks.push({
18
+ name: "manifest_exists",
19
+ passed: manifestExists,
20
+ severity: manifestExists ? undefined : "error",
21
+ details: manifestExists
22
+ ? `Found extentos.manifest.json at ${manifestPath}.`
23
+ : `No manifest at ${manifestPath}.`,
24
+ fix: manifestExists ? undefined : "Run generateConnectionModule to bootstrap the integration.",
25
+ });
26
+ if (!manifestExists) {
27
+ return okResponse({
28
+ valid: false,
29
+ checks,
30
+ summary: `Integration not installed yet — run generateConnectionModule first.`,
31
+ });
32
+ }
33
+ let manifest;
34
+ try {
35
+ manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
36
+ checks.push({
37
+ name: "manifest_parses",
38
+ passed: true,
39
+ details: `manifestVersion ${JSON.stringify(manifest.manifestVersion)}.`,
40
+ });
41
+ }
42
+ catch (e) {
43
+ checks.push({
44
+ name: "manifest_parses",
45
+ passed: false,
46
+ severity: "error",
47
+ details: `Failed to parse manifest: ${errMessage(e)}.`,
48
+ fix: "Repair JSON or restore from git history.",
49
+ });
50
+ return okResponse({ valid: false, checks, summary: "Manifest parse failure blocks all further checks." });
51
+ }
52
+ const platform = typeof manifest.platform === "string" ? manifest.platform : "";
53
+ const specInfo = manifest.spec ?? {};
54
+ const specRelPath = typeof specInfo.path === "string" ? specInfo.path : "";
55
+ const specAbsPath = specRelPath ? join(projectPath, specRelPath) : "";
56
+ const specExists = specRelPath ? existsSync(specAbsPath) : false;
57
+ checks.push({
58
+ name: "spec_exists",
59
+ passed: specExists,
60
+ severity: specExists ? undefined : "error",
61
+ details: specExists
62
+ ? `Spec at ${specRelPath}.`
63
+ : `Spec not found at ${specRelPath || "(no path in manifest)"}.`,
64
+ fix: specExists ? undefined : "Re-run generateConnectionModule to restore the empty spec file, then initSpec.",
65
+ });
66
+ let spec = null;
67
+ let specRawText = "";
68
+ if (specExists) {
69
+ try {
70
+ specRawText = readFileSync(specAbsPath, "utf8");
71
+ spec = JSON.parse(specRawText);
72
+ }
73
+ catch (e) {
74
+ checks.push({
75
+ name: "spec_validates",
76
+ passed: false,
77
+ severity: "error",
78
+ details: `Spec JSON parse error: ${errMessage(e)}.`,
79
+ fix: "Repair the JSON; validateSpec can help pinpoint the issue.",
80
+ });
81
+ }
82
+ }
83
+ if (spec) {
84
+ const result = validateSpec(spec);
85
+ const passed = result.status === "valid";
86
+ checks.push({
87
+ name: "spec_validates",
88
+ passed,
89
+ severity: passed ? (result.warnings.length ? "warn" : undefined) : "error",
90
+ details: passed
91
+ ? `Spec passes the 11 validation rules (${result.warnings.length} warning${result.warnings.length === 1 ? "" : "s"}).`
92
+ : `${result.errors.length} error${result.errors.length === 1 ? "" : "s"}: ${result.errors
93
+ .slice(0, 3)
94
+ .map((e) => e.rule)
95
+ .join(", ")}${result.errors.length > 3 ? "…" : ""}.`,
96
+ fix: passed ? undefined : "Call validateSpec to see the full error list with fix hints.",
97
+ });
98
+ }
99
+ // generated_files_exist
100
+ const generatedFiles = Array.isArray(manifest.generatedFiles)
101
+ ? manifest.generatedFiles
102
+ : [];
103
+ const missingFiles = [];
104
+ const markerMissing = [];
105
+ const hashMismatch = [];
106
+ for (const gf of generatedFiles) {
107
+ const rel = typeof gf.path === "string" ? gf.path : "";
108
+ const recordedHash = typeof gf.hash === "string" ? gf.hash : "";
109
+ if (!rel)
110
+ continue;
111
+ const abs = join(projectPath, rel);
112
+ if (!existsSync(abs)) {
113
+ missingFiles.push(rel);
114
+ continue;
115
+ }
116
+ const text = readFileSync(abs, "utf8");
117
+ if (!text.includes(GEN_MARKER))
118
+ markerMissing.push(rel);
119
+ else if (`sha256:${sha256(text)}` !== recordedHash)
120
+ hashMismatch.push(rel);
121
+ }
122
+ {
123
+ const issues = missingFiles.length + markerMissing.length;
124
+ const passed = issues === 0;
125
+ const parts = [];
126
+ if (missingFiles.length)
127
+ parts.push(`missing: ${missingFiles.join(", ")}`);
128
+ if (markerMissing.length)
129
+ parts.push(`marker absent: ${markerMissing.join(", ")}`);
130
+ checks.push({
131
+ name: "generated_files_exist",
132
+ passed,
133
+ severity: passed ? undefined : "error",
134
+ details: passed
135
+ ? `${generatedFiles.length} generated file${generatedFiles.length === 1 ? "" : "s"} present with markers.`
136
+ : parts.join("; "),
137
+ fix: passed
138
+ ? undefined
139
+ : "Re-run generateConsumer / generateConnectionModule to regenerate — USER-CODE regions will be preserved.",
140
+ });
141
+ }
142
+ // dependency_declared
143
+ const depResult = inspectDependency(projectPath, platform, manifest);
144
+ checks.push({
145
+ name: "dependency_declared",
146
+ passed: depResult.found,
147
+ severity: depResult.found ? undefined : "error",
148
+ details: depResult.found
149
+ ? `${depResult.coordinate} found in ${depResult.file}.`
150
+ : `Expected ${depResult.coordinate ?? "(none)"} in ${depResult.file ?? "(manifest has no build file path)"} — not found.`,
151
+ fix: depResult.found ? undefined : "Add the dependency manually or re-run generateConnectionModule.",
152
+ });
153
+ // permissions_complete
154
+ if (spec) {
155
+ const derived = platform === "android" ? deriveAndroid(spec) : null;
156
+ const derivedIos = platform === "ios" ? deriveIos(spec) : null;
157
+ const expected = derived?.permissions ?? derivedIos?.plistKeys.map((k) => k.key) ?? [];
158
+ const actualRaw = Array.isArray(manifest.permissions) ? manifest.permissions : [];
159
+ const actual = actualRaw.filter((p) => typeof p === "string");
160
+ const missing = expected.filter((e) => !actual.includes(e));
161
+ const passed = missing.length === 0;
162
+ checks.push({
163
+ name: "permissions_complete",
164
+ passed,
165
+ severity: passed ? undefined : "error",
166
+ details: passed
167
+ ? `Manifest declares all ${expected.length} expected ${platform === "android" ? "permission" : "Info.plist key"}${expected.length === 1 ? "" : "s"}.`
168
+ : `Missing ${missing.length}: ${missing.join(", ")}.`,
169
+ fix: passed ? undefined : "Re-run initSpec/updateSpec — they refresh the manifest's permissions array.",
170
+ });
171
+ }
172
+ // background_execution_declared
173
+ if (spec) {
174
+ const { passed, details, fix } = checkBackgroundExecution(projectPath, platform, spec);
175
+ checks.push({
176
+ name: "background_execution_declared",
177
+ passed,
178
+ severity: passed ? undefined : "error",
179
+ details,
180
+ fix,
181
+ });
182
+ }
183
+ // handler_coverage
184
+ if (spec) {
185
+ const handlers = collectHandlers(spec);
186
+ const bootstrapFile = findBootstrap(projectPath, generatedFiles, platform);
187
+ const callbackFile = findCallbackFile(projectPath, generatedFiles, platform);
188
+ const sourceText = [bootstrapFile, callbackFile]
189
+ .filter(Boolean)
190
+ .map((p) => readTextSafe(p))
191
+ .join("\n");
192
+ const missingHandlers = handlers.filter((h) => !sourceText.includes(`"${h}"`) && !sourceText.includes(`case "${h}"`));
193
+ const passed = missingHandlers.length === 0;
194
+ checks.push({
195
+ name: "handler_coverage",
196
+ passed,
197
+ severity: passed ? undefined : "error",
198
+ details: passed
199
+ ? `${handlers.length} handler${handlers.length === 1 ? "" : "s"} referenced in the generated dispatch.`
200
+ : `Missing stubs: ${missingHandlers.join(", ")}.`,
201
+ fix: passed ? undefined : "Call generateConsumer({ kind: 'callback' }) to regenerate the dispatch.",
202
+ });
203
+ }
204
+ // no_drift
205
+ const manifestSpecHash = typeof specInfo.hash === "string" ? specInfo.hash : "sha256:empty";
206
+ const liveSpecHash = spec ? `sha256:${sha256(JSON.stringify(spec, null, 2))}` : "sha256:empty";
207
+ const specDrift = manifestSpecHash !== "sha256:empty" && manifestSpecHash !== liveSpecHash;
208
+ const anyDrift = specDrift || hashMismatch.length > 0;
209
+ checks.push({
210
+ name: "no_drift",
211
+ passed: !anyDrift,
212
+ severity: anyDrift ? "warn" : undefined,
213
+ details: anyDrift
214
+ ? `${specDrift ? "Spec hash drift. " : ""}${hashMismatch.length ? `File drift: ${hashMismatch.join(", ")}.` : ""}`.trim()
215
+ : "All hashes match manifest records.",
216
+ fix: anyDrift
217
+ ? "Re-run inspectIntegration to re-sync basedOn token before the next updateSpec."
218
+ : undefined,
219
+ });
220
+ // connection_page_config_valid
221
+ const cpCheck = checkConnectionPage(projectPath);
222
+ if (cpCheck)
223
+ checks.push(cpCheck);
224
+ // bootstrap_registration_present
225
+ if (spec) {
226
+ const bCheck = checkBootstrap(projectPath, generatedFiles, platform);
227
+ checks.push(bCheck);
228
+ }
229
+ // ui_artifact_matches_usage
230
+ const uiCheck = checkUiArtifact(projectPath, platform, manifest);
231
+ if (uiCheck)
232
+ checks.push(uiCheck);
233
+ const errorCount = checks.filter((c) => !c.passed && c.severity === "error").length;
234
+ const warnCount = checks.filter((c) => !c.passed && c.severity === "warn").length;
235
+ const valid = errorCount === 0;
236
+ const summary = valid
237
+ ? `All correctness checks pass${warnCount ? ` (${warnCount} warning${warnCount === 1 ? "" : "s"})` : ""}. Safe to test.`
238
+ : `${errorCount} error${errorCount === 1 ? "" : "s"}, ${warnCount} warning${warnCount === 1 ? "" : "s"} — fix before testing.`;
239
+ return okResponse({ valid, checks, summary });
240
+ }
241
+ function inspectDependency(projectPath, platform, manifest) {
242
+ if (platform === "android") {
243
+ const gradle = manifest.gradle;
244
+ const coord = typeof gradle?.coordinate === "string" ? gradle.coordinate : null;
245
+ const buildFile = typeof gradle?.buildFile === "string" ? gradle.buildFile : "app/build.gradle.kts";
246
+ const abs = join(projectPath, buildFile);
247
+ if (!coord || !existsSync(abs))
248
+ return { found: false, coordinate: coord, file: buildFile };
249
+ const text = readFileSync(abs, "utf8");
250
+ const coreId = coord.split(":").slice(0, 2).join(":");
251
+ return { found: text.includes(coreId), coordinate: coord, file: buildFile };
252
+ }
253
+ if (platform === "ios") {
254
+ const spm = manifest.spm;
255
+ const pkg = typeof spm?.package === "string" ? spm.package : null;
256
+ const projectFile = typeof spm?.projectFile === "string" ? spm.projectFile : "Package.swift";
257
+ const abs = join(projectPath, projectFile);
258
+ if (!pkg || !existsSync(abs))
259
+ return { found: false, coordinate: pkg, file: projectFile };
260
+ const text = readFileSync(abs, "utf8");
261
+ return { found: text.includes(pkg), coordinate: pkg, file: projectFile };
262
+ }
263
+ return { found: false, coordinate: null, file: null };
264
+ }
265
+ function checkBackgroundExecution(projectPath, platform, spec) {
266
+ const streams = Array.isArray(spec.streams) ? spec.streams : [];
267
+ if (!streams.length) {
268
+ return { passed: true, details: "No streams declared — background execution not required." };
269
+ }
270
+ if (platform === "android") {
271
+ const candidates = ["app/src/main/AndroidManifest.xml"];
272
+ for (const rel of candidates) {
273
+ const abs = join(projectPath, rel);
274
+ if (!existsSync(abs))
275
+ continue;
276
+ const text = readFileSync(abs, "utf8");
277
+ if (text.includes("android:foregroundServiceType")) {
278
+ return { passed: true, details: "AndroidManifest declares foregroundServiceType." };
279
+ }
280
+ }
281
+ return {
282
+ passed: false,
283
+ details: "Spec uses streams but AndroidManifest has no <service android:foregroundServiceType=...> entry.",
284
+ fix: "Run getPermissions to see the required declaration, then patch AndroidManifest.xml.",
285
+ };
286
+ }
287
+ if (platform === "ios") {
288
+ const candidates = ["Info.plist", "MyApp/Info.plist"];
289
+ for (const rel of candidates) {
290
+ const abs = join(projectPath, rel);
291
+ if (!existsSync(abs))
292
+ continue;
293
+ const text = readFileSync(abs, "utf8");
294
+ if (text.includes("UIBackgroundModes")) {
295
+ return { passed: true, details: "Info.plist declares UIBackgroundModes." };
296
+ }
297
+ }
298
+ return {
299
+ passed: false,
300
+ details: "Spec uses streams but Info.plist has no UIBackgroundModes array.",
301
+ fix: "Add UIBackgroundModes with bluetooth-central + external-accessory (+ audio if mic streaming).",
302
+ };
303
+ }
304
+ return { passed: false, details: `Unknown platform ${platform}.` };
305
+ }
306
+ function collectHandlers(spec) {
307
+ const set = new Set();
308
+ const triggers = Array.isArray(spec.triggers) ? spec.triggers : [];
309
+ for (const t of triggers) {
310
+ walkActions(t.actions, (a) => {
311
+ if (a.type === "app_callback" && typeof a.handler === "string")
312
+ set.add(a.handler);
313
+ });
314
+ }
315
+ return [...set].sort();
316
+ }
317
+ function walkActions(actions, visit) {
318
+ if (!Array.isArray(actions))
319
+ return;
320
+ for (const a of actions) {
321
+ visit(a);
322
+ if (a.type === "branch") {
323
+ walkActions(a.then, visit);
324
+ walkActions(a.else, visit);
325
+ }
326
+ if (a.actions)
327
+ walkActions(a.actions, visit);
328
+ }
329
+ }
330
+ function findBootstrap(projectPath, generatedFiles, platform) {
331
+ const ext = platform === "android" ? ".kt" : ".swift";
332
+ for (const gf of generatedFiles) {
333
+ const p = typeof gf.path === "string" ? gf.path : "";
334
+ if (p.endsWith(`ExtentosBootstrap${ext}`)) {
335
+ const abs = join(projectPath, p);
336
+ if (existsSync(abs))
337
+ return abs;
338
+ }
339
+ }
340
+ return null;
341
+ }
342
+ function findCallbackFile(projectPath, generatedFiles, platform) {
343
+ const ext = platform === "android" ? ".kt" : ".swift";
344
+ for (const gf of generatedFiles) {
345
+ const p = typeof gf.path === "string" ? gf.path : "";
346
+ if (p.endsWith(`ExtentosCallbacks${ext}`)) {
347
+ const abs = join(projectPath, p);
348
+ if (existsSync(abs))
349
+ return abs;
350
+ }
351
+ }
352
+ return null;
353
+ }
354
+ function checkBootstrap(projectPath, generatedFiles, platform) {
355
+ const bootstrap = findBootstrap(projectPath, generatedFiles, platform);
356
+ if (!bootstrap) {
357
+ return {
358
+ name: "bootstrap_registration_present",
359
+ passed: false,
360
+ severity: "error",
361
+ details: `ExtentosBootstrap${platform === "android" ? ".kt" : ".swift"} not found.`,
362
+ fix: "Run generateConnectionModule.",
363
+ };
364
+ }
365
+ const text = readTextSafe(bootstrap);
366
+ const registrationMatches = (text.match(/registerAppCallbackHandler/g) ?? []).length;
367
+ if (registrationMatches === 0) {
368
+ return {
369
+ name: "bootstrap_registration_present",
370
+ passed: false,
371
+ severity: "error",
372
+ details: "No registerAppCallbackHandler(...) call in bootstrap.",
373
+ fix: 'Re-run generateConsumer(kind: "callback") — it will regenerate the bootstrap patch.',
374
+ };
375
+ }
376
+ if (registrationMatches > 1) {
377
+ return {
378
+ name: "bootstrap_registration_present",
379
+ passed: false,
380
+ severity: "error",
381
+ details: `Bootstrap contains ${registrationMatches} registration calls — exactly one is expected.`,
382
+ fix: 'Re-run generateConsumer(kind: "callback") to reset the bootstrap dispatch.',
383
+ };
384
+ }
385
+ if (platform === "ios" && !text.includes("handleUrl")) {
386
+ return {
387
+ name: "bootstrap_registration_present",
388
+ passed: false,
389
+ severity: "error",
390
+ details: "iOS bootstrap is missing Wearables.shared.handleUrl(...) wiring — breaks Meta companion auth callback.",
391
+ fix: 'Add .onOpenURL { Wearables.shared.handleUrl($0) } to the @main App or re-run generateConnectionModule.',
392
+ };
393
+ }
394
+ return {
395
+ name: "bootstrap_registration_present",
396
+ passed: true,
397
+ details: "Bootstrap exists with exactly one registration call.",
398
+ };
399
+ }
400
+ function checkUiArtifact(projectPath, platform, manifest) {
401
+ const uiSymbols = ["ExtentosConnectionPage", "ExtentosTheme", "rememberExtentosState", "ExtentosState"];
402
+ let anyUsage = false;
403
+ for (const root of candidateSourceRoots(projectPath, platform)) {
404
+ if (!existsSync(root))
405
+ continue;
406
+ const text = readProjectText(root);
407
+ if (uiSymbols.some((s) => text.includes(s))) {
408
+ anyUsage = true;
409
+ break;
410
+ }
411
+ }
412
+ if (!anyUsage)
413
+ return null;
414
+ if (platform === "android") {
415
+ const gradle = manifest.gradle;
416
+ const extras = Array.isArray(gradle?.additionalArtifacts)
417
+ ? gradle.additionalArtifacts
418
+ : [];
419
+ const hasUi = extras.some((a) => typeof a.coordinate === "string" && a.coordinate.includes(":glasses-ui:"));
420
+ return {
421
+ name: "ui_artifact_matches_usage",
422
+ passed: hasUi,
423
+ severity: hasUi ? undefined : "warn",
424
+ details: hasUi
425
+ ? "com.extentos:glasses-ui declared; UI usage matches."
426
+ : "UI symbols referenced but com.extentos:glasses-ui not in gradle.additionalArtifacts.",
427
+ fix: hasUi ? undefined : "Add com.extentos:glasses-ui to your Gradle dependencies (implementation scope).",
428
+ };
429
+ }
430
+ if (platform === "ios") {
431
+ const spm = manifest.spm;
432
+ const extras = Array.isArray(spm?.additionalProducts)
433
+ ? spm.additionalProducts
434
+ : [];
435
+ const hasUi = extras.some((a) => a.product === "GlassesUI");
436
+ return {
437
+ name: "ui_artifact_matches_usage",
438
+ passed: hasUi,
439
+ severity: hasUi ? undefined : "warn",
440
+ details: hasUi
441
+ ? "GlassesUI product linked; UI usage matches."
442
+ : "UI symbols referenced but GlassesUI not in spm.additionalProducts.",
443
+ fix: hasUi ? undefined : "Add GlassesUI product to your target via SPM.",
444
+ };
445
+ }
446
+ return null;
447
+ }
448
+ function checkConnectionPage(projectPath) {
449
+ const candidates = [
450
+ "app/src/main/assets/extentos.connection-page.json",
451
+ "Resources/extentos.connection-page.json",
452
+ "extentos.connection-page.json",
453
+ ];
454
+ for (const rel of candidates) {
455
+ const abs = join(projectPath, rel);
456
+ if (!existsSync(abs))
457
+ continue;
458
+ try {
459
+ const parsed = JSON.parse(readFileSync(abs, "utf8"));
460
+ if (parsed.schemaVersion !== 1) {
461
+ return {
462
+ name: "connection_page_config_valid",
463
+ passed: false,
464
+ severity: "error",
465
+ details: `extentos.connection-page.json has schemaVersion ${JSON.stringify(parsed.schemaVersion)}; only 1 is supported.`,
466
+ fix: "Set schemaVersion: 1 or delete the file to fall back to defaults.",
467
+ };
468
+ }
469
+ const knownKeys = new Set(["schemaVersion", "sections", "appearance"]);
470
+ const unknown = Object.keys(parsed).filter((k) => !knownKeys.has(k));
471
+ return {
472
+ name: "connection_page_config_valid",
473
+ passed: true,
474
+ severity: unknown.length ? "warn" : undefined,
475
+ details: unknown.length
476
+ ? `Config valid; ${unknown.length} unknown top-level field${unknown.length === 1 ? "" : "s"}: ${unknown.join(", ")}.`
477
+ : "extentos.connection-page.json is valid (schemaVersion 1).",
478
+ };
479
+ }
480
+ catch (e) {
481
+ return {
482
+ name: "connection_page_config_valid",
483
+ passed: false,
484
+ severity: "error",
485
+ details: `extentos.connection-page.json parse error: ${errMessage(e)}.`,
486
+ fix: "Repair the JSON or delete the file to fall back to defaults.",
487
+ };
488
+ }
489
+ }
490
+ return null;
491
+ }
492
+ function candidateSourceRoots(projectPath, platform) {
493
+ if (platform === "android") {
494
+ return [join(projectPath, "app/src/main/java"), join(projectPath, "app/src/main/kotlin")];
495
+ }
496
+ if (platform === "ios") {
497
+ return [projectPath];
498
+ }
499
+ return [];
500
+ }
501
+ function readProjectText(root, depth = 0, cap = 6) {
502
+ if (depth > cap)
503
+ return "";
504
+ let text = "";
505
+ let entries;
506
+ try {
507
+ entries = readdirSync(root, { withFileTypes: true });
508
+ }
509
+ catch {
510
+ return "";
511
+ }
512
+ for (const entry of entries) {
513
+ const name = entry.name;
514
+ if (name.startsWith(".") || name === "node_modules" || name === "build" || name === "Pods")
515
+ continue;
516
+ const abs = join(root, name);
517
+ if (entry.isDirectory()) {
518
+ text += readProjectText(abs, depth + 1, cap);
519
+ }
520
+ else if (/\.(kt|swift)$/.test(name)) {
521
+ text += "\n" + readTextSafe(abs);
522
+ }
523
+ }
524
+ return text;
525
+ }
526
+ function readTextSafe(abs) {
527
+ try {
528
+ return readFileSync(abs, "utf8");
529
+ }
530
+ catch {
531
+ return "";
532
+ }
533
+ }
534
+ function sha256(text) {
535
+ return createHash("sha256").update(text).digest("hex");
536
+ }
537
+ function errMessage(e) {
538
+ return e instanceof Error ? e.message : String(e);
539
+ }
540
+ function resolveProjectPath(v) {
541
+ if (typeof v === "string" && v.length > 0) {
542
+ return isAbsolute(v) ? v : resolve(process.cwd(), v);
543
+ }
544
+ return process.cwd();
545
+ }
546
+ //# sourceMappingURL=validateIntegration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateIntegration.js","sourceRoot":"","sources":["../../../src/tools/handlers/validateIntegration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type McpContent } from "../response.js";
2
+ export declare function handleValidateSpec(raw: unknown): McpContent;
3
+ //# sourceMappingURL=validateSpec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateSpec.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/validateSpec.ts"],"names":[],"mappings":"AAKA,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5E,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAmB3D"}
@@ -0,0 +1,26 @@
1
+ // validateSpec — detached spec validation (no filesystem).
2
+ // Spec: docs/mcp/MCP_TOOLS.md § validateSpec
3
+ // Wraps the reference validateSpec() in ../validation/validateSpec.ts.
4
+ import { validateSpec } from "../validation/validateSpec.js";
5
+ import { okResponse, errorResponse } from "../response.js";
6
+ export function handleValidateSpec(raw) {
7
+ if (!raw || typeof raw !== "object") {
8
+ return errorResponse({
9
+ code: "invalid_arguments",
10
+ message: "validateSpec requires an object argument with { spec }.",
11
+ fixHint: "Pass { spec: <spec object> }.",
12
+ retryable: false,
13
+ });
14
+ }
15
+ const obj = raw;
16
+ if (!obj.spec || typeof obj.spec !== "object") {
17
+ return errorResponse({
18
+ code: "invalid_arguments",
19
+ message: "spec is required and must be an object.",
20
+ fixHint: "Pass the spec JSON you want validated as { spec: {...} }.",
21
+ retryable: false,
22
+ });
23
+ }
24
+ return okResponse(validateSpec(obj.spec));
25
+ }
26
+ //# sourceMappingURL=validateSpec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateSpec.js","sourceRoot":"","sources":["../../../src/tools/handlers/validateSpec.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,6CAA6C;AAC7C,uEAAuE;AAEvE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAmB,MAAM,gBAAgB,CAAC;AAE5E,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,aAAa,CAAC;YACnB,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,yDAAyD;YAClE,OAAO,EAAE,+BAA+B;YACxC,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IACD,MAAM,GAAG,GAAG,GAA8B,CAAC;IAC3C,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9C,OAAO,aAAa,CAAC;YACnB,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,yCAAyC;YAClD,OAAO,EAAE,2DAA2D;YACpE,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpContent } from "./response.js";
2
+ export type ToolHandler = (args: unknown) => McpContent | Promise<McpContent>;
3
+ export declare const handlers: Record<string, ToolHandler>;
4
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAqBhD,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAE9E,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAoBhD,CAAC"}