@extentos/mcp-server 0.0.93 → 0.1.0

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 (37) hide show
  1. package/dist/tools/data/capabilityPatterns.d.ts.map +1 -1
  2. package/dist/tools/data/capabilityPatterns.js +250 -3
  3. package/dist/tools/data/capabilityPatterns.js.map +1 -1
  4. package/dist/tools/data/codeExamples.d.ts.map +1 -1
  5. package/dist/tools/data/codeExamples.js +421 -10
  6. package/dist/tools/data/codeExamples.js.map +1 -1
  7. package/dist/tools/data/version.d.ts +0 -1
  8. package/dist/tools/data/version.d.ts.map +1 -1
  9. package/dist/tools/data/version.js +9 -1
  10. package/dist/tools/data/version.js.map +1 -1
  11. package/dist/tools/definitions.d.ts.map +1 -1
  12. package/dist/tools/definitions.js +54 -3
  13. package/dist/tools/definitions.js.map +1 -1
  14. package/dist/tools/docs/index.d.ts.map +1 -1
  15. package/dist/tools/docs/index.js +115 -2
  16. package/dist/tools/docs/index.js.map +1 -1
  17. package/dist/tools/handlers/assertToolCalled.d.ts +3 -0
  18. package/dist/tools/handlers/assertToolCalled.d.ts.map +1 -0
  19. package/dist/tools/handlers/assertToolCalled.js +171 -0
  20. package/dist/tools/handlers/assertToolCalled.js.map +1 -0
  21. package/dist/tools/handlers/getProductionChecklist.d.ts.map +1 -1
  22. package/dist/tools/handlers/getProductionChecklist.js +60 -9
  23. package/dist/tools/handlers/getProductionChecklist.js.map +1 -1
  24. package/dist/tools/handlers/injectAssistantUtterance.d.ts +3 -0
  25. package/dist/tools/handlers/injectAssistantUtterance.d.ts.map +1 -0
  26. package/dist/tools/handlers/injectAssistantUtterance.js +139 -0
  27. package/dist/tools/handlers/injectAssistantUtterance.js.map +1 -0
  28. package/dist/tools/handlers/validateIntegration.d.ts.map +1 -1
  29. package/dist/tools/handlers/validateIntegration.js +168 -0
  30. package/dist/tools/handlers/validateIntegration.js.map +1 -1
  31. package/dist/tools/registry.d.ts.map +1 -1
  32. package/dist/tools/registry.js +4 -0
  33. package/dist/tools/registry.js.map +1 -1
  34. package/dist/tools/templates/androidBootstrap.d.ts.map +1 -1
  35. package/dist/tools/templates/androidBootstrap.js +35 -0
  36. package/dist/tools/templates/androidBootstrap.js.map +1 -1
  37. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertToolCalled.js","sourceRoot":"","sources":["../../../src/tools/handlers/assertToolCalled.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getProductionChecklist.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/getProductionChecklist.ts"],"names":[],"mappings":"AAgBA,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAgE5E,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAyNrE"}
1
+ {"version":3,"file":"getProductionChecklist.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/getProductionChecklist.ts"],"names":[],"mappings":"AAgBA,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAmF5E,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CA8PrE"}
@@ -38,6 +38,14 @@ const HARDWARE_VERIFY_CAPS = new Set([
38
38
  "conversation_listen",
39
39
  "conversation_speak",
40
40
  "conversation_ai_complete",
41
+ // Phase 4 assistant runtime — same reasoning. The assistant.start
42
+ // path exercises the BT HFP mic-input + speaker-output, the WebSocket
43
+ // to the AI provider, and tool dispatch under real-world conditions.
44
+ // Synthesis #3 makes real-hw validation a v2.0.0 gate.
45
+ "assistant_runtime",
46
+ "assistant_start",
47
+ "assistant_tool",
48
+ "assistant_provider_openai",
41
49
  ]);
42
50
  // Phase 3 conversation runtime capabilities — when ANY of these are
43
51
  // declared, a dedicated Conversation Runtime Setup step fires (manifest
@@ -49,6 +57,16 @@ const CONVERSATION_RUNTIME_CAPS = new Set([
49
57
  "conversation_speak",
50
58
  "conversation_ai_complete",
51
59
  ]);
60
+ // Phase 4 assistant runtime capabilities — when ANY of these are
61
+ // declared, a dedicated Assistant Runtime Setup step fires (BYOK key
62
+ // + tool description hygiene + Mock-provider test pass + real-hw
63
+ // validation per synthesis #3 v2.0.0 gate).
64
+ const ASSISTANT_RUNTIME_CAPS = new Set([
65
+ "assistant_runtime",
66
+ "assistant_start",
67
+ "assistant_tool",
68
+ "assistant_provider_openai",
69
+ ]);
52
70
  export function handleGetProductionChecklist(raw) {
53
71
  const parsed = parseArgs(raw);
54
72
  if ("error" in parsed)
@@ -63,6 +81,7 @@ export function handleGetProductionChecklist(raw) {
63
81
  const ios = deriveIosFromCapabilities(capabilities);
64
82
  const metaDat = deriveMetaDatFromCapabilities(capabilities);
65
83
  const usesConversationRuntime = [...capsSet].some((c) => CONVERSATION_RUNTIME_CAPS.has(c));
84
+ const usesAssistantRuntime = [...capsSet].some((c) => ASSISTANT_RUNTIME_CAPS.has(c));
66
85
  const steps = [];
67
86
  // 1. Meta Developer Account
68
87
  steps.push({
@@ -105,35 +124,61 @@ export function handleGetProductionChecklist(raw) {
105
124
  description: `Wire BYOK API keys for ${handlers.length} handler${handlers.length === 1 ? "" : "s"}.`,
106
125
  status: "needed",
107
126
  details: "Each declared handler is expected to call a third-party AI / vision / translation service. Production builds must not ship with placeholder or in-simulator proxy credentials." +
127
+ (usesAssistantRuntime
128
+ ? " **Phase 4 assistant runtime apps** need the OpenAI BYOK key wired via `glasses.assistant.setOpenaiApiKey(key)` at app init for `glasses.assistant.start(provider = AssistantProvider.OpenAi(...))` to work — see getCredentialGuide(service: \"openai\"). Key flows direct device → openai.com via the WebSocket Authorization header; Extentos backend never sees it."
129
+ : "") +
108
130
  (usesConversationRuntime
109
- ? " **Phase 3 conversation runtime apps** need the OpenAI BYOK key wired via `glasses.ai.setOpenaiApiKey(key)` at app init for `glasses.ai.complete(prompt)` to work — see getCredentialGuide(service: \"openai\")."
131
+ ? " **Phase 3 conversation runtime apps** need the OpenAI BYOK key wired via `glasses.ai.setOpenaiApiKey(key)` at app init for `glasses.ai.complete(prompt)` to work — see getCredentialGuide(service: \"openai\"). NOTE: this API is DEPRECATED in v1.4.0 and REMOVED in v2.0.0 — migrate to `glasses.assistant.setOpenaiApiKey(key)` per docs/migration/phase-3-to-phase-4.md."
110
132
  : ""),
111
133
  fix: "Call getCredentialGuide with the BYOK services to get per-provider setup steps, then wire secrets via platform-local secure storage (Android resValue/keystore, iOS Keychain/xcconfig).",
112
134
  affectedHandlers: handlers,
113
135
  });
114
136
  }
115
137
  // 4b. Phase 3 Conversation Runtime Setup — only if the app declared
116
- // any conversation_* capability. Three pre-ship gates the runtime
138
+ // any conversation_* capability. Two pre-ship gates the runtime
117
139
  // needs that the simulator setup doesn't enforce:
118
140
  // (a) Manifest's `conversation` block populated, not just present.
119
- // (b) silero_vad.onnx + smart-turn-v3.2-cpu.onnx bundled as
120
- // Android assets / iOS resources (~11 MB total). Missing →
121
- // `glasses.conversation` is null at runtime (warn-logged).
141
+ // (b) Host app passes `ExtentosConfig.conversationOptions` at
142
+ // create-time, resolving model paths via `ConversationModels`
143
+ // helper (models themselves ship inside the library).
122
144
  // (c) OpenAI BYOK key wired (covered by step 4, cross-linked).
123
145
  if (usesConversationRuntime) {
124
146
  steps.push({
125
147
  category: "Phase 3 Conversation Runtime Setup",
126
- description: "Validate `glasses.conversation` runtime setup — manifest config, bundled ONNX models, BYOK key wiring.",
148
+ description: "Validate `glasses.conversation` runtime setup — manifest config, `ConversationCoreOptions` wiring, BYOK key.",
127
149
  status: "needed",
128
- details: "The Phase 3 conversation runtime (`glasses.conversation.onWake { listen() / speak() / ai.complete() }`) needs three things the simulator config doesn't enforce: (1) the manifest's `conversation` block must specify provider + voice + model (defaults: openai/gpt-4o-mini, alloy); (2) the Silero VAD + Smart Turn v3 ONNX model files must be bundled as Android assets (`app/src/main/assets/silero_vad.onnx` + `smart-turn-v3.2-cpu.onnx`) or iOS resources (`Sources/.../Resources/`); (3) the host app must pass `ExtentosConfig.conversationOptions` at create-time, supplying the resolved model file paths + backend base URL. If any of these are missing, `glasses.conversation` will be `null` at runtime and a `conversation.init_failed` Log event surfaces in `glasses.runtime.events` — the rest of the library stays functional. PII boundary: conversation lifecycle events carry `textLen` (char count) only, never transcript text; ensure your privacy disclosure covers metric-level voice telemetry.",
150
+ details: "The Phase 3 conversation runtime (`glasses.conversation.onWake { listen() / speak() / ai.complete() }`) needs three things the simulator config doesn't enforce: (1) the manifest's `conversation` block must specify provider + voice + model (defaults: openai/gpt-4o-mini, alloy); (2) the host app must pass `ExtentosConfig.conversationOptions` at create-time, with model file paths resolved via the bundled `ConversationModels` helper (Silero VAD ~2.2 MB + Smart Turn v3 ~8.7 MB are bundled inside `glasses-core` AAR / `GlassesCore` Swift package customers don't bundle them themselves); (3) `glasses.ai.setOpenaiApiKey(BYOK)` wired (cross-link to step 4). If any of these are missing, `glasses.conversation` will be `null` at runtime and a `conversation.init_failed` Log event surfaces in `glasses.runtime.events` — the rest of the library stays functional. PII boundary: conversation lifecycle events carry `textLen` (char count) only, never transcript text; ensure your privacy disclosure covers metric-level voice telemetry.",
129
151
  fix: platform === "android"
130
- ? "1) Ship the two ONNX files in app/src/main/assets/ (~11 MB; verify they're in the AAB). 2) Extract them to cacheDir at app init: `assets.open(\"silero_vad.onnx\").use { it.copyTo(File(cacheDir, \"silero_vad.onnx\").outputStream()) }`. 3) Build ConversationCoreOptions from the extracted paths + manifest config + backendBaseUrl. 4) Pass to ExtentosConfig(conversationOptions = options). 5) Confirm `glasses.conversation != null` after create returns. See getCapabilityGuide(feature: \"conversation_runtime\")."
131
- : "1) Ship the two ONNX files in Sources/<Module>/Resources/ (~11 MB; declare in Package.swift's resources array). 2) Resolve URLs via `Bundle.module.url(forResource: \"silero_vad\", withExtension: \"onnx\")`. 3) Build ConversationCoreOptions from those paths + manifest config + backendBaseUrl. 4) Pass to ExtentosConfig(conversation: options). 5) Confirm `glasses.conversation != nil` after create returns. See getCapabilityGuide(feature: \"conversation_runtime\").",
152
+ ? "1) From a coroutine at app init: `val models = ConversationModels.ensureExtracted(context)` (idempotent; suspends ~50-200 ms on first launch to copy ~11 MB from AAR assets to cacheDir). 2) Build ConversationCoreOptions from `models.sileroVadPath` + `models.smartTurnPath` + manifest config + backendBaseUrl. 3) Pass to `ExtentosConfig(conversationOptions = options)`. 4) After create, call `glasses.ai?.setOpenaiApiKey(BuildConfig.OPENAI_API_KEY)`. 5) Confirm `glasses.conversation != null` after create returns. Full snippet: getCodeExample(pattern: \"conversation_agent_loop\")."
153
+ : "1) Synchronously at app init: `let models = ConversationModels.paths` (bundle lookup via `Bundle.module`). 2) Build `ConversationCoreOptions(sileroVadModelPath: models.sileroVadPath, smartTurnModelPath: models.smartTurnPath, …)`. 3) Pass to `ExtentosConfig(conversation: options)`. 4) After create, call `glasses.ai?.setOpenAiApiKey(Secrets.openAiKey)`. 5) Confirm `glasses.conversation != nil` after create returns. Full snippet: getCodeExample(pattern: \"conversation_agent_loop\").",
132
154
  codeChange: platform === "android"
133
155
  ? { file: "extentos.manifest.json", hint: "conversation.stt.provider, conversation.tts.{provider, voice}, conversation.model" }
134
156
  : { file: "extentos.manifest.json", hint: "conversation.stt.provider, conversation.tts.{provider, voice}, conversation.model" },
135
157
  });
136
158
  }
159
+ // 4c. Phase 4 Assistant Runtime Setup — only if the app declared any
160
+ // assistant_* capability. Four pre-ship gates that the simulator
161
+ // setup doesn't enforce:
162
+ // (a) OpenAI BYOK key wired (covered by step 4, cross-linked).
163
+ // (b) Tool descriptions are written for the AI (not the engineer)
164
+ // — quality matters; the model picks tools from descriptions.
165
+ // (c) Mock provider tests pass via injectAssistantUtterance +
166
+ // assertToolCalled (the agent-driven E2E loop).
167
+ // (d) Real-hardware validation done before declaring production-
168
+ // ready (synthesis #3 — v2.0.0 gate).
169
+ if (usesAssistantRuntime) {
170
+ steps.push({
171
+ category: "Phase 4 Assistant Runtime Setup",
172
+ description: "Validate `glasses.assistant` runtime setup — BYOK key, tool description quality, Mock-provider tests, real-hardware smoke.",
173
+ status: "needed",
174
+ details: "The Phase 4 assistant runtime (`glasses.assistant.start(provider) { tool(name, description) { body } }`) needs four things the simulator setup doesn't enforce: (1) `glasses.assistant.setOpenaiApiKey(BYOK)` wired at app init (cross-link to step 4); (2) tool descriptions written for the AI — be specific about WHEN to call (\"Take a photo when the user asks to capture a moment\") not WHAT the tool does internally (\"Captures imagery via the camera SDK\"); the model picks from these descriptions alone; (3) each tool exercised end-to-end via the agent-test loop (`injectAssistantUtterance` + `assertToolCalled`) — Mock provider for deterministic CI, OpenAi provider for end-to-end smoke; (4) real-hardware validation on actual Ray-Bans before declaring production-ready (synthesis #3 — gates v2.0.0 ship). PII note: Phase 4 events DO carry verbatim transcripts in `assistant.user_spoke` / `assistant.assistant_spoke` (different from Phase 3 which stripped text) because BYOK flows direct device → openai.com without touching Extentos backend — customer apps own their privacy disclosure for assistant telemetry.",
175
+ fix: "1) At app init: `glasses.assistant.setOpenaiApiKey(BuildConfig.OPENAI_API_KEY)` (Android) or `glasses.assistant.setOpenAiApiKey(Secrets.openAiKey)` (iOS). 2) Review each tool() call's description — make it answer \"when should the AI call this?\" verbatim. 3) For each tool, write an agent test: `createSimulatorSession` → `injectAssistantUtterance({ text: 'expected user utterance' })` → `assertToolCalled({ name: 'expected_tool_name', timeoutMs: 5000 })`. 4) Before customer ship, run the full handler on real Ray-Bans + a phone. Walk through 5-10 voice interactions, watching for the three sim-fidelity buckets (audio character, hardware timing, hardware failure modes — see searchDocs(topic: 'simulator_fidelity')). Full setup snippet: getCodeExample(pattern: \"assistant_agent_loop\").",
176
+ codeChange: {
177
+ file: platform === "android" ? "Application.onCreate / ExtentosBootstrap.kt" : "App.init / ExtentosBootstrap.swift",
178
+ hint: "glasses.assistant.setOpenaiApiKey(...) + glasses.assistant.start(provider) { tool(...) }",
179
+ },
180
+ });
181
+ }
137
182
  // 5. Permissions Audit — always
138
183
  const permCount = platform === "android" ? android.permissions.length : ios.plistKeys.length;
139
184
  steps.push({
@@ -194,10 +239,16 @@ export function handleGetProductionChecklist(raw) {
194
239
  status: "needed",
195
240
  details: `App uses: ${hardwareVerifyCaps.join(", ")}. ` +
196
241
  "Behavior under real SCO routing, real recognizer engines (SpeechRecognizer / SFSpeechRecognizer), thermal limits, and BT route changes can only be verified on hardware. During the test, watch getEventLog(filter: \"voice\") to confirm transcripts come through, no transport.error events surface, and the relevant operations complete cleanly." +
242
+ (usesAssistantRuntime
243
+ ? " **Phase 4 assistant runtime apps**: synthesis #3 makes this gate load-bearing for v2.0.0 — at least one architecture must be dogfooded on real Ray-Bans with audio audible before the v2.0.0 cascaded-deletion ships. Watch for the three sim-fidelity buckets: (A) audio character — does the model still pick tools reliably with the noisier HFP capture vs the sim's wide-band mic?; (B) hardware timing — first-utterance HFP profile switch (~200-500 ms), A2DP↔HFP music collision; (C) hardware failure modes — BT range loss, incoming-call interruption, battery drain (~30 min HFP ceiling), thermal throttling. Confirm the assistant.* event sequence in getEventLog matches the sim test (assistant.session_started → user_spoke → tool_called → tool_result → assistant_spoke). See searchDocs(topic: \"simulator_fidelity\") for the contract."
244
+ : "") +
197
245
  (usesConversationRuntime
198
246
  ? " **Phase 3 conversation runtime apps**: also confirm the symmetric A10 lifecycle event pairs (`conversation.handler_started`/`handler_finished`, `conversation.turn_started`/`turn_ended`) land in the log per handler invocation, and that `conversation.error` doesn't surface (network/STT/TTS/LLM failures all show up there). The simulator sim's right-rail ConversationPanel is the visual equivalent — green active-handler card + listening pulse → expected; red error rows → investigate."
199
247
  : ""),
200
248
  fix: "Pair Ray-Ban Meta to your phone, install your app, and exercise: (1) each voice path you handle; (2) record_audio / capture_video at the max duration you configure; (3) BT route change mid-recording (connect/disconnect AirPods). Verify the event log shows transcripts, no transport.error[stt_*] events, and operations complete successfully." +
249
+ (usesAssistantRuntime
250
+ ? " For assistant runtime: walk 5-10 voice interactions covering every tool you registered + the take/stop pair semantics (if any). Verify (1) assistant.session_started fires on app start; (2) each tool call surfaces assistant.tool_called → assistant.tool_result with reasonable duration_ms; (3) the assistant.reconnected event fires after ~50 min — confirms the library-owned reconnection state machine works under real network conditions; (4) on BT disconnect/range loss, assistant.session_ended(error) fires + app handles re-bind on reconnect."
251
+ : "") +
201
252
  (usesConversationRuntime
202
253
  ? " For conversation runtime: walk a full wake → listen → ai.complete → speak loop end-to-end, then verify (1) the handler / turn event pairs are symmetric in getEventLog, (2) BYOK key isn't rejected (no `conversation.error{kind: stt_unauthorized}` or AiException.Unauthorized), (3) Smart Turn EOU fires at natural utterance boundaries (not stuck on the 600 ms silence fallback for every turn — that signals VAD trouble)."
203
254
  : ""),
@@ -1 +1 @@
1
- {"version":3,"file":"getProductionChecklist.js","sourceRoot":"","sources":["../../../src/tools/handlers/getProductionChecklist.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getProductionChecklist.js","sourceRoot":"","sources":["../../../src/tools/handlers/getProductionChecklist.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type McpContent } from "../response.js";
2
+ export declare function handleInjectAssistantUtterance(raw: unknown): Promise<McpContent>;
3
+ //# sourceMappingURL=injectAssistantUtterance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injectAssistantUtterance.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/injectAssistantUtterance.ts"],"names":[],"mappings":"AAyBA,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAW5E,wBAAsB,8BAA8B,CAClD,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,UAAU,CAAC,CAmIrB"}
@@ -0,0 +1,139 @@
1
+ // injectAssistantUtterance — Phase 4 S1.W.7.
2
+ //
3
+ // Drive an assistant turn from outside the live session — used by
4
+ // agent-driven E2E tests of the Phase 4 glasses.assistant.start surface.
5
+ // Mirrors injectTranscript's pattern (frame travels through the same
6
+ // sim-hub path; the library routes it to the active assistant session).
7
+ //
8
+ // v1 paths (per synthesis #16, partially scoped down for Sprint 1):
9
+ // - text: deterministic path. v1 wire-routing reuses the existing
10
+ // stt_transcript frame the Rust core already knows about (Phase 4
11
+ // plan § machine-split: NO Rust changes). MockAssistantProvider
12
+ // subscribes to audio.transcriptions() Flow and routes Finals to
13
+ // its dispatcher. Sub-millisecond. No API cost.
14
+ // - audioWavBase64: real-provider audio path — DEFERRED to v1.1.
15
+ // Implementing this needs either a new inbound frame type (Rust
16
+ // core change) or a separate audio-chunk injection endpoint;
17
+ // either is out of Sprint 1 scope. Handler rejects with
18
+ // not_implemented for now.
19
+ //
20
+ // USE for agent-driven end-to-end tests of glasses.assistant.start
21
+ // (e.g. createSimulatorSession → injectAssistantUtterance({ text:
22
+ // "take a picture" }) → assertToolCalled({ name: "take_picture" })).
23
+ // DON'T USE for capability discovery (use getPlatformInfo) or static
24
+ // validation (use validateIntegration).
25
+ import { okResponse, errorResponse } from "../response.js";
26
+ import { backendFetch } from "../util/backendClient.js";
27
+ export async function handleInjectAssistantUtterance(raw) {
28
+ if (!raw || typeof raw !== "object") {
29
+ return errorResponse({
30
+ code: "invalid_arguments",
31
+ message: "injectAssistantUtterance requires { sessionId, text? | audioWavBase64? }.",
32
+ fixHint: 'Pass { sessionId: "sim_...", text: "take a picture" }. For real-provider audio injection, pass audioWavBase64 instead — a base64-encoded WAV file the library decodes + feeds through the active provider.',
33
+ retryable: false,
34
+ });
35
+ }
36
+ const o = raw;
37
+ if (typeof o.sessionId !== "string" || !o.sessionId.trim()) {
38
+ return errorResponse({
39
+ code: "invalid_arguments",
40
+ message: "sessionId (string) is required.",
41
+ fixHint: "Pass the sessionId returned by createSimulatorSession.",
42
+ retryable: false,
43
+ });
44
+ }
45
+ const text = typeof o.text === "string" ? o.text : undefined;
46
+ const audioWavBase64 = typeof o.audioWavBase64 === "string" ? o.audioWavBase64 : undefined;
47
+ // Enforce exactly-one-of in the handler (the JSON Schema can't express
48
+ // top-level oneOf per the assertNoForbiddenTopLevelKeywords lock).
49
+ if (text == null && audioWavBase64 == null) {
50
+ return errorResponse({
51
+ code: "invalid_arguments",
52
+ message: "Either text or audioWavBase64 is required.",
53
+ fixHint: 'Pass text: "take a picture" for the Mock provider path (fast, deterministic, free), or audioWavBase64: "..." for the real-provider audio path.',
54
+ retryable: false,
55
+ });
56
+ }
57
+ if (text != null && audioWavBase64 != null) {
58
+ return errorResponse({
59
+ code: "invalid_arguments",
60
+ message: "Pass either text or audioWavBase64 — not both.",
61
+ fixHint: "Pick the path: text for Mock-provider intent matching, audioWavBase64 for real-provider audio.",
62
+ retryable: false,
63
+ });
64
+ }
65
+ if (text != null && text.length === 0) {
66
+ return errorResponse({
67
+ code: "invalid_arguments",
68
+ message: "text must be non-empty.",
69
+ fixHint: 'Pass text: "take a picture" (or any utterance the model should hear).',
70
+ retryable: false,
71
+ });
72
+ }
73
+ // v1 wire-routing: text path reuses the existing stt_transcript frame
74
+ // so we don't need to teach the Rust core a new inbound frame type
75
+ // (Phase 4 plan § machine-split: NO Rust changes). The library shell's
76
+ // MockAssistantProvider subscribes to audio.transcriptions() and routes
77
+ // Finals to its injectUtterance dispatcher. Tagged with
78
+ // source: "assistant_inject" so the backend ws-hub renders these as
79
+ // assistant injects rather than mic injects in the event log.
80
+ //
81
+ // audioWavBase64 path: deferred to v1.1 — needs a frame-type extension
82
+ // or a separate audio-chunk injection endpoint. Surfaces the 'not yet
83
+ // supported' error in the handler below.
84
+ if (audioWavBase64 != null) {
85
+ return errorResponse({
86
+ code: "not_implemented",
87
+ message: "audioWavBase64 path is not yet implemented in v1 (deferred to v1.1).",
88
+ fixHint: "Use the text: path for now — the MockAssistantProvider matches against tool descriptions deterministically. For real-provider validation, run the OpenAi provider session with a real mic source (sim browser tab mic, or real glasses).",
89
+ retryable: false,
90
+ });
91
+ }
92
+ const payload = {
93
+ type: "stt_transcript",
94
+ text: text,
95
+ isFinal: true,
96
+ confidence: 0.99,
97
+ source: "assistant_inject",
98
+ };
99
+ const res = await backendFetch(`/api/sessions/${encodeURIComponent(o.sessionId)}/inject`, {
100
+ method: "POST",
101
+ body: payload,
102
+ });
103
+ if (res.status === 404) {
104
+ return errorResponse({
105
+ code: "session_not_found",
106
+ message: `No session found with id ${JSON.stringify(o.sessionId)}.`,
107
+ fixHint: "Call createSimulatorSession to start a new session.",
108
+ retryable: false,
109
+ });
110
+ }
111
+ if (res.status === 409) {
112
+ const body = res.data;
113
+ return errorResponse({
114
+ code: "app_not_attached",
115
+ message: body?.message ??
116
+ "Inject not delivered: the session exists but no app role is currently attached.",
117
+ fixHint: "Start your app (build + run on the emulator/device) so the WebSocket attaches, then retry. Confirm with getSimulatorStatus — connectedRoles.app should be present. Also verify glasses.assistant.start { ... } has been called in your app — the inject routes to the active assistant session.",
118
+ retryable: true,
119
+ });
120
+ }
121
+ if (!res.ok || !res.data || res.data.delivered !== true) {
122
+ return errorResponse({
123
+ code: "backend_unreachable",
124
+ message: `Backend /api/sessions/${o.sessionId}/inject failed: ${res.errorText ?? `HTTP ${res.status}`}.`,
125
+ fixHint: "Ensure the Extentos backend is reachable.",
126
+ retryable: true,
127
+ });
128
+ }
129
+ return okResponse({
130
+ sessionId: o.sessionId,
131
+ delivered: true,
132
+ mode: "text",
133
+ frame: res.data.frame ?? payload,
134
+ summary: `Injected utterance "${text.slice(0, 60)}${text.length > 60 ? "…" : ""}" into ${o.sessionId}. ` +
135
+ `Follow up with assertToolCalled({ sessionId, name: "..." }) to verify the expected tool fired, ` +
136
+ `or getEventLog(types: ["assistant.tool_called","assistant.assistant_spoke"]) to see the full event trace.`,
137
+ });
138
+ }
139
+ //# sourceMappingURL=injectAssistantUtterance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injectAssistantUtterance.js","sourceRoot":"","sources":["../../../src/tools/handlers/injectAssistantUtterance.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validateIntegration.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/validateIntegration.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA0B7D,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAuVlE"}
1
+ {"version":3,"file":"validateIntegration.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/validateIntegration.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA0B7D,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CA0WlE"}
@@ -16,6 +16,11 @@
16
16
  // * Android: AGP + Gradle versions meet the library's floor
17
17
  // * Android: declare a foreground-service hint when capabilities require
18
18
  // background mic / camera survival
19
+ // * Android: ExtentosBootstrap subclass field-init footgun — top-level
20
+ // property initializers that touch Context (via `(this)` or a `getXxx()`
21
+ // Context method) run before `attachBaseContext` wires the Context and
22
+ // NPE at app start. Heuristic regex check; flags suspect lines so the
23
+ // dev can switch to `by lazy { ... }` or move the init into `onCreate()`.
19
24
  import { readFileSync, existsSync, readdirSync } from "node:fs";
20
25
  import { createHash } from "node:crypto";
21
26
  import { join, isAbsolute, resolve } from "node:path";
@@ -312,10 +317,29 @@ export function handleValidateIntegration(raw) {
312
317
  // longer exists.
313
318
  const bCheck = checkBootstrap(projectPath, generatedFiles, platform);
314
319
  checks.push(bCheck);
320
+ // bootstrap_subclass_field_inits_safe — heuristic NPE footgun check.
321
+ // Customers who extend ExtentosBootstrap with a peer field like
322
+ // `val library = LibraryStore(this)` crash at app start because the
323
+ // initializer runs before attachBaseContext wires Context. Caught
324
+ // during the 2026-05-24 dogfood; emits warn-severity with the offending
325
+ // file + the property name so the dev can switch to `by lazy` or move
326
+ // the init into onCreate(). Android-only (Application lifecycle quirk).
327
+ const fiCheck = checkBootstrapSubclassFieldInits(projectPath, platform);
328
+ if (fiCheck)
329
+ checks.push(fiCheck);
315
330
  // ui_artifact_matches_usage
316
331
  const uiCheck = checkUiArtifact(projectPath, platform, manifest);
317
332
  if (uiCheck)
318
333
  checks.push(uiCheck);
334
+ // Phase 4 — assistant_integration_advisory (S2.W.8). Detects whether the
335
+ // app uses the canonical Phase 4 `glasses.assistant.start` surface, flags
336
+ // legacy Phase 3 `glasses.conversation.*` / `glasses.ai.complete` calls
337
+ // with v2.0.0-removal warnings, and notes when both coexist (the v1.4.0
338
+ // migration window). Soft-severity — info when only Phase 4 is used;
339
+ // warn when Phase 3 is still present.
340
+ const phase4Check = checkAssistantIntegration(projectPath, platform);
341
+ if (phase4Check)
342
+ checks.push(phase4Check);
319
343
  // agp_version_supported + gradle_version_supported (Android only).
320
344
  // F-R4-8: read the project's actual AGP/Gradle versions, compare against
321
345
  // the manifest's recorded minimums (or VERSION_INFO if the manifest
@@ -572,6 +596,64 @@ function checkBootstrap(projectPath, generatedFiles, platform) {
572
596
  details: `Bootstrap calls ${expectedCreate}…). SDK is wired.`,
573
597
  };
574
598
  }
599
+ // Phase 4 — assistant_integration_advisory (S2.W.8). Light source scan
600
+ // to surface Phase 3 / Phase 4 usage. Three observable states:
601
+ // - Phase 4 only (assistant.start present, conversation.* + ai.complete
602
+ // absent) → info, "✓ Phase 4 canonical surface in use"
603
+ // - Phase 3 still present (conversation.* or ai.complete found) → warn,
604
+ // "Phase 3 conversation runtime is DEPRECATED in v1.4.0 and removed
605
+ // in v2.0.0; migrate to glasses.assistant.start"
606
+ // - Both coexist → info, "Mixed Phase 3 + Phase 4 — migration in progress,
607
+ // complete before v2.0.0"
608
+ // - Neither (no voice AI wired) → null (no check emitted; not all apps
609
+ // use voice AI)
610
+ //
611
+ // Detection by string scan, not AST — fine for an advisory check.
612
+ function checkAssistantIntegration(projectPath, platform) {
613
+ // Source needles for Phase 4 and Phase 3 voice surfaces.
614
+ const phase4Needle = "assistant.start"; // glasses.assistant.start { ... }
615
+ const phase3Needles = ["conversation.onWake", "conversation.start", "ai.complete"];
616
+ let usesPhase4 = false;
617
+ let usesPhase3 = false;
618
+ for (const root of candidateSourceRoots(projectPath, platform)) {
619
+ if (!existsSync(root))
620
+ continue;
621
+ const text = readProjectText(root);
622
+ if (text.includes(phase4Needle))
623
+ usesPhase4 = true;
624
+ if (phase3Needles.some((n) => text.includes(n)))
625
+ usesPhase3 = true;
626
+ if (usesPhase4 && usesPhase3)
627
+ break;
628
+ }
629
+ // No voice-AI surface detected — not every app uses voice; emit nothing.
630
+ if (!usesPhase4 && !usesPhase3)
631
+ return null;
632
+ if (usesPhase4 && !usesPhase3) {
633
+ return {
634
+ name: "assistant_integration_advisory",
635
+ passed: true,
636
+ severity: "info",
637
+ details: "✓ Phase 4 canonical voice-AI surface (`glasses.assistant.start`) detected; no deprecated Phase 3 conversation runtime references found.",
638
+ };
639
+ }
640
+ if (!usesPhase4 && usesPhase3) {
641
+ return {
642
+ name: "assistant_integration_advisory",
643
+ passed: false,
644
+ severity: "warn",
645
+ details: "Phase 3 conversation runtime detected (`glasses.conversation.*` or `glasses.ai.complete`). These APIs are DEPRECATED in v1.4.0 and REMOVED in v2.0.0. Migrate to `glasses.assistant.start { tool(name, description) { body } }` — customer code typically drops ~60% LoC.",
646
+ fix: "Read `docs/migration/phase-3-to-phase-4.md` (also available via `searchDocs(topic: 'assistant_runtime')`). Migrate each `onWake { while(true) { listen() ... } }` block to `assistant.start(provider) { tool(...) { ... } }`. Migrate each `glasses.ai.complete(prompt)` call to OpenAI SDK direct (walkthrough C). Same BYOK key; rename `glasses.ai.setOpenaiApiKey` → `glasses.assistant.setOpenaiApiKey`.",
647
+ };
648
+ }
649
+ // Both present — migration in progress.
650
+ return {
651
+ name: "assistant_integration_advisory",
652
+ passed: true,
653
+ severity: "info",
654
+ details: "Mixed Phase 3 + Phase 4 voice-AI surfaces detected. v1.4.0 deprecation window — both coexist. Complete the Phase 3 → Phase 4 migration before v2.0.0 (3-month deprecation window from v1.4.0 ship date). See `docs/migration/phase-3-to-phase-4.md`.",
655
+ };
656
+ }
575
657
  function checkUiArtifact(projectPath, platform, manifest) {
576
658
  const uiSymbols = ["ExtentosConnectionPage", "ExtentosTheme", "rememberExtentosState", "ExtentosState"];
577
659
  let anyUsage = false;
@@ -760,6 +842,92 @@ function readTextSafe(abs) {
760
842
  return "";
761
843
  }
762
844
  }
845
+ function walkKtFiles(root, fn, depth = 0, cap = 6) {
846
+ if (depth > cap)
847
+ return;
848
+ let entries;
849
+ try {
850
+ entries = readdirSync(root, { withFileTypes: true });
851
+ }
852
+ catch {
853
+ return;
854
+ }
855
+ for (const entry of entries) {
856
+ const name = entry.name;
857
+ if (name.startsWith(".") || name === "node_modules" || name === "build" || name === "Pods")
858
+ continue;
859
+ const abs = join(root, name);
860
+ if (entry.isDirectory()) {
861
+ walkKtFiles(abs, fn, depth + 1, cap);
862
+ }
863
+ else if (/\.kt$/.test(name)) {
864
+ fn(abs, readTextSafe(abs));
865
+ }
866
+ }
867
+ }
868
+ function shortPath(abs, projectPath) {
869
+ return abs.startsWith(projectPath)
870
+ ? abs.slice(projectPath.length + 1).replaceAll("\\", "/")
871
+ : abs;
872
+ }
873
+ function checkBootstrapSubclassFieldInits(projectPath, platform) {
874
+ if (platform !== "android")
875
+ return null;
876
+ const findings = [];
877
+ for (const root of candidateSourceRoots(projectPath, "android")) {
878
+ walkKtFiles(root, (file, text) => {
879
+ // Only examine files declaring a subclass of ExtentosBootstrap. We
880
+ // don't try to AST-parse — Kotlin lacks a cheap JS parser here, and
881
+ // the canonical subclass form (`class MyApp : ExtentosBootstrap() {`)
882
+ // is well-bounded enough that regex is good enough.
883
+ const header = text.match(/class\s+\w+\s*[^{]*:\s*ExtentosBootstrap\s*\(\s*\)\s*\{/);
884
+ if (!header)
885
+ return;
886
+ // Scan the class body up to the first member function declaration —
887
+ // top-level property initializers live in that window. Members
888
+ // declared inside `companion object { ... }` or nested classes are
889
+ // out of scope for the constructor-time NPE we care about.
890
+ const bodyStart = (header.index ?? 0) + header[0].length;
891
+ const afterBody = text.slice(bodyStart);
892
+ const firstFn = afterBody.match(/^\s*(?:override\s+|protected\s+|private\s+|internal\s+|public\s+)*fun\s+/m);
893
+ const bodyEnd = firstFn ? bodyStart + (firstFn.index ?? 0) : text.length;
894
+ const body = text.slice(bodyStart, bodyEnd);
895
+ // Match property declarations with single-line initializers. Skips
896
+ // `lateinit var` (no `=`), multi-line inits (rare for fields, OK to
897
+ // miss), and explicit `by lazy { ... }` (safe — first read fires
898
+ // after super.onCreate()).
899
+ const fieldInitRe = /^\s*(?:private\s+|protected\s+|internal\s+|public\s+)?(?:val|var)\s+(\w+)(?:\s*:\s*[^=]+?)?\s*=\s*([^\n]+)$/gm;
900
+ let m;
901
+ while ((m = fieldInitRe.exec(body))) {
902
+ const name = m[1];
903
+ const initText = m[2].trim();
904
+ if (/\bby\s+lazy\b/.test(initText))
905
+ continue;
906
+ if (/\blazy\s*\(/.test(initText))
907
+ continue;
908
+ const touchesContext = /\bthis\b/.test(initText) ||
909
+ /\bget(?:FilesDir|CacheDir|ExternalFilesDir|NoBackupFilesDir|CodeCacheDir|Dir|SharedPreferences|ApplicationContext|SystemService|Resources|Assets|ContentResolver|PackageManager|String|Database|DatabasePath)\s*\(/.test(initText);
910
+ if (touchesContext) {
911
+ findings.push(`${shortPath(file, projectPath)}: \`${name}\` initializer touches Context: \`${initText.slice(0, 80)}${initText.length > 80 ? "…" : ""}\``);
912
+ }
913
+ }
914
+ });
915
+ }
916
+ if (findings.length === 0) {
917
+ return {
918
+ name: "bootstrap_subclass_field_inits_safe",
919
+ passed: true,
920
+ details: "No ExtentosBootstrap subclass field-init touches Context (or no subclass exists — both fine).",
921
+ };
922
+ }
923
+ return {
924
+ name: "bootstrap_subclass_field_inits_safe",
925
+ passed: false,
926
+ severity: "warn",
927
+ details: `Detected ${findings.length} field initializer(s) on an ExtentosBootstrap subclass that may touch Context before \`attachBaseContext\` wires it. The app will crash at start with NullPointerException because top-level property initializers run before super.onCreate(). Suspect line(s):\n${findings.map((f) => ` - ${f}`).join("\n")}`,
928
+ fix: "Wrap each suspect field in `by lazy { ... }` (first read fires the initializer after super.onCreate()) or move the init into onCreate() itself with `lateinit var … ; private set`. See ExtentosBootstrap.kt KDoc for examples.",
929
+ };
930
+ }
763
931
  function sha256(text) {
764
932
  return createHash("sha256").update(text).digest("hex");
765
933
  }