@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,204 @@
1
+ // inspectIntegration — read-only snapshot of current Extentos integration.
2
+ // Spec: docs/mcp/MCP_TOOLS.md § inspectIntegration
3
+ // Reads manifest + spec + generated file hashes + dependency; emits basedOn freshness token.
4
+ import { readFileSync, existsSync } from "node:fs";
5
+ import { createHash } from "node:crypto";
6
+ import { join, isAbsolute, resolve } from "node:path";
7
+ import { okResponse, errorResponse } from "../response.js";
8
+ const GEN_MARKER = "EXTENTOS-GENERATED";
9
+ export function handleInspectIntegration(raw) {
10
+ const args = (raw && typeof raw === "object" ? raw : {});
11
+ const projectPath = resolveProjectPath(args.projectPath);
12
+ const manifestPath = join(projectPath, "extentos.manifest.json");
13
+ if (!existsSync(manifestPath)) {
14
+ return okResponse({
15
+ found: false,
16
+ manifest: null,
17
+ spec: null,
18
+ basedOn: null,
19
+ generatedFilesStatus: [],
20
+ dependency: { found: false, coordinate: null, file: null },
21
+ drift: { specDrift: false, fileDrift: [], dependencyDrift: false },
22
+ connectionPageConfig: null,
23
+ gaps: [
24
+ `No extentos.manifest.json at ${manifestPath}. Run generateConnectionModule to bootstrap the project.`,
25
+ ],
26
+ });
27
+ }
28
+ let manifest;
29
+ try {
30
+ manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
31
+ }
32
+ catch (e) {
33
+ return errorResponse({
34
+ code: "invalid_manifest",
35
+ message: `Failed to parse extentos.manifest.json: ${errMessage(e)}.`,
36
+ fixHint: "Re-run generateConnectionModule (will refuse to overwrite a valid manifest) or repair the file by hand.",
37
+ retryable: false,
38
+ });
39
+ }
40
+ const gaps = [];
41
+ const manifestVersion = manifest.manifestVersion;
42
+ if (manifestVersion !== 1) {
43
+ gaps.push(`manifestVersion is ${JSON.stringify(manifestVersion)} — this tool understands version 1 only.`);
44
+ }
45
+ const specInfo = manifest.spec ?? {};
46
+ const specRelPath = typeof specInfo.path === "string" ? specInfo.path : "";
47
+ const specAbsPath = specRelPath ? join(projectPath, specRelPath) : "";
48
+ let specContents = null;
49
+ let specRawText = "";
50
+ let specDrift = false;
51
+ if (!specRelPath) {
52
+ gaps.push("Manifest has no spec.path. Re-run generateConnectionModule.");
53
+ }
54
+ else if (!existsSync(specAbsPath)) {
55
+ gaps.push(`Spec file declared at ${specRelPath} is missing on disk.`);
56
+ }
57
+ else {
58
+ try {
59
+ specRawText = readFileSync(specAbsPath, "utf8");
60
+ specContents = JSON.parse(specRawText);
61
+ const canonical = JSON.stringify(specContents, null, 2);
62
+ const liveHash = `sha256:${sha256(canonical)}`;
63
+ const manifestHash = typeof specInfo.hash === "string" ? specInfo.hash : "";
64
+ if (manifestHash && manifestHash !== liveHash && manifestHash !== "sha256:empty") {
65
+ specDrift = true;
66
+ }
67
+ }
68
+ catch (e) {
69
+ gaps.push(`Spec file at ${specRelPath} is not valid JSON: ${errMessage(e)}.`);
70
+ }
71
+ }
72
+ const basedOnHash = specContents
73
+ ? `sha256:${sha256(JSON.stringify(specContents, null, 2))}`
74
+ : null;
75
+ const basedOn = basedOnHash
76
+ ? { hash: basedOnHash, timestamp: new Date().toISOString() }
77
+ : null;
78
+ const generatedFiles = Array.isArray(manifest.generatedFiles)
79
+ ? manifest.generatedFiles
80
+ : [];
81
+ const generatedFilesStatus = [];
82
+ const fileDrift = [];
83
+ for (const gf of generatedFiles) {
84
+ const rel = typeof gf.path === "string" ? gf.path : "";
85
+ const recordedHash = typeof gf.hash === "string" ? gf.hash : "";
86
+ if (!rel)
87
+ continue;
88
+ const abs = join(projectPath, rel);
89
+ const exists = existsSync(abs);
90
+ let hasMarker = false;
91
+ let hashMatch = false;
92
+ if (exists) {
93
+ const text = readFileSync(abs, "utf8");
94
+ hasMarker = text.includes(GEN_MARKER);
95
+ const liveHash = `sha256:${sha256(text)}`;
96
+ hashMatch = liveHash === recordedHash;
97
+ if (!hasMarker)
98
+ fileDrift.push({ path: rel, reason: "marker_absent" });
99
+ else if (!hashMatch)
100
+ fileDrift.push({ path: rel, reason: "hash_mismatch" });
101
+ }
102
+ else {
103
+ fileDrift.push({ path: rel, reason: "missing" });
104
+ }
105
+ generatedFilesStatus.push({ path: rel, exists, hasMarker, hashMatch });
106
+ }
107
+ const platform = typeof manifest.platform === "string" ? manifest.platform : undefined;
108
+ const dependency = inspectDependency(projectPath, platform, manifest);
109
+ const dependencyDrift = !dependency.found;
110
+ const connectionPageConfig = inspectConnectionPage(projectPath);
111
+ if (!dependency.found && platform === "android") {
112
+ gaps.push(`Gradle coordinate not found in ${dependency.file ?? "app/build.gradle.kts"}. Add the dependency or re-run generateConnectionModule.`);
113
+ }
114
+ else if (!dependency.found && platform === "ios") {
115
+ gaps.push(`SPM package not found in ${dependency.file ?? "Package.swift"}. Add the dependency or re-run generateConnectionModule.`);
116
+ }
117
+ return okResponse({
118
+ found: true,
119
+ manifest,
120
+ spec: specContents,
121
+ basedOn,
122
+ generatedFilesStatus,
123
+ dependency,
124
+ drift: { specDrift, fileDrift, dependencyDrift },
125
+ connectionPageConfig,
126
+ gaps,
127
+ });
128
+ }
129
+ function inspectDependency(projectPath, platform, manifest) {
130
+ if (platform === "android") {
131
+ const gradle = manifest.gradle;
132
+ const coord = typeof gradle?.coordinate === "string" ? gradle.coordinate : null;
133
+ const buildFile = typeof gradle?.buildFile === "string" ? gradle.buildFile : "app/build.gradle.kts";
134
+ const abs = join(projectPath, buildFile);
135
+ if (!coord || !existsSync(abs)) {
136
+ return { found: false, coordinate: coord, file: buildFile };
137
+ }
138
+ const text = readFileSync(abs, "utf8");
139
+ const coreId = coord.split(":").slice(0, 2).join(":");
140
+ return {
141
+ found: text.includes(coreId),
142
+ coordinate: coord,
143
+ file: buildFile,
144
+ };
145
+ }
146
+ if (platform === "ios") {
147
+ const spm = manifest.spm;
148
+ const pkg = typeof spm?.package === "string" ? spm.package : null;
149
+ const projectFile = typeof spm?.projectFile === "string" ? spm.projectFile : "Package.swift";
150
+ const abs = join(projectPath, projectFile);
151
+ if (!pkg || !existsSync(abs)) {
152
+ return { found: false, coordinate: pkg, file: projectFile };
153
+ }
154
+ const text = readFileSync(abs, "utf8");
155
+ return {
156
+ found: text.includes(pkg),
157
+ coordinate: pkg,
158
+ file: projectFile,
159
+ };
160
+ }
161
+ return { found: false, coordinate: null, file: null };
162
+ }
163
+ function inspectConnectionPage(projectPath) {
164
+ const candidates = [
165
+ "app/src/main/assets/extentos.connection-page.json",
166
+ "Resources/extentos.connection-page.json",
167
+ "extentos.connection-page.json",
168
+ ];
169
+ for (const rel of candidates) {
170
+ const abs = join(projectPath, rel);
171
+ if (!existsSync(abs))
172
+ continue;
173
+ try {
174
+ const parsed = JSON.parse(readFileSync(abs, "utf8"));
175
+ const knownKeys = new Set(["schemaVersion", "sections", "appearance"]);
176
+ const unknownFields = Object.keys(parsed).filter((k) => !knownKeys.has(k));
177
+ return {
178
+ path: rel,
179
+ exists: true,
180
+ schemaVersion: typeof parsed.schemaVersion === "number" ? parsed.schemaVersion : undefined,
181
+ sections: parsed.sections ?? undefined,
182
+ appearance: parsed.appearance ?? undefined,
183
+ unknownFields,
184
+ };
185
+ }
186
+ catch {
187
+ return { path: rel, exists: true, unknownFields: [] };
188
+ }
189
+ }
190
+ return null;
191
+ }
192
+ function sha256(text) {
193
+ return createHash("sha256").update(text).digest("hex");
194
+ }
195
+ function errMessage(e) {
196
+ return e instanceof Error ? e.message : String(e);
197
+ }
198
+ function resolveProjectPath(v) {
199
+ if (typeof v === "string" && v.length > 0) {
200
+ return isAbsolute(v) ? v : resolve(process.cwd(), v);
201
+ }
202
+ return process.cwd();
203
+ }
204
+ //# sourceMappingURL=inspectIntegration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspectIntegration.js","sourceRoot":"","sources":["../../../src/tools/handlers/inspectIntegration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type McpContent } from "../response.js";
2
+ export declare function handlePlanIntegration(raw: unknown): McpContent;
3
+ //# sourceMappingURL=planIntegration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planIntegration.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/planIntegration.ts"],"names":[],"mappings":"AAGA,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAqG5E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAkF9D"}
@@ -0,0 +1,279 @@
1
+ // planIntegration — map NL goal to deterministic tool-call sequence + primitive suggestions.
2
+ // Spec: docs/mcp/MCP_TOOLS.md § planIntegration
3
+ import { okResponse, errorResponse } from "../response.js";
4
+ // Order matters: more specific phrases first.
5
+ const KEYWORDS = [
6
+ {
7
+ match: /\btranslat(e|ion|or)\b/,
8
+ streams: ["transcription_incremental"],
9
+ handlers: ["translate"],
10
+ pattern: "live_translation",
11
+ },
12
+ {
13
+ match: /\b(notification|notify|alerts?)\b/,
14
+ triggers: ["phone_notification_forwarded"],
15
+ handlers: ["summarize_notification"],
16
+ pattern: "notification_reader",
17
+ },
18
+ {
19
+ match: /\b(describe|description|what.?s|identify|recognize|object|scene|see|look|vision)\b/,
20
+ blocks: ["capture_photo", "speak_text"],
21
+ triggers: ["voice_command"],
22
+ handlers: ["describe_image"],
23
+ pattern: "scene_description",
24
+ },
25
+ {
26
+ match: /\b(photo|picture|snapshot|capture)\b/,
27
+ blocks: ["capture_photo"],
28
+ triggers: ["voice_command", "capture_button"],
29
+ pattern: "scene_description",
30
+ },
31
+ {
32
+ match: /\bvideo\b/,
33
+ blocks: ["capture_video"],
34
+ triggers: ["voice_command"],
35
+ },
36
+ {
37
+ match: /\b(navigat|direction|way|route|map)\b/,
38
+ triggers: ["voice_command", "location_updated"],
39
+ handlers: ["get_directions"],
40
+ pattern: "navigation_guide",
41
+ },
42
+ {
43
+ match: /\b(call|phone|video.?call|meeting)\b/,
44
+ streams: ["outgoing_video_stream", "outgoing_audio_stream"],
45
+ pattern: "video_call",
46
+ },
47
+ {
48
+ match: /\bdetect(ion)?\b/,
49
+ streams: ["video_frames"],
50
+ handlers: ["detect_objects"],
51
+ pattern: "object_detection",
52
+ },
53
+ {
54
+ match: /\b(notes?|dictation|transcrib|memo)\b/,
55
+ blocks: ["record_audio"],
56
+ streams: ["transcription_incremental"],
57
+ triggers: ["voice_command"],
58
+ handlers: ["save_note"],
59
+ pattern: "voice_notes",
60
+ },
61
+ {
62
+ match: /\b(voice|speak|command|assistant|chat|ask|question)\b/,
63
+ triggers: ["voice_command"],
64
+ blocks: ["speak_text"],
65
+ handlers: ["answer_question"],
66
+ pattern: "voice_assistant",
67
+ },
68
+ {
69
+ match: /\b(music|audio|sound)\b/,
70
+ blocks: ["speak_text"],
71
+ },
72
+ {
73
+ match: /\b(tap|gesture)\b/,
74
+ triggers: ["tap"],
75
+ },
76
+ {
77
+ match: /\b(incoming.?call|ring)\b/,
78
+ triggers: ["incoming_call_detected"],
79
+ },
80
+ ];
81
+ export function handlePlanIntegration(raw) {
82
+ const parsed = parseArgs(raw);
83
+ if ("error" in parsed)
84
+ return parsed.error;
85
+ const { goal, platform, hasExistingIntegration } = parsed;
86
+ const lower = goal.toLowerCase();
87
+ const blocks = new Set();
88
+ const streams = new Set();
89
+ const triggers = new Set();
90
+ const handlers = new Set();
91
+ let referencePattern = null;
92
+ for (const kw of KEYWORDS) {
93
+ if (!kw.match.test(lower))
94
+ continue;
95
+ kw.blocks?.forEach((b) => blocks.add(b));
96
+ kw.streams?.forEach((s) => streams.add(s));
97
+ kw.triggers?.forEach((t) => triggers.add(t));
98
+ kw.handlers?.forEach((h) => handlers.add(h));
99
+ if (kw.pattern && !referencePattern)
100
+ referencePattern = kw.pattern;
101
+ }
102
+ if (triggers.has("voice_command") && blocks.size === 0 && streams.size === 0) {
103
+ blocks.add("speak_text");
104
+ }
105
+ const warnings = [];
106
+ const presetTriggers = [];
107
+ if (triggers.has("voice_command") ||
108
+ triggers.has("wake_word") ||
109
+ triggers.has("push_to_talk")) {
110
+ presetTriggers.push("fallback_default");
111
+ }
112
+ if (streams.size > 0) {
113
+ presetTriggers.push("thermal_throttle");
114
+ }
115
+ if (streams.size > 0 && !triggers.has("connection_state_changed")) {
116
+ presetTriggers.push("disconnect_announce");
117
+ }
118
+ if (blocks.size + streams.size + triggers.size === 0) {
119
+ warnings.push("No primitives matched the goal keywords. Consider the 8 canonical patterns (use getExampleSpec) or rephrase the goal with concrete actions.");
120
+ }
121
+ if (triggers.has("voice_command") && blocks.has("speak_text") && handlers.size === 0) {
122
+ warnings.push("Voice-in/voice-out flow without an app_callback — confirm the AI processing step is intentional or add a handler.");
123
+ }
124
+ const toolSequence = buildToolSequence({
125
+ hasExistingIntegration: Boolean(hasExistingIntegration),
126
+ platform,
127
+ handlers: [...handlers],
128
+ streams: [...streams],
129
+ presetTriggers,
130
+ referencePattern,
131
+ });
132
+ const response = {
133
+ toolSequence,
134
+ suggestedBlocks: [...blocks].sort(),
135
+ suggestedStreams: [...streams].sort(),
136
+ suggestedTriggers: [...triggers, ...presetTriggers].sort(),
137
+ suggestedHandlers: [...handlers].sort(),
138
+ warnings,
139
+ estimatedSetupSteps: toolSequence.length,
140
+ referencePattern,
141
+ summary: buildSummary({
142
+ platform,
143
+ blocks: [...blocks],
144
+ streams: [...streams],
145
+ triggers: [...triggers],
146
+ handlers: [...handlers],
147
+ referencePattern,
148
+ hasExistingIntegration: Boolean(hasExistingIntegration),
149
+ }),
150
+ };
151
+ return okResponse(response);
152
+ }
153
+ function buildToolSequence(opts) {
154
+ const seq = [];
155
+ let step = 1;
156
+ seq.push({
157
+ step: step++,
158
+ tool: "getPlatformInfo",
159
+ params: { sections: ["version", "capabilities"], glasses: "meta_rayban" },
160
+ note: "Fetch library version and capability surface for the current glasses target.",
161
+ });
162
+ if (opts.referencePattern) {
163
+ seq.push({
164
+ step: step++,
165
+ tool: "getExampleSpec",
166
+ params: { pattern: opts.referencePattern },
167
+ note: `Grab the ${opts.referencePattern} reference spec as a starting point.`,
168
+ });
169
+ }
170
+ if (!opts.hasExistingIntegration) {
171
+ seq.push({
172
+ step: step++,
173
+ tool: "generateConnectionModule",
174
+ params: { platform: opts.platform, glasses: "meta_rayban" },
175
+ note: "One-shot project scaffold: bootstrap, manifest, dependency, empty spec.",
176
+ });
177
+ seq.push({
178
+ step: step++,
179
+ tool: "initSpec",
180
+ params: opts.presetTriggers.length
181
+ ? { platform: opts.platform, presetTriggers: opts.presetTriggers }
182
+ : { platform: opts.platform },
183
+ note: "Populate the first real spec with blocks/streams/triggers from the example + keyword matches.",
184
+ });
185
+ }
186
+ else {
187
+ seq.push({
188
+ step: step++,
189
+ tool: "inspectIntegration",
190
+ note: "Read current integration state (manifest + spec + file hashes) to get the basedOn freshness token.",
191
+ });
192
+ seq.push({
193
+ step: step++,
194
+ tool: "updateSpec",
195
+ note: "Apply the new primitives as patch operations against the inspected basedOn.",
196
+ });
197
+ }
198
+ if (opts.handlers.length) {
199
+ seq.push({
200
+ step: step++,
201
+ tool: "generateConsumer",
202
+ params: {
203
+ kind: "callback",
204
+ platform: opts.platform,
205
+ handlers: opts.handlers.map((name) => ({ name })),
206
+ },
207
+ note: `Stub the ${opts.handlers.length} app_callback handler${opts.handlers.length === 1 ? "" : "s"} on ${opts.platform}.`,
208
+ });
209
+ }
210
+ if (opts.streams.length) {
211
+ seq.push({
212
+ step: step++,
213
+ tool: "generateConsumer",
214
+ params: {
215
+ kind: "stream",
216
+ platform: opts.platform,
217
+ streams: opts.streams.map((id) => ({ id, type: id })),
218
+ },
219
+ note: `Generate stream consumer scaffolds for ${opts.streams.length} stream${opts.streams.length === 1 ? "" : "s"}.`,
220
+ });
221
+ }
222
+ seq.push({
223
+ step: step++,
224
+ tool: "validateIntegration",
225
+ note: "Pre-testing correctness gate: spec + files + manifest + permissions + handler coverage.",
226
+ });
227
+ seq.push({
228
+ step: step++,
229
+ tool: "createSimulatorSession",
230
+ note: "Provision a browser simulator session to test the flow end-to-end.",
231
+ });
232
+ return seq;
233
+ }
234
+ function buildSummary(opts) {
235
+ const primitives = opts.blocks.length + opts.streams.length + opts.triggers.length + opts.handlers.length;
236
+ const origin = opts.hasExistingIntegration ? "existing project" : "new project";
237
+ const pattern = opts.referencePattern
238
+ ? ` Referenced pattern: ${opts.referencePattern}.`
239
+ : "";
240
+ return `Plan for ${origin} on ${opts.platform}: ${primitives} suggested primitive${primitives === 1 ? "" : "s"} (${opts.blocks.length} block${s(opts.blocks.length)}, ${opts.streams.length} stream${s(opts.streams.length)}, ${opts.triggers.length} trigger${s(opts.triggers.length)}, ${opts.handlers.length} handler${s(opts.handlers.length)}).${pattern}`;
241
+ }
242
+ function s(n) {
243
+ return n === 1 ? "" : "s";
244
+ }
245
+ function parseArgs(raw) {
246
+ if (!raw || typeof raw !== "object") {
247
+ return {
248
+ error: errorResponse({
249
+ code: "invalid_arguments",
250
+ message: "planIntegration requires { goal, platform, glasses }.",
251
+ fixHint: 'Pass { goal: "...", platform: "android" | "ios", glasses: "meta_rayban" }.',
252
+ retryable: false,
253
+ }),
254
+ };
255
+ }
256
+ const obj = raw;
257
+ if (typeof obj.goal !== "string" || !obj.goal.trim()) {
258
+ return errInvalid("goal is required and must be a non-empty string.", 'Pass goal: "<plain-English goal>".');
259
+ }
260
+ if (obj.platform !== "android" && obj.platform !== "ios") {
261
+ return errInvalid(`platform must be "android" or "ios" (got ${JSON.stringify(obj.platform)}).`, 'Pass platform: "android" or "ios".');
262
+ }
263
+ return {
264
+ goal: obj.goal,
265
+ platform: obj.platform,
266
+ hasExistingIntegration: typeof obj.hasExistingIntegration === "boolean" ? obj.hasExistingIntegration : undefined,
267
+ };
268
+ }
269
+ function errInvalid(message, fixHint) {
270
+ return {
271
+ error: errorResponse({
272
+ code: "invalid_arguments",
273
+ message,
274
+ fixHint,
275
+ retryable: false,
276
+ }),
277
+ };
278
+ }
279
+ //# sourceMappingURL=planIntegration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planIntegration.js","sourceRoot":"","sources":["../../../src/tools/handlers/planIntegration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type McpContent } from "../response.js";
2
+ export declare function handleSearchDocs(raw: unknown): McpContent;
3
+ //# sourceMappingURL=searchDocs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchDocs.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/searchDocs.ts"],"names":[],"mappings":"AAGA,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAG5E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAqCzD"}
@@ -0,0 +1,41 @@
1
+ // searchDocs — deterministic keyword retrieval against the bundled doc index.
2
+ // Spec: docs/mcp/MCP_TOOLS.md § searchDocs
3
+ import { okResponse, errorResponse } from "../response.js";
4
+ import { DOC_INDEX, searchDocsIndex } from "../docs/index.js";
5
+ export function handleSearchDocs(raw) {
6
+ if (!raw || typeof raw !== "object") {
7
+ return errorResponse({
8
+ code: "invalid_arguments",
9
+ message: "searchDocs requires { query }.",
10
+ fixHint: 'Pass { query: "...", topic?: "..." }.',
11
+ retryable: false,
12
+ });
13
+ }
14
+ const obj = raw;
15
+ if (typeof obj.query !== "string" || !obj.query.trim()) {
16
+ return errorResponse({
17
+ code: "invalid_arguments",
18
+ message: "query is required and must be a non-empty string.",
19
+ fixHint: "Pass a natural-language query or keyword.",
20
+ retryable: false,
21
+ });
22
+ }
23
+ const topicFilter = typeof obj.topic === "string" ? obj.topic : undefined;
24
+ if (topicFilter && !DOC_INDEX.some((e) => e.topic === topicFilter)) {
25
+ return errorResponse({
26
+ code: "unknown_topic",
27
+ message: `Topic ${JSON.stringify(topicFilter)} is not one of the 26 indexed topics.`,
28
+ fixHint: `Valid topics: ${DOC_INDEX.map((e) => e.topic).join(", ")}.`,
29
+ retryable: false,
30
+ });
31
+ }
32
+ const hits = searchDocsIndex(obj.query, topicFilter);
33
+ const results = hits.map((e) => ({
34
+ topic: e.topic,
35
+ title: e.title,
36
+ content: e.content,
37
+ relatedTools: e.relatedTools,
38
+ }));
39
+ return okResponse({ results, totalResults: results.length });
40
+ }
41
+ //# sourceMappingURL=searchDocs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchDocs.js","sourceRoot":"","sources":["../../../src/tools/handlers/searchDocs.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,2CAA2C;AAE3C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAmB,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE9D,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,aAAa,CAAC;YACnB,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,gCAAgC;YACzC,OAAO,EAAE,uCAAuC;YAChD,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IACD,MAAM,GAAG,GAAG,GAA8B,CAAC;IAC3C,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QACvD,OAAO,aAAa,CAAC;YACnB,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,mDAAmD;YAC5D,OAAO,EAAE,2CAA2C;YACpD,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IACD,MAAM,WAAW,GAAG,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,IAAI,WAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,EAAE,CAAC;QACnE,OAAO,aAAa,CAAC;YACnB,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,SAAS,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,uCAAuC;YACpF,OAAO,EAAE,iBAAiB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YACrE,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/B,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,YAAY,EAAE,CAAC,CAAC,YAAY;KAC7B,CAAC,CAAC,CAAC;IAEJ,OAAO,UAAU,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type McpContent } from "../response.js";
2
+ export declare function handleUpdateSpec(raw: unknown): McpContent;
3
+ //# sourceMappingURL=updateSpec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateSpec.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/updateSpec.ts"],"names":[],"mappings":"AAQA,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA0C5E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAyHzD"}