@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.
- package/dist/tools/data/capabilityPatterns.d.ts.map +1 -1
- package/dist/tools/data/capabilityPatterns.js +250 -3
- package/dist/tools/data/capabilityPatterns.js.map +1 -1
- package/dist/tools/data/codeExamples.d.ts.map +1 -1
- package/dist/tools/data/codeExamples.js +421 -10
- package/dist/tools/data/codeExamples.js.map +1 -1
- package/dist/tools/data/version.d.ts +0 -1
- package/dist/tools/data/version.d.ts.map +1 -1
- package/dist/tools/data/version.js +9 -1
- package/dist/tools/data/version.js.map +1 -1
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +54 -3
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/docs/index.d.ts.map +1 -1
- package/dist/tools/docs/index.js +115 -2
- package/dist/tools/docs/index.js.map +1 -1
- package/dist/tools/handlers/assertToolCalled.d.ts +3 -0
- package/dist/tools/handlers/assertToolCalled.d.ts.map +1 -0
- package/dist/tools/handlers/assertToolCalled.js +171 -0
- package/dist/tools/handlers/assertToolCalled.js.map +1 -0
- package/dist/tools/handlers/getProductionChecklist.d.ts.map +1 -1
- package/dist/tools/handlers/getProductionChecklist.js +60 -9
- package/dist/tools/handlers/getProductionChecklist.js.map +1 -1
- package/dist/tools/handlers/injectAssistantUtterance.d.ts +3 -0
- package/dist/tools/handlers/injectAssistantUtterance.d.ts.map +1 -0
- package/dist/tools/handlers/injectAssistantUtterance.js +139 -0
- package/dist/tools/handlers/injectAssistantUtterance.js.map +1 -0
- package/dist/tools/handlers/validateIntegration.d.ts.map +1 -1
- package/dist/tools/handlers/validateIntegration.js +168 -0
- package/dist/tools/handlers/validateIntegration.js.map +1 -1
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +4 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/templates/androidBootstrap.d.ts.map +1 -1
- package/dist/tools/templates/androidBootstrap.js +35 -0
- package/dist/tools/templates/androidBootstrap.js.map +1 -1
- 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;
|
|
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.
|
|
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)
|
|
120
|
-
//
|
|
121
|
-
//
|
|
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,
|
|
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
|
|
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)
|
|
131
|
-
: "1)
|
|
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":"AAAA,wEAAwE;AACxE,EAAE;AACF,+EAA+E;AAC/E,kEAAkE;AAClE,0EAA0E;AAC1E,0EAA0E;AAC1E,gEAAgE;AAEhE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,6BAA6B,EAC7B,yBAAyB,EACzB,6BAA6B,GAC9B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAmB,MAAM,gBAAgB,CAAC;AAsB5E,uEAAuE;AACvE,mCAAmC;AACnC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,cAAc;IACd,cAAc;IACd,2BAA2B;IAC3B,uBAAuB;IACvB,uBAAuB;CACxB,CAAC,CAAC;AAEH,uEAAuE;AACvE,4DAA4D;AAC5D,mCAAmC;AACnC,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,eAAe;IACf,WAAW;IACX,cAAc;IACd,eAAe;IACf,0BAA0B;IAC1B,cAAc;IACd,2BAA2B;IAC3B,mEAAmE;IACnE,iEAAiE;IACjE,wEAAwE;IACxE,sBAAsB;IACtB,sBAAsB;IACtB,qBAAqB;IACrB,oBAAoB;IACpB,0BAA0B;CAC3B,CAAC,CAAC;AAEH,oEAAoE;AACpE,wEAAwE;AACxE,sEAAsE;AACtE,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC;IACxC,sBAAsB;IACtB,sBAAsB;IACtB,qBAAqB;IACrB,oBAAoB;IACpB,0BAA0B;CAC3B,CAAC,CAAC;AAEH,MAAM,UAAU,4BAA4B,CAAC,GAAY;IACvD,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,OAAO,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC;IAC3C,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAEjE,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IACzE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACxC,MAAM,kBAAkB,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE1F,MAAM,OAAO,GAAG,6BAA6B,CAAC,YAAY,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,yBAAyB,CAAC,YAAY,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,6BAA6B,CAAC,YAAY,CAAC,CAAC;IAC5D,MAAM,uBAAuB,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3F,MAAM,KAAK,GAAoB,EAAE,CAAC;IAElC,4BAA4B;IAC5B,KAAK,CAAC,IAAI,CAAC;QACT,QAAQ,EAAE,wBAAwB;QAClC,WAAW,EAAE,0EAA0E;QACvF,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;QAC3C,OAAO,EACL,mJAAmJ;QACrJ,GAAG,EAAE,2KAA2K;KACjL,CAAC,CAAC;IAEH,sBAAsB;IACtB,KAAK,CAAC,IAAI,CAAC;QACT,QAAQ,EAAE,kBAAkB;QAC5B,WAAW,EAAE,uEAAuE;QACpF,MAAM,EAAE,QAAQ;QAChB,OAAO,EACL,QAAQ,KAAK,SAAS;YACpB,CAAC,CAAC,yJAAyJ;YAC3J,CAAC,CAAC,wIAAwI;QAC9I,GAAG,EACD,QAAQ,KAAK,SAAS;YACpB,CAAC,CAAC,gHAAgH;YAClH,CAAC,CAAC,iFAAiF;QACvF,cAAc,EAAE,OAAO,CAAC,MAAM;KAC/B,CAAC,CAAC;IAEH,qBAAqB;IACrB,KAAK,CAAC,IAAI,CAAC;QACT,QAAQ,EAAE,iBAAiB;QAC3B,WAAW,EAAE,6EAA6E;QAC1F,MAAM,EAAE,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;QAC3D,OAAO,EACL,4KAA4K;QAC9K,GAAG,EACD,QAAQ,KAAK,SAAS;YACpB,CAAC,CAAC,4GAA4G;YAC9G,CAAC,CAAC,oFAAoF;QAC1F,UAAU,EACR,QAAQ,KAAK,SAAS;YACpB,CAAC,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,kCAAkC,EAAE;YAC9E,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,kDAAkD,EAAE;KACvF,CAAC,CAAC;IAEH,kDAAkD;IAClD,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC;YACT,QAAQ,EAAE,UAAU;YACpB,WAAW,EAAE,0BAA0B,QAAQ,CAAC,MAAM,WAAW,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG;YACpG,MAAM,EAAE,QAAQ;YAChB,OAAO,EACL,gLAAgL;gBAChL,CAAC,uBAAuB;oBACtB,CAAC,CAAC,kNAAkN;oBACpN,CAAC,CAAC,EAAE,CAAC;YACT,GAAG,EAAE,yLAAyL;YAC9L,gBAAgB,EAAE,QAAQ;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,oEAAoE;IACpE,sEAAsE;IACtE,sDAAsD;IACtD,yEAAyE;IACzE,kEAAkE;IAClE,qEAAqE;IACrE,qEAAqE;IACrE,qEAAqE;IACrE,IAAI,uBAAuB,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC;YACT,QAAQ,EAAE,oCAAoC;YAC9C,WAAW,EACT,wGAAwG;YAC1G,MAAM,EAAE,QAAQ;YAChB,OAAO,EACL,+9BAA+9B;YACj+B,GAAG,EACD,QAAQ,KAAK,SAAS;gBACpB,CAAC,CAAC,+fAA+f;gBACjgB,CAAC,CAAC,kdAAkd;YACxd,UAAU,EACR,QAAQ,KAAK,SAAS;gBACpB,CAAC,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,mFAAmF,EAAE;gBAC/H,CAAC,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,mFAAmF,EAAE;SACpI,CAAC,CAAC;IACL,CAAC;IAED,gCAAgC;IAChC,MAAM,SAAS,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC;IAC7F,KAAK,CAAC,IAAI,CAAC;QACT,QAAQ,EAAE,mBAAmB;QAC7B,WAAW,EAAE,UAAU,SAAS,IAAI,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,gBAAgB,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,wDAAwD;QACzL,MAAM,EAAE,QAAQ;QAChB,OAAO,EACL,QAAQ,KAAK,SAAS;YACpB,CAAC,CAAC,wBAAwB,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,+IAA+I;YACvM,CAAC,CAAC,4BAA4B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,oHAAoH;QAChM,GAAG,EACD,QAAQ,KAAK,SAAS;YACpB,CAAC,CAAC,kLAAkL;YACpL,CAAC,CAAC,sJAAsJ;KAC7J,CAAC,CAAC;IAEH,0EAA0E;IAC1E,IAAI,UAAU,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC;YACT,QAAQ,EAAE,oBAAoB;YAC9B,WAAW,EAAE,qBAAqB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,uDAAuD;YAC5G,MAAM,EAAE,QAAQ;YAChB,OAAO,EACL,+YAA+Y;YACjZ,GAAG,EACD,gEAAgE;gBAChE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;gBACjB,2OAA2O;YAC7O,UAAU,EAAE;gBACV,IAAI,EAAE,qBAAqB;gBAC3B,IAAI,EACF,mFAAmF;oBACnF,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;oBACjB,kCAAkC;aACrC;SACF,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,UAAU,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC;YACT,QAAQ,EAAE,kBAAkB;YAC5B,WAAW,EAAE,yEAAyE;YACtF,MAAM,EAAE,QAAQ;YAChB,OAAO,EACL,6MAA6M;YAC/M,GAAG,EAAE,kIAAkI;YACvI,UAAU,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,mBAAmB,EAAE;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,+BAA+B;IAC/B,KAAK,CAAC,IAAI,CAAC;QACT,QAAQ,EAAE,kBAAkB;QAC5B,WAAW,EAAE,sFAAsF;QACnG,MAAM,EAAE,QAAQ;QAChB,OAAO,EACL,6PAA6P;QAC/P,GAAG,EACD,QAAQ,KAAK,SAAS;YACpB,CAAC,CAAC,gJAAgJ;YAClJ,CAAC,CAAC,iIAAiI;KACxI,CAAC,CAAC;IAEH,+EAA+E;IAC/E,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC;YACT,QAAQ,EAAE,4BAA4B;YACtC,WAAW,EAAE,qEAAqE;YAClF,MAAM,EAAE,QAAQ;YAChB,OAAO,EACL,aAAa,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;gBAC9C,sVAAsV;gBACtV,CAAC,uBAAuB;oBACtB,CAAC,CAAC,seAAse;oBACxe,CAAC,CAAC,EAAE,CAAC;YACT,GAAG,EACD,sVAAsV;gBACtV,CAAC,uBAAuB;oBACtB,CAAC,CAAC,oaAAoa;oBACta,CAAC,CAAC,EAAE,CAAC;SACV,CAAC,CAAC;IACL,CAAC;IAED,+CAA+C;IAC/C,KAAK,CAAC,IAAI,CAAC;QACT,QAAQ,EAAE,eAAe;QACzB,WAAW,EACT,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,6CAA6C;QACjH,MAAM,EAAE,UAAU;QAClB,OAAO,EACL,QAAQ,KAAK,SAAS;YACpB,CAAC,CAAC,qMAAqM;YACvM,CAAC,CAAC,uKAAuK;QAC7K,GAAG,EAAE,sHAAsH;KAC5H,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IACtE,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAClE,MAAM,KAAK,GAAG,WAAW,KAAK,CAAC,CAAC;IAEhC,MAAM,OAAO,GAAG,YAAY,CAAC;QAC3B,KAAK;QACL,WAAW;QACX,SAAS;QACT,KAAK,EAAE,KAAK,CAAC,MAAM;QACnB,QAAQ;QACR,WAAW;QACX,UAAU;QACV,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM;QACjC,gBAAgB,EAAE,OAAO,CAAC,WAAW,CAAC;QACtC,aAAa,EAAE,KAAK,CAAC,cAAc;KACpC,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,YAAY,CAAC,IAWrB;IACC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CACR,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,sBAAsB,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,WAAW,QAAQ,IAAI,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,kBAAkB,IAAI,CAAC,SAAS,UAAU,IAAI,CAAC,KAAK,SAAS,CACpM,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,6GAA6G,CAAC,CAAC;IAC5H,CAAC;SAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;IAC5F,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,kBAAkB,IAAI,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,2CAA2C,CAAC,CAAC;IAC5H,IAAI,IAAI,CAAC,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;IAC3G,IAAI,CAAC,IAAI,CAAC,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IACnF,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,SAAS,CAChB,GAAY;IAIZ,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,UAAU,CACf,6DAA6D,EAC7D,oHAAoH,CACrH,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,GAA8B,CAAC;IAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QACrC,OAAO,UAAU,CACf,2DAA2D,EAC3D,uBAAuB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACxD,CAAC;IACJ,CAAC;IACD,MAAM,YAAY,GAAI,GAAG,CAAC,YAA0B,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IACvG,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,UAAU,CACf,yBAAyB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAC9C,uBAAuB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACxD,CAAC;IACJ,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QACzD,OAAO,UAAU,CACf,4CAA4C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAC5E,oCAAoC,CACrC,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC1C,CAAC,CAAE,GAAG,CAAC,QAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;QAC/E,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,WAAW,GAAG,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;IACtF,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;AACzE,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,OAAe;IAClD,OAAO;QACL,KAAK,EAAE,aAAa,CAAC;YACnB,IAAI,EAAE,mBAAmB;YACzB,OAAO;YACP,OAAO;YACP,SAAS,EAAE,KAAK;SACjB,CAAC;KACH,CAAC;AACJ,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,yBAAyB,EAAE,KAAK,EAAE,CAAC;AACrE,CAAC;AAED,SAAS,gBAAgB,CAAC,WAAmB;IAC3C,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAE,MAAkC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAE5F,CAAC;QACd,MAAM,KAAK,GAAG,OAAO,IAAI,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,SAAoB,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3F,MAAM,KAAK,GAAG,OAAO,IAAI,EAAE,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,WAAsB,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/F,MAAM,aAAa,GAAG,CAAC,CAAqB,EAAE,EAAE,CAC9C,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACrG,MAAM,UAAU,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAClE,OAAO;YACL,cAAc,EAAE,IAAI;YACpB,yBAAyB,EAAE,UAAU;YACrC,SAAS,EAAE,KAAK;SACjB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,UAAU,EAAE,CAAC;IACtB,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"getProductionChecklist.js","sourceRoot":"","sources":["../../../src/tools/handlers/getProductionChecklist.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"AAAA,6CAA6C;AAC7C,EAAE;AACF,kEAAkE;AAClE,yEAAyE;AACzE,qEAAqE;AACrE,wEAAwE;AACxE,EAAE;AACF,oEAAoE;AACpE,oEAAoE;AACpE,sEAAsE;AACtE,oEAAoE;AACpE,qEAAqE;AACrE,oDAAoD;AACpD,mEAAmE;AACnE,oEAAoE;AACpE,iEAAiE;AACjE,4DAA4D;AAC5D,+BAA+B;AAC/B,EAAE;AACF,mEAAmE;AACnE,kEAAkE;AAClE,qEAAqE;AACrE,qEAAqE;AACrE,wCAAwC;AAExC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAmB,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAUxD,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,GAAY;IAEZ,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,aAAa,CAAC;YACnB,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,2EAA2E;YACpF,OAAO,EACL,4MAA4M;YAC9M,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IACD,MAAM,CAAC,GAAG,GAA8B,CAAC;IACzC,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3D,OAAO,aAAa,CAAC;YACnB,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,iCAAiC;YAC1C,OAAO,EAAE,wDAAwD;YACjE,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,MAAM,cAAc,GAClB,OAAO,CAAC,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;IAEtE,uEAAuE;IACvE,mEAAmE;IACnE,IAAI,IAAI,IAAI,IAAI,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;QAC3C,OAAO,aAAa,CAAC;YACnB,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,4CAA4C;YACrD,OAAO,EACL,gJAAgJ;YAClJ,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,IAAI,IAAI,IAAI,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;QAC3C,OAAO,aAAa,CAAC;YACnB,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,gDAAgD;YACzD,OAAO,EACL,gGAAgG;YAClG,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,aAAa,CAAC;YACnB,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,yBAAyB;YAClC,OAAO,EAAE,uEAAuE;YAChF,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IAED,sEAAsE;IACtE,mEAAmE;IACnE,uEAAuE;IACvE,wEAAwE;IACxE,wDAAwD;IACxD,oEAAoE;IACpE,8DAA8D;IAC9D,EAAE;IACF,uEAAuE;IACvE,sEAAsE;IACtE,yCAAyC;IACzC,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;QAC3B,OAAO,aAAa,CAAC;YACnB,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,sEAAsE;YAC/E,OAAO,EACL,0OAA0O;YAC5O,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAA4B;QACvC,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,IAAK;QACX,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,IAAI;QAChB,MAAM,EAAE,kBAAkB;KAC3B,CAAC;IAEF,MAAM,GAAG,GAAG,MAAM,YAAY,CAC5B,iBAAiB,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,EACzD;QACE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,OAAO;KACd,CACF,CAAC;IAEF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO,aAAa,CAAC;YACnB,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,4BAA4B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG;YACnE,OAAO,EAAE,qDAAqD;YAC9D,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACtB,OAAO,aAAa,CAAC;YACnB,IAAI,EAAE,kBAAkB;YACxB,OAAO,EACL,IAAI,EAAE,OAAO;gBACb,iFAAiF;YACnF,OAAO,EACL,iSAAiS;YACnS,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QACxD,OAAO,aAAa,CAAC;YACnB,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,yBAAyB,CAAC,CAAC,SAAS,mBAC3C,GAAG,CAAC,SAAS,IAAI,QAAQ,GAAG,CAAC,MAAM,EACrC,GAAG;YACH,OAAO,EAAE,2CAA2C;YACpD,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,UAAU,CAAC;QAChB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,SAAS,EAAE,IAAI;QACf,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO;QAChC,OAAO,EACL,uBAAuB,IAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,SAAS,IAAI;YACjG,iGAAiG;YACjG,2GAA2G;KAC9G,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validateIntegration.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/validateIntegration.ts"],"names":[],"mappings":"
|
|
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
|
}
|