@extentos/mcp-server 0.10.1 → 0.11.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/README.md +1 -1
- package/dist/tools/data/capabilities.js +1 -1
- package/dist/tools/data/capabilities.js.map +1 -1
- package/dist/tools/data/capabilityPatterns.d.ts.map +1 -1
- package/dist/tools/data/capabilityPatterns.js +152 -53
- 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 +206 -49
- package/dist/tools/data/codeExamples.js.map +1 -1
- package/dist/tools/data/version.js +6 -6
- package/dist/tools/data/version.js.map +1 -1
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +61 -19
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/docs/index.d.ts.map +1 -1
- package/dist/tools/docs/index.js +51 -22
- package/dist/tools/docs/index.js.map +1 -1
- package/dist/tools/handlers/generateConnectionModule.d.ts.map +1 -1
- package/dist/tools/handlers/generateConnectionModule.js +36 -4
- package/dist/tools/handlers/generateConnectionModule.js.map +1 -1
- package/dist/tools/handlers/getEventLog.d.ts.map +1 -1
- package/dist/tools/handlers/getEventLog.js +38 -2
- package/dist/tools/handlers/getEventLog.js.map +1 -1
- package/dist/tools/handlers/validateIntegration.d.ts.map +1 -1
- package/dist/tools/handlers/validateIntegration.js +89 -31
- package/dist/tools/handlers/validateIntegration.js.map +1 -1
- package/dist/tools/templates/androidBootstrap.d.ts.map +1 -1
- package/dist/tools/templates/androidBootstrap.js +10 -0
- package/dist/tools/templates/androidBootstrap.js.map +1 -1
- package/dist/tools/util/dependency.d.ts.map +1 -1
- package/dist/tools/util/dependency.js +64 -13
- package/dist/tools/util/dependency.js.map +1 -1
- package/dist/tools/util/manifest.d.ts.map +1 -1
- package/dist/tools/util/manifest.js +7 -3
- package/dist/tools/util/manifest.js.map +1 -1
- package/dist/tools/util/permissions.d.ts.map +1 -1
- package/dist/tools/util/permissions.js +3 -1
- package/dist/tools/util/permissions.js.map +1 -1
- package/package.json +68 -66
|
@@ -118,7 +118,11 @@ export const toolDefinitions = [
|
|
|
118
118
|
properties: {
|
|
119
119
|
platform: platformEnum,
|
|
120
120
|
glasses: glassesEnum,
|
|
121
|
-
appPackage: {
|
|
121
|
+
appPackage: {
|
|
122
|
+
type: "string",
|
|
123
|
+
minLength: 1,
|
|
124
|
+
description: "The Extentos project identity (reverse-DNS). This is what the SDK reports as the app id for telemetry, agent config, and sounds — it is NOT required to equal the store bundle id / applicationId (the scaffold bakes it as config.appId, decoupled). For a NEW app, use your bundle id. For an EXISTING app already shipped to both stores with DIFFERENT locked bundle ids, pass the SAME appPackage on BOTH platforms — both then share ONE Extentos project (one agent config, one sound set, per-platform analytics) regardless of the store ids.",
|
|
125
|
+
},
|
|
122
126
|
libraryVersion: { type: "string" },
|
|
123
127
|
responseFormat: responseFormatEnum,
|
|
124
128
|
placement: {
|
|
@@ -251,7 +255,7 @@ export const toolDefinitions = [
|
|
|
251
255
|
// dashboard). Canonical design: shared-context/mcp-permission-system-design.md.
|
|
252
256
|
{
|
|
253
257
|
name: "getAssistantConfig",
|
|
254
|
-
description: 'Read the per-project "Agent" (assistant) settings the dashboard holds for an app — the OpenAI Realtime model, the voice, the memory (compaction) model, and the within-session memory mode — plus the catalog of valid options for each, the dashboard defaults, and the SDK hard defaults. Returns { managed, config, options, dashboardDefaults, sdkHardDefaults }: managed=true means a dashboard row exists and drives these at session start; managed=false means none is set, so the SDK uses its hard defaults unless the app code sets values. Runtime precedence is code-set > dashboard config > SDK hard defaults; this tool sees the dashboard layer only. Account-scoped + read-only — requires a linked Extentos account (run `extentos-mcp login`; a 401 returns account_required). Consumed by
|
|
258
|
+
description: 'Read the per-project "Agent" (assistant) settings the dashboard holds for an app — the OpenAI Realtime model, the voice, the memory (compaction) model, and the within-session memory mode — plus the catalog of valid options for each, the dashboard defaults, and the SDK hard defaults. Returns { managed, config, options, dashboardDefaults, sdkHardDefaults }: managed=true means a dashboard row exists and drives these at session start; managed=false means none is set, so the SDK uses its hard defaults unless the app code sets values. Runtime precedence is code-set > dashboard config > SDK hard defaults; this tool sees the dashboard layer only. Account-scoped + read-only — requires a linked Extentos account (run `extentos-mcp login`; a 401 returns account_required). Consumed by BOTH SDKs at assistant start (iOS re-fetches on app relaunch — no rebuild needed). USE to see what models/voice a project is configured with, or to discover the valid option ids before recommending a change. DON\'T USE to change them (use setAssistantConfig; the dashboard\'s Agent section is the human-facing editor) or for usage/cost (use getGatewayUsage).',
|
|
255
259
|
inputSchema: {
|
|
256
260
|
type: "object",
|
|
257
261
|
properties: {
|
|
@@ -267,7 +271,7 @@ export const toolDefinitions = [
|
|
|
267
271
|
},
|
|
268
272
|
{
|
|
269
273
|
name: "setAssistantConfig",
|
|
270
|
-
description: 'Change a project\'s dashboard-managed "Agent" (assistant) settings via MCP — any of the OpenAI Realtime model, voice, memory (compaction) model, or within-session memory mode (PARTIAL update; pass only what you\'re changing). Validates each value against the catalog (call getAssistantConfig first to see valid ids) and echoes the COST IMPACT of a model change (per-1M rates, old → new) so a switch is never blind. GATED by the project\'s MCP access grant — the default is Read+Write so it works out of the box; the owner can restrict it per-project in the dashboard, and a permission_denied (403) means Assistant-config access was set to Read or Off. Requires a linked Extentos account (a 401 returns account_required, run `extentos-mcp login`). Applies to the
|
|
274
|
+
description: 'Change a project\'s dashboard-managed "Agent" (assistant) settings via MCP — any of the OpenAI Realtime model, voice, memory (compaction) model, or within-session memory mode (PARTIAL update; pass only what you\'re changing). Validates each value against the catalog (call getAssistantConfig first to see valid ids) and echoes the COST IMPACT of a model change (per-1M rates, old → new) so a switch is never blind. GATED by the project\'s MCP access grant — the default is Read+Write so it works out of the box; the owner can restrict it per-project in the dashboard, and a permission_denied (403) means Assistant-config access was set to Read or Off. Requires a linked Extentos account (a 401 returns account_required, run `extentos-mcp login`). Applies to the next assistant session on BOTH platforms (a value set in app code still wins; Android picks it up in a fresh process, iOS on app relaunch). USE to configure a project\'s voice agent from the agent loop. DON\'T USE to read current settings (use getAssistantConfig) or to set secrets (credentials are never written through the agent).',
|
|
271
275
|
inputSchema: {
|
|
272
276
|
type: "object",
|
|
273
277
|
properties: {
|
|
@@ -433,13 +437,21 @@ export const toolDefinitions = [
|
|
|
433
437
|
// --- 3. Implementation Guidance ---
|
|
434
438
|
{
|
|
435
439
|
name: "getVoiceCommandGuidance",
|
|
436
|
-
description: "Analyze proposed voice phrases for UX issues (length, homophones, digit-usage, Meta wake-word collision, ambiguity with existing phrases) before wiring them into a wake trigger. Applies equally to Phase 3 `glasses.conversation.onWake(phrase) { ... }` registrations AND legacy `glasses.voice.onPhrase(phrase) { ... }` / direct `glasses.audio.transcriptions()` consumers — the issues this catches
|
|
440
|
+
description: "Analyze proposed voice phrases for UX issues (length, homophones, digit-usage, Meta wake-word collision, ambiguity with existing phrases) before wiring them into a wake trigger. Returns { results, generalGuidance, summary }: `results` is one entry per input phrase — { phrase, issues: [{ severity: 'error' | 'warning' | 'info', rule, message }], suggestions: [], collisions: [] } — where `collisions` lists exact-duplicate matches and `issues` carries per-rule findings (rules: too_short, homophone_risk, digit_usage, punctuation, collision, disambiguation, meta_wake_word_overlap, match_mode_hint). Only `collision` and `meta_wake_word_overlap` are error-severity (fix before wiring); everything else is advisory. `generalGuidance` is cross-phrase advice; `summary` is a one-line rollup. Applies equally to Phase 3 `glasses.conversation.onWake(phrase) { ... }` registrations AND legacy `glasses.voice.onPhrase(phrase) { ... }` / direct `glasses.audio.transcriptions()` consumers — the issues this catches are the same regardless of which API surface dispatches the handler. USE before adding new phrase-match conditions to ANY voice-driven handler. DON'T USE for general voice docs (use searchDocs topic 'conversation_runtime' for Phase 3, 'voice_integration' for the legacy primitives).",
|
|
437
441
|
inputSchema: {
|
|
438
442
|
type: "object",
|
|
439
443
|
properties: {
|
|
440
|
-
phrases: {
|
|
441
|
-
|
|
442
|
-
|
|
444
|
+
phrases: {
|
|
445
|
+
type: "array",
|
|
446
|
+
items: { type: "string" },
|
|
447
|
+
minItems: 1,
|
|
448
|
+
description: "The proposed wake / trigger phrases to analyze (at least one). Each is scored against every rule — e.g. ['take a photo', 'start recording'].",
|
|
449
|
+
},
|
|
450
|
+
existingPhrases: {
|
|
451
|
+
type: "array",
|
|
452
|
+
items: { type: "string" },
|
|
453
|
+
description: "Phrases already wired into the app. Optional — when given, the analyzer also flags exact-duplicate collisions and shared-prefix ambiguity between the new `phrases` and these already-registered ones.",
|
|
454
|
+
},
|
|
443
455
|
},
|
|
444
456
|
required: ["phrases"],
|
|
445
457
|
additionalProperties: false,
|
|
@@ -447,7 +459,7 @@ export const toolDefinitions = [
|
|
|
447
459
|
},
|
|
448
460
|
{
|
|
449
461
|
name: "getPermissions",
|
|
450
|
-
description: "Derive Android permissions, iOS Info.plist keys, and Meta DAT scopes
|
|
462
|
+
description: "Derive the Android permissions, iOS Info.plist keys, and Meta DAT scopes a list of SDK capabilities requires. Returns { android, ios, metaDat, summary } — **ALWAYS all three platform blocks regardless of the `platform` argument** (which only frames the one-line `summary`; it does NOT filter the response). `android` = { permissions[], manifestEntries[] (ready-to-paste <uses-permission> lines), foregroundService: { required, types[], declaration, devInstructions }, notificationListener: { required, declaration, devInstructions }, minimumSdk, compileSdk, targetSdk }. `ios` = { plistKeys: [{ key, value, reason }] }. `metaDat` = { scopes[], registrationRequired, registrationSteps[] }. Capabilities that need no platform permission (e.g. speak, connection_state, earcon) contribute nothing and are accepted silently — they never error. USE after deciding which features (capture_photo, transcription_incremental, voice_command, …) the app integrates. DON'T USE for capability discovery (use getPlatformInfo).",
|
|
451
463
|
inputSchema: {
|
|
452
464
|
type: "object",
|
|
453
465
|
properties: {
|
|
@@ -457,7 +469,10 @@ export const toolDefinitions = [
|
|
|
457
469
|
minItems: 1,
|
|
458
470
|
description: "Capability names from getPlatformInfo.features[].name. e.g. ['capture_photo', 'transcription_incremental', 'voice_command'].",
|
|
459
471
|
},
|
|
460
|
-
platform:
|
|
472
|
+
platform: {
|
|
473
|
+
...platformEnum,
|
|
474
|
+
description: "Selects how the one-line `summary` is phrased (Android vs iOS framing). Required — but does NOT filter the response: the android, ios, and metaDat blocks are all returned either way.",
|
|
475
|
+
},
|
|
461
476
|
},
|
|
462
477
|
required: ["capabilities", "platform"],
|
|
463
478
|
additionalProperties: false,
|
|
@@ -466,22 +481,28 @@ export const toolDefinitions = [
|
|
|
466
481
|
// --- 4. Validation ---
|
|
467
482
|
{
|
|
468
483
|
name: "inspectIntegration",
|
|
469
|
-
description: "Read-only snapshot of current Extentos integration: manifest,
|
|
484
|
+
description: "Read-only snapshot of the current Extentos integration at a project path. Returns { found, manifest, generatedFilesStatus, dependency, drift, connectionPageConfig, gaps, summary }. **`found: false` is NOT an error** — when no extentos.manifest.json exists the call still succeeds, returning empty sub-objects plus a `gaps` remediation string that tells you to run generateConnectionModule. When `found: true`: `manifest` is the parsed extentos.manifest.json; `generatedFilesStatus` is per-file { path, exists, hasMarker, hashMatch }; `dependency` is { found, coordinate, file } for the Gradle/SPM dependency; `drift` is { fileDrift: [{ path, reason: 'missing' | 'marker_absent' | 'hash_mismatch' }], dependencyDrift: boolean }; `connectionPageConfig` is the committed connection-page snapshot (or null); `gaps` is an array of human-readable remediation strings; `summary` is a one-line rollup. USE before validateIntegration or for a 'what's wired so far?' read. DON'T USE for correctness checking / a pre-test gate (use validateIntegration — it severity-tiers the same surface and adds ~15 checks).",
|
|
470
485
|
inputSchema: {
|
|
471
486
|
type: "object",
|
|
472
487
|
properties: {
|
|
473
|
-
projectPath: {
|
|
488
|
+
projectPath: {
|
|
489
|
+
type: "string",
|
|
490
|
+
description: "Absolute (or cwd-relative) path to the project root holding extentos.manifest.json. Optional — defaults to the MCP server's current working directory (process.cwd()); pass it explicitly whenever the project isn't the cwd.",
|
|
491
|
+
},
|
|
474
492
|
},
|
|
475
493
|
additionalProperties: false,
|
|
476
494
|
},
|
|
477
495
|
},
|
|
478
496
|
{
|
|
479
497
|
name: "validateIntegration",
|
|
480
|
-
description: "
|
|
498
|
+
description: "Pre-test gate that runs ~15 severity-tiered checks over the whole project — manifest present + parses, generated-file markers + hashes, dependency declared, library-version freshness, Android Meta-DAT repo declaration, bootstrap wiring (ExtentosGlasses.create / Extentos.create), connection-page config, toolchain (AGP/Gradle) floors, foreground-service hints, and permissions. The permissions check DERIVES the permissions your declared `capabilities` imply and verifies they're present in the REAL app/src/main/AndroidManifest.xml <uses-permission> elements (Android) or the app target's Info.plist keys (iOS) — the runtime source of truth, not the manifest JSON's permissions array. Returns { valid, checks, summary }: each `checks[]` entry is { name, passed, severity?: 'error' | 'warn' | 'info', details?, fix? }. `valid` is true when zero ERROR-severity checks fail; warn/info are advisories that don't block. `summary` reads 'Safe to test' ONLY at zero warnings — any warning demotes it to 'review before testing'. So treat this as a graded readiness report, not a binary pass/fail. USE after making changes, before testing. DON'T USE for reading state without judging it (use inspectIntegration).",
|
|
481
499
|
inputSchema: {
|
|
482
500
|
type: "object",
|
|
483
501
|
properties: {
|
|
484
|
-
projectPath: {
|
|
502
|
+
projectPath: {
|
|
503
|
+
type: "string",
|
|
504
|
+
description: "Absolute (or cwd-relative) path to the project root. Optional — defaults to the MCP server's current working directory (process.cwd()); pass it explicitly whenever the project isn't the cwd.",
|
|
505
|
+
},
|
|
485
506
|
},
|
|
486
507
|
additionalProperties: false,
|
|
487
508
|
},
|
|
@@ -545,9 +566,23 @@ export const toolDefinitions = [
|
|
|
545
566
|
inputSchema: {
|
|
546
567
|
type: "object",
|
|
547
568
|
properties: {
|
|
548
|
-
deviceCode: {
|
|
549
|
-
|
|
550
|
-
|
|
569
|
+
deviceCode: {
|
|
570
|
+
type: "string",
|
|
571
|
+
minLength: 1,
|
|
572
|
+
description: "The `deviceCode` from createSimulatorSession's auth_required (HTTP 402) response — the opaque handle the backend correlates the developer's signup with. A stale/unknown code returns unknown_device_code (call createSimulatorSession again for a fresh one).",
|
|
573
|
+
},
|
|
574
|
+
maxWaitSeconds: {
|
|
575
|
+
type: "integer",
|
|
576
|
+
minimum: 1,
|
|
577
|
+
maximum: 600,
|
|
578
|
+
description: "Max seconds to keep polling for the developer to finish signup. Default 600 (also the cap). On timeout returns auth_timeout (retryable) — call again with the SAME deviceCode while it's still valid.",
|
|
579
|
+
},
|
|
580
|
+
pollIntervalSeconds: {
|
|
581
|
+
type: "integer",
|
|
582
|
+
minimum: 1,
|
|
583
|
+
maximum: 30,
|
|
584
|
+
description: "Seconds between backend polls. Default 5; clamped to [1, 30]. The backend may push a longer interval, which then overrides this value.",
|
|
585
|
+
},
|
|
551
586
|
},
|
|
552
587
|
required: ["deviceCode"],
|
|
553
588
|
additionalProperties: false,
|
|
@@ -591,6 +626,10 @@ export const toolDefinitions = [
|
|
|
591
626
|
},
|
|
592
627
|
responseFormat: responseFormatEnum,
|
|
593
628
|
redactBinary: { type: "boolean" },
|
|
629
|
+
collapseRepeats: {
|
|
630
|
+
type: "boolean",
|
|
631
|
+
description: "When true (default), consecutive payload-identical events (same layer/severity/type/message/details — timestamps excluded) collapse into ONE entry carrying `repeat: N` and `lastTimestamp`, so a runaway emitter can't fill the response with one line repeated hundreds of times. `totalEvents` and the summary count RAW events. Pass false for the uncollapsed rows.",
|
|
632
|
+
},
|
|
594
633
|
},
|
|
595
634
|
required: ["sessionId"],
|
|
596
635
|
additionalProperties: false,
|
|
@@ -786,7 +825,7 @@ export const toolDefinitions = [
|
|
|
786
825
|
// --- 6. Production ---
|
|
787
826
|
{
|
|
788
827
|
name: "getProductionChecklist",
|
|
789
|
-
description: "Return a personalized production-readiness checklist based on the SDK capabilities the app uses
|
|
828
|
+
description: "Return a personalized production-readiness checklist based on the SDK capabilities the app uses, the handlers it declares, and the BYOK services it integrates. Returns { ready, steps, summary }: `ready` is true when no step has status 'needed'; each `steps[]` entry is { category, description, status: 'done' | 'needed' | 'optional', details, fix?, requiredScopes?, affectedHandlers?, codeChange?: { file, hint } }. Steps are conditional — streams add a foreground-service step, voice/camera/audio add a real-hardware-verification step, and declared BYOK `services` (or the Phase 3 conversation runtime) add an API-keys step. Pass `projectPath` so the Meta-account and credential-swap steps read the project's real build state and report 'done' instead of 'needed'. Cross-links: getPermissions for the exact permission set the Permissions-Audit step verifies, getCredentialGuide for the per-provider key setup the API-Keys step needs, validateIntegration for the structural pre-test gate. USE when going to production. DON'T USE during development.",
|
|
790
829
|
inputSchema: {
|
|
791
830
|
type: "object",
|
|
792
831
|
properties: {
|
|
@@ -806,7 +845,10 @@ export const toolDefinitions = [
|
|
|
806
845
|
description: 'BYOK provider names the app actually integrates (e.g. ["anthropic", "openai"]). The trigger for the API Keys step — a DAT-native app (capture_photo + speak) or a Phase 4 managed-gateway app declares none and skips it.',
|
|
807
846
|
},
|
|
808
847
|
platform: platformEnum,
|
|
809
|
-
projectPath: {
|
|
848
|
+
projectPath: {
|
|
849
|
+
type: "string",
|
|
850
|
+
description: "Absolute (or cwd-relative) path to the project root. Optional — when given, the Meta-Developer-Account and Credential-Swap steps read the real build state (Android extentos_meta_credentials.xml / iOS Info.plist MWDAT dict) to mark themselves 'done' vs 'needed'. Omit → every step is assumed not-yet-done.",
|
|
851
|
+
},
|
|
810
852
|
},
|
|
811
853
|
required: ["capabilities", "platform"],
|
|
812
854
|
additionalProperties: false,
|
|
@@ -814,7 +856,7 @@ export const toolDefinitions = [
|
|
|
814
856
|
},
|
|
815
857
|
{
|
|
816
858
|
name: "getCredentialGuide",
|
|
817
|
-
description: "Return step-by-step credential setup
|
|
859
|
+
description: "Return step-by-step credential setup for the Meta DAT build identity plus each BYOK AI provider the app integrates. Returns { metaCredentials, serviceCredentials, keyStorage, summary }: `metaCredentials` = { required, requiredScope: 'real_hardware_only', scopeNote, steps[], configChange: { file, keys[], example, note? } } — the `requiredScope` / `scopeNote` say Meta DAT creds are needed ONLY for builds on real Ray-Ban Meta hardware; sim/emulator dev works without them, so DON'T lead the developer through Meta's developer-portal registration until the hardware milestone. `serviceCredentials` = one entry per BYOK service { service, forHandlers[], steps[], codeExample }. `keyStorage` = platform-specific { preferredPath, fallbackPath, doNotDo[], notes[] } secure-storage guidance. Cross-links: getProductionChecklist for where these steps sit in the ship sequence, getCredentialStatus / setCredential for the account-vaulted path (secrets pasted in the dashboard, never through the agent). USE when wiring a new BYOK provider or graduating from simulator to real hardware. DON'T USE during the simulator-only dev loop (Meta DAT creds aren't needed there).",
|
|
818
860
|
inputSchema: {
|
|
819
861
|
type: "object",
|
|
820
862
|
properties: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/docs/index.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAmMD,eAAO,MAAM,SAAS,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/docs/index.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAmMD,eAAO,MAAM,SAAS,EAAE,QAAQ,EAywC/B,CAAC;AAEF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAuB/E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,WAAW,GAAE,MAAU,EACvB,eAAe,GAAE,MAAY,GAC5B,MAAM,EAAE,CAmBV"}
|
package/dist/tools/docs/index.js
CHANGED
|
@@ -163,7 +163,7 @@ Obtaining \`glasses\` (iOS) — every snippet references the same \`glasses\` va
|
|
|
163
163
|
}
|
|
164
164
|
}
|
|
165
165
|
|
|
166
|
-
(1) Dedicated route — pushed via NavigationLink from anywhere. The system NavigationStack provides a back chevron; .navigationTitle makes the bar visible.
|
|
166
|
+
(1) Dedicated route — pushed via NavigationLink from anywhere. The system NavigationStack provides a back chevron; .navigationTitle makes the bar visible. (GlassesRoute is YOUR navigation value, not an SDK type — define it once: struct GlassesRoute: Hashable {}.)
|
|
167
167
|
|
|
168
168
|
NavigationStack {
|
|
169
169
|
HomeView()
|
|
@@ -215,7 +215,7 @@ export const DOC_INDEX = [
|
|
|
215
215
|
"**Prerequisite: host app must already exist.** `generateConnectionModule` scaffolds Extentos INTO an existing Compose / SwiftUI host app — it does not create the host app itself. CLI agents starting from scratch should fetch `searchDocs(topic: 'host_app_scaffold')` first for a copy-pasteable Compose / SwiftUI project template; Android Studio / Xcode users can use the New Project wizard.\n\n" +
|
|
216
216
|
"**Tool sequence (deterministic, in order):**\n\n" +
|
|
217
217
|
"(1) `getPlatformInfo` — fetch capability surface (compact: feature names + categories + tiers, ~2KB) and library version. The `features` list is the SDK's vocabulary: `capture_photo`, `record_audio`, `transcription_incremental`, `voice_command`, etc. Use these names in subsequent tool calls.\n\n" +
|
|
218
|
-
"(2) `generateConnectionModule` — one-shot scaffold (bootstrap + dependencies + connection-page wiring). Surfaces a developerInstructions Step 1 prompt to ask the dev about `ExtentosConnectionPage` placement; do not skip it.\n\n" +
|
|
218
|
+
"(2) `generateConnectionModule` — one-shot scaffold (bootstrap + dependencies + connection-page wiring). Surfaces a developerInstructions Step 1 prompt to ask the dev about `ExtentosConnectionPage` placement; do not skip it (no human in the loop? `dedicated_route` is the sensible default — say so in your summary). Not sure which `capabilities` to pass yet? It's fine to read step 3's guides first and scaffold after, or scaffold now and re-run with the updated list — re-running with the same arguments is idempotent. `libraryVersion` is platform-scoped (Android Maven version ≠ iOS package version); omit it to get the platform's latest.\n\n" +
|
|
219
219
|
"(3) Write the handler code in Kotlin/Swift directly. Two tools help you compose against the SDK correctly:\n" +
|
|
220
220
|
" - `getCodeExample(pattern)` — full canonical compositions in both languages. **For voice assistants, start with `assistant_agent_loop`** (Phase 4 `glasses.assistant.start(provider) { tool(...) { ... } }` API — the canonical path; OpenAI Realtime in v1, Gemini Live in v1.5+). The model owns wake detection / turn taking / intent / confirmation speech; the customer writes tool bodies + optional onWake/onSleep hooks + chooses the wake mechanism (voice phrase via `glasses.voice.onPhrase` + `session.wake()`, button, gesture, MCP call). Built-in `endOnIntent` (model-driven sleep on farewell), `sleepAfterSilence`, transparent reconnection. **For the agent-side test workflow** (multi-tool sweep, multi-channel verification, real-OpenAi capable since iter5.2): `getCodeExample(pattern:\"agent_driven_e2e_full_loop\")`. **Phase 3 (`conversation_agent_loop` — `glasses.conversation.onWake { listen() / speak() / ai.complete() }`) was REMOVED on Android in 1.4.0** — historical migration reference only. Other compositions for fine-grained control: voice_qa_assistant (LEGACY manual wake+record+LLM+speak), barge_in_speak (cancel TTS on interrupt), photo_describe_voice (voice-activated vision), live_transcription_ui (transcripts into UI state), voice_notes (wake+record+save), connection_page_setup (bootstrap wiring). Peel from these; don't copy whole.\n" +
|
|
221
221
|
" - `getCapabilityGuide(feature)` — per-feature minimal usage + gotchas. Pair with getPlatformInfo: features tells you what exists, getCapabilityGuide tells you how to call it. For Phase 4 voice work, see `getCapabilityGuide(feature: \"assistant_runtime\")`.\n" +
|
|
@@ -225,11 +225,12 @@ export const DOC_INDEX = [
|
|
|
225
225
|
"(6) `createSimulatorSession` — provision a browser simulator session to test end-to-end. Get-or-create: same sim resumes on subsequent calls.\n\n" +
|
|
226
226
|
"(7) `getEventLog` — primary debug tool. Returns the structured event trace for a session: stream lifecycle, toggle changes, connection state transitions, transport errors. Filter by 'errors' for warn/error rows; filter by 'transport' for connection/protocol layer. Note: BYOK calls (Anthropic / OpenAI / Gemini) go customer-app → provider HTTPS directly and don't traverse the simulator transport, so they're invisible to this tool — surface them via `glasses.observability.aiCall(label) { ... }` (F-R3-11) or pull adb logcat / OSLog for the customer's HTTP client tag.\n\n" +
|
|
227
227
|
"(8) `injectTranscript` + `getEventLog` + `adb run-as` — the dual-layer agent-driven verification loop. Drive the handler through `injectTranscript`, read both the protocol activity (`getEventLog`) AND the persisted state (Room / DataStore via `adb exec-out run-as <pkg> cat databases/...`) to assert the flow worked end-to-end. Full recipe + WAL caveat + canonical tool sequence: `searchDocs(topic: 'agent_e2e_testing')`. **For Phase 4 voice-assistant apps**, the agent loop is `injectAssistantUtterance` + `assertToolCalled` + multi-channel verification (getEventLog + adb logcat + screencap + library-state) — driving the real OpenAi Realtime provider, not just Mock, since iter5.2. Recipe: `getCodeExample(pattern: 'agent_driven_e2e_full_loop')`. Both patterns close the agent loop without a human — write a handler, drive it from the same MCP session that scaffolded it, assert the result against independent surfaces (event log, DB, screen, tool-body logcat).\n\n" +
|
|
228
|
+
"**iOS-specific path (same sequence, these deltas):** No step-0 preflight (GitHub Packages / GITHUB_TOKEN is Android-only). Host app from scratch → the headless xcodegen path in `searchDocs(topic: 'host_app_scaffold')` (Xcode wizard if you have a GUI). The Swift package is UNPUBLISHED today — `generateConnectionModule`'s \"add SPM package\" step cannot resolve until the swift-glasses release ships; a local checkout path-dependency is the interim (getPlatformInfo's version.ios reflects the live status). First-build verification: `xcodebuild -scheme <App> -destination 'generic/platform=iOS Simulator' build` (on Apple Silicon add `EXCLUDED_ARCHS[sdk=iphonesimulator*] = x86_64` while using a local SDK build — its simulator slice is arm64-only). Steps 6–8 (sim + event log + inject loops) are platform-neutral; where the Android recipe says adb, use `xcrun simctl` + OSLog instead.\n\n" +
|
|
228
229
|
"**Iteration loop — DO NOT mint a new sim per change.** `createSimulatorSession` is get-or-create: it returns the saved sim for this project (`status:'resumed'`) after the first call. Two rates of change:\n" +
|
|
229
230
|
"(a) APP-CODE edits (Kotlin/Swift) → rebuild + reinstall, the library reattaches to the same saved sim, no remint.\n" +
|
|
230
231
|
"(b) FORCE-FRESH (clean-slate ID rotation) → `createSimulatorSession({ resetFresh: true })` OR click 'Reset' on the dashboard at extentos.com/s.\n" +
|
|
231
232
|
"URL-bake apps rebuild once after force-fresh. For agents that can rebuild app code themselves: do it inline. Otherwise hand the dev rebuild + reinstall commands; same auto-attach behavior on the other end. Full mechanics in `searchDocs(topic: 'simulator_browser_mode')`.\n\n" +
|
|
232
|
-
"**Multi-platform projects (Android + iOS = ONE project).**
|
|
233
|
+
"**Multi-platform projects (Android + iOS = ONE project).** A project's identity is the Extentos app id (`config.appId`), which the scaffold bakes from the `appPackage` you pass — DECOUPLED from the store bundle id. Give both platforms the SAME `appPackage` and they share one project (one agent config, one sound set, per-platform analytics). This works even for an existing app whose Android `applicationId` and iOS bundle id are DIFFERENT and store-locked — the Extentos id is independent of them. Full guidance: `searchDocs(topic: 'multi_platform_projects')`.\n\n" +
|
|
233
234
|
"**Production:** `getProductionChecklist({ capabilities, handlers, platform })` for a personalized readiness gate. `getCredentialGuide({ services, platform })` for BYOK provider setup (Anthropic / OpenAI / Gemini / etc.) plus Meta DAT registration.",
|
|
234
235
|
keywords: ["setup", "start", "first", "begin", "overview", "walkthrough", "tool order", "workflow", "catalog", "debug", "iteration", "rebuild", "remint", "dev loop", "sdk", "pure-sdk"],
|
|
235
236
|
relatedTools: ["getPlatformInfo", "generateConnectionModule", "searchDocs", "validateIntegration", "getEventLog", "createSimulatorSession", "getPermissions", "getProductionChecklist", "getCredentialGuide"],
|
|
@@ -299,7 +300,7 @@ export const DOC_INDEX = [
|
|
|
299
300
|
title: "Runtime Toggles",
|
|
300
301
|
content: "Toggles are persistent runtime flags that gate hardware behaviour inside the library. They survive across app restarts (persisted to the user's account by the connection page UI) and are observable from your handler via `glasses.toggles.state` (Android `StateFlow<Toggles>`, iOS `ObservableState<Toggles>`). The user owns the toggle values — they flip them from the connection page; your handler reads them. Programmatic writes are possible (Kotlin `glasses.toggles.put(key, value, source)`; iOS `glasses.toggles.update { }`) but rarely needed in customer code.\n\n" +
|
|
301
302
|
"**8 toggles.** Each has a defined type / default. Five are enforced inside the library (listening_mode, camera_streaming_enabled, audio_capture_enabled, battery_save_mode, privacy_mode) — your handler does not need to honor those manually. transcription_enabled and voice_confirmations are declared but NOT yet consumed; audio_video_coexistence_policy is cooperative state.\n\n" +
|
|
302
|
-
"── listening_mode ── (enforced for `off`)\nType: enum (`off`, `wake_word`, `on_demand`, `always_on`). Default: `wake_word` (treated as listening-on).\n\n`DefaultAudioClient.transcriptions(...)` gates the recognizer flow on `listening_mode != \"off\"`. When `off`, no transcripts arrive — transport-side recognizer is not started, SCO mic released. `wake_word` requires a Meta API DAT 0.5 doesn't expose (treated as listening-on); `on_demand`'s intended 'only-during-push-to-talk' semantics are deferred (also treated as listening-on for now).\n\nComposes with `audio_capture_enabled` — both must be open (plus privacy_mode off) for transcripts to flow. The user-facing UI on the connection page exposes this as the master mic toggle.\n\n── camera_streaming_enabled ── (enforced)\nType: boolean. Default: true.\n\nGlobal kill switch for every camera primitive: `videoFrames` stream emits nothing while false (transport-side stream cancelled, camera released); `capturePhoto` and `captureVideo` fail-fast with `CaptureError.DisabledByUser(\"camera_streaming_enabled\")`. Surfaces in `getEventLog` as a `camera_error` event (the `errors` chip) with the toggle name as the reason.\n\n── audio_capture_enabled ── (enforced)\nType: boolean. Default: true.\n\nGlobal kill switch for every audio-capture primitive: `recordDiscrete` fails with `AudioError.DisabledByUser`; `audioChunks` and `transcriptions` emit nothing while false. Composes with `transcription_enabled` — gating the toggle here kills audio upstream of STT, so transcripts disappear too.\n\nDistinct from `transcription_enabled`: this gates raw audio acquisition; `transcription_enabled` gates STT processing on top of it.\n\n── transcription_enabled ── (declared — NOT yet enforced)\nType: boolean. Default: false.\n\nDeclared as a dedicated STT gate but the library does not consume it yet — transcripts flow regardless of its value (real gates: audio_capture_enabled + privacy_mode + listening_mode). Treat as reserved. Historical intent: when false, `glasses.audio.transcriptions(...)` would return an empty stream. Common pattern: a handler subscribing for wake-word matching flips this on at startup; a 'pause listening' user-toggle flips it off. The toggle gates only the recognizer — `audio.audioChunks(...)` (raw audio) still flows.\n\nSide effect: while true, audio routes over HFP, which suspends A2DP — the user briefly loses high-quality stereo playback. Flipping this on while music is playing is the most-common UX surprise.\n\n── battery_save_mode ── (enforced for video_frames clamp; partial)\nType: boolean. Default: false.\n\nWhen true, `glasses.camera.videoFrames(...)` is clamped to LOW resolution + 2 fps regardless of the requested config; the camera renegotiates capture rate when the toggle flips mid-stream. Other intended behaviours (disable outgoing_video_stream, shorten ask_user timeouts, suppress speak filler) are deferred — apps that need them must read the toggle directly via `glasses.toggles.state` and adapt their handler.\n\nFlipping this on when the phone reports thermal pressure is a natural handler response (no automatic flip is wired today).\n\n── voice_confirmations ── (declared — NOT yet enforced)\nType: boolean. Default: true.\n\nIntended behavior (not implemented yet — the toggle is persisted but not consumed): when true, the library plays an auto-earcon pair around any handler that the user invokes through the connection page's voice surface: `EarconSound.START` before the handler runs, `EarconSound.COMPLETE` after success. Aborts skip the COMPLETE earcon (no auto-error earcon — call `earcon` directly with `sound: \"error\"` from your handler if you want explicit failure feedback). When false, voice-initiated handlers run silently.\n\nUseful for ambient assistants or accessibility flows where the user prefers quiet operation. Your per-handler `speak()` and `earcon()` calls are NOT affected — only the auto-played pair around voice-initiated handlers.\n\n── audio_video_coexistence_policy ── (NOT enforced — cooperative)\nType: enum (`prefer_audio`, `prefer_video`, `strict_reject`). Default: `prefer_video`.\n\nValue persists but the library does NOT yet enforce coexistence — concurrent audio + video primitives currently surface platform errors rather than policy decisions. Treat as cooperative state your handler can read (`glasses.toggles.state.value[\"audio_video_coexistence_policy\"]`) and respect manually if you care about the ordering. See `audio_video_coexistence` topic.\n\n── privacy_mode ── (enforced — the super-toggle)\nType: boolean. Default: false (opt-in).\n\nThe one LAYERED toggle. When true, gates ALL camera + audio + STT primitives regardless of the underlying per-feature toggles' values: `capturePhoto` / `captureVideo` / `recordDiscrete` fail-fast with `DisabledByUser(\"privacy_mode\")`; `videoFrames` / `audioChunks` / `transcriptions` emit nothing. As of library 1.1.25-pair, also suppresses phone-notification forwarding at the dispatch layer.\n\nOther hardware events (thermal, hinges, audio route, calls, lifecycle) still fire — privacy_mode is specifically about user-data exposure (camera/mic/STT/notifications), not all hardware events.\n\nCanonical use: a 'panic privacy' UI control that flips this true. Always pair with a means to flip it back off — the connection page UI is the primary path.\n\n── Reading toggle state from your handler ──\n\nKotlin (StateFlow<Map<String, JSONValue>>):\n glasses.toggles.state.collect { toggles ->\n if ((toggles[\"privacy_mode\"] as? JsonPrimitive)?.booleanOrNull == true) { skipExpensiveWork(); return@collect }\n if ((toggles[\"transcription_enabled\"] as? JsonPrimitive)?.booleanOrNull != true) showStartHint()\n }\n\nSwift (ObservableState):\n for await toggles in glasses.toggles.state.stream {\n if toggles.privacyMode { continue }\n if !toggles.transcriptionEnabled { showStartHint() }\n }\n\nOne-shot read:\n val v = glasses.toggles.state.value\n let v = await glasses.toggles.state.current\n\n── Writing toggles programmatically ──\n\nThe user owns toggle values via the connection page; programmatic writes are valid but uncommon. Kotlin uses `put(...)`; iOS uses the closure form:\n\n Kotlin: glasses.toggles.put(\"privacy_mode\", JsonPrimitive(true), ToggleSource.UI)\n Swift: await glasses.toggles.update { old in Toggles(values: old.values.merging([\"privacy_mode\": .bool(true)]) { _, new in new }) }\n\nKotlin's write surface is `put(key, value, source)` + `get(key)` — there is no `update {}` on Android (that is the iOS shape). Source tagging: pass a `ToggleSource` — `UI` for user-initiated writes, or `VOICE_COMMAND` / `AUTOMATION_TRIGGER` (there is no `HOST_APP`) — surfaces in `getEventLog` so you can tell who flipped what.\n\n── Testing toggle-gated paths (sim) ──\n\nThere is NO MCP `setToggle` tool today — an agent cannot flip toggles remotely (they're set via in-app `glasses.toggles.put`, the in-app connection page, or the browser sim UI a human clicks). To exercise a toggle-gated path E2E (e.g. `privacy_mode` → `DisabledByUser`), set the toggle from your handler BEFORE the action: `glasses.toggles.put(\"privacy_mode\", JsonPrimitive(true), ToggleSource.AUTOMATION_TRIGGER)`, then call the capability and assert the DisabledByUser result. A remote `setToggle({ sessionId, key, value })` tool (mirroring injectTranscript / setSimVideo) needs a new inbound-toggle path in the Rust core — a tracked enhancement, not yet built (F-78).\n\n── Common mistakes ──\n\n- **Subscribing to `glasses.audio.transcriptions()` and seeing nothing.** Check `audio_capture_enabled`, `privacy_mode == false`, and `listening_mode != \"off\"` — any of those three can silence the stream (`transcription_enabled` is declared but not consumed yet).\n- **Setting `listening_mode = \"on_demand\"` and expecting STT to only run during push-to-talk.** The library currently treats `on_demand` as listening-on (same as `always_on`). Your handler can implement the gating itself by flipping `audio_capture_enabled` around the active window.\n- **Comparing toggle values with the wrong type.** The values are typed JSON — booleans are `JsonPrimitive(true)`, not `JsonPrimitive(\"true\")`. Pattern-match the JSONValue — e.g. `(toggles[\"privacy_mode\"] as? JsonPrimitive)?.booleanOrNull`. There are no typed accessors on Android; the state is a `Map<String, JSONValue>`.\n- **Trying to set a key not in the 8-toggle allowlist.** Library rejects unknown keys; the canonical list is enforced server-side too (the connection page UI only exposes these 8).\n- **Flipping `battery_save_mode` and assuming the full intended behaviour is in effect.** Only the videoFrames LOW+2fps clamp ships today. Other intended effects (outgoing_video_stream off, ask_user shorter timeouts) are deferred; if your handler depends on them, read the toggle and implement the behaviour yourself.",
|
|
303
|
+
"── listening_mode ── (enforced for `off`)\nType: enum (`off`, `wake_word`, `on_demand`, `always_on`). Default: `wake_word` (treated as listening-on).\n\n`DefaultAudioClient.transcriptions(...)` gates the recognizer flow on `listening_mode != \"off\"`. When `off`, no transcripts arrive — transport-side recognizer is not started, SCO mic released. `wake_word` requires a Meta API DAT 0.5 doesn't expose (treated as listening-on); `on_demand`'s intended 'only-during-push-to-talk' semantics are deferred (also treated as listening-on for now).\n\nComposes with `audio_capture_enabled` — both must be open (plus privacy_mode off) for transcripts to flow. The user-facing UI on the connection page exposes this as the master mic toggle.\n\n── camera_streaming_enabled ── (enforced)\nType: boolean. Default: true.\n\nGlobal kill switch for every camera primitive: `videoFrames` stream emits nothing while false (transport-side stream cancelled, camera released); `capturePhoto` and `captureVideo` fail-fast with `CaptureError.DisabledByUser(\"camera_streaming_enabled\")`. Surfaces in `getEventLog` as a `camera_error` event (the `errors` chip) with the toggle name as the reason.\n\n── audio_capture_enabled ── (enforced)\nType: boolean. Default: true.\n\nGlobal kill switch for every audio-capture primitive: `recordDiscrete` fails with `AudioError.DisabledByUser`; `audioChunks` and `transcriptions` emit nothing while false. Composes with `transcription_enabled` — gating the toggle here kills audio upstream of STT, so transcripts disappear too.\n\nDistinct from `transcription_enabled`: this gates raw audio acquisition; `transcription_enabled` gates STT processing on top of it.\n\n── transcription_enabled ── (declared — NOT yet enforced)\nType: boolean. Default: false.\n\nDeclared as a dedicated STT gate but the library does not consume it yet — transcripts flow regardless of its value (real gates: audio_capture_enabled + privacy_mode + listening_mode). Treat as reserved. Historical intent: when false, `glasses.audio.transcriptions(...)` would return an empty stream. Common pattern: a handler subscribing for wake-word matching flips this on at startup; a 'pause listening' user-toggle flips it off. The toggle gates only the recognizer — `audio.audioChunks(...)` (raw audio) still flows.\n\nSide effect: while true, audio routes over HFP, which suspends A2DP — the user briefly loses high-quality stereo playback. Flipping this on while music is playing is the most-common UX surprise.\n\n── battery_save_mode ── (enforced for video_frames clamp; partial)\nType: boolean. Default: false.\n\nWhen true, `glasses.camera.videoFrames(...)` is clamped to LOW resolution + 2 fps regardless of the requested config; the camera renegotiates capture rate when the toggle flips mid-stream. Other intended behaviours (disable outgoing_video_stream, shorten ask_user timeouts, suppress speak filler) are deferred — apps that need them must read the toggle directly via `glasses.toggles.state` and adapt their handler.\n\nFlipping this on when the phone reports thermal pressure is a natural handler response (no automatic flip is wired today).\n\n── voice_confirmations ── (declared — NOT yet enforced)\nType: boolean. Default: true.\n\nIntended behavior (not implemented yet — the toggle is persisted but not consumed): when true, the library plays an auto-earcon pair around any handler that the user invokes through the connection page's voice surface: `EarconSound.START` before the handler runs, `EarconSound.COMPLETE` after success. Aborts skip the COMPLETE earcon (no auto-error earcon — call `earcon` directly with `sound: \"error\"` from your handler if you want explicit failure feedback). When false, voice-initiated handlers run silently.\n\nUseful for ambient assistants or accessibility flows where the user prefers quiet operation. Your per-handler `speak()` and `earcon()` calls are NOT affected — only the auto-played pair around voice-initiated handlers.\n\n── audio_video_coexistence_policy ── (NOT enforced — cooperative)\nType: enum (`prefer_audio`, `prefer_video`, `strict_reject`). Default: `prefer_video`.\n\nValue persists but the library does NOT yet enforce coexistence — concurrent audio + video primitives currently surface platform errors rather than policy decisions. Treat as cooperative state your handler can read (`glasses.toggles.state.value[\"audio_video_coexistence_policy\"]`) and respect manually if you care about the ordering. See `audio_video_coexistence` topic.\n\n── privacy_mode ── (enforced — the super-toggle)\nType: boolean. Default: false (opt-in).\n\nThe one LAYERED toggle. When true, gates ALL camera + audio + STT primitives regardless of the underlying per-feature toggles' values: `capturePhoto` / `captureVideo` / `recordDiscrete` fail-fast with `DisabledByUser(\"privacy_mode\")`; `videoFrames` / `audioChunks` / `transcriptions` emit nothing. As of library 1.1.25-pair, also suppresses phone-notification forwarding at the dispatch layer.\n\nOther hardware events (thermal, hinges, audio route, calls, lifecycle) still fire — privacy_mode is specifically about user-data exposure (camera/mic/STT/notifications), not all hardware events.\n\nCanonical use: a 'panic privacy' UI control that flips this true. Always pair with a means to flip it back off — the connection page UI is the primary path.\n\n── Reading toggle state from your handler ──\n\nKotlin (StateFlow<Map<String, JSONValue>>):\n glasses.toggles.state.collect { toggles ->\n if ((toggles[\"privacy_mode\"] as? JsonPrimitive)?.booleanOrNull == true) { skipExpensiveWork(); return@collect }\n if ((toggles[\"transcription_enabled\"] as? JsonPrimitive)?.booleanOrNull != true) showStartHint()\n }\n\nSwift (ObservableState):\n for await toggles in glasses.toggles.state.stream {\n if toggles.privacyMode { continue }\n if !toggles.transcriptionEnabled { showStartHint() }\n }\n\nOne-shot read:\n val v = glasses.toggles.state.value\n let v = await glasses.toggles.state.current\n\n── Writing toggles programmatically ──\n\nThe user owns toggle values via the connection page; programmatic writes are valid but uncommon. Kotlin uses `put(...)`; iOS uses the closure form:\n\n Kotlin: glasses.toggles.put(\"privacy_mode\", JsonPrimitive(true), ToggleSource.UI)\n Swift: await glasses.toggles.update { old in Toggles(values: old.values.merging([\"privacy_mode\": .bool(true)]) { _, new in new }) }\n\nKotlin's write surface is `put(key, value, source)` + `get(key)` — there is no `update {}` on Android (that is the iOS shape). Source tagging: pass a `ToggleSource` — `UI` for user-initiated writes, or `VOICE_COMMAND` / `AUTOMATION_TRIGGER` (there is no `HOST_APP`) — surfaces in `getEventLog` so you can tell who flipped what.\n\n── Testing toggle-gated paths (sim) ──\n\nThere is NO MCP `setToggle` tool today — an agent cannot flip toggles remotely (they're set via in-app `glasses.toggles.put`, the in-app connection page, or the browser sim UI a human clicks). To exercise a toggle-gated path E2E (e.g. `privacy_mode` → `DisabledByUser`), set the toggle from your handler BEFORE the action: `glasses.toggles.put(\"privacy_mode\", JsonPrimitive(true), ToggleSource.AUTOMATION_TRIGGER)`, then call the capability and assert the DisabledByUser result. A remote `setToggle({ sessionId, key, value })` tool (mirroring injectTranscript / setSimVideo) needs a new inbound-toggle path in the Rust core — a tracked enhancement, not yet built (F-78).\n\n── Common mistakes ──\n\n- **Subscribing to `glasses.audio.transcriptions()` and seeing nothing.** Check `audio_capture_enabled`, `privacy_mode == false`, and `listening_mode != \"off\"` — any of those three can silence the stream (`transcription_enabled` is declared but not consumed yet).\n- **Expecting the connection page's Voice Activation switch to mute a LIVE assistant conversation.** Voice Activation writes `listening_mode`, which is wake/STT-only BY DESIGN — activation and conversation are different consents (disabling \"Hey Siri\" doesn't disable held-button Siri). A live agent's mic rides the raw-audio path, gated by `audio_capture_enabled` + `privacy_mode`, and BOTH deafen a live agent instantly. If your product wants Voice Activation to also end live conversations, do it in your handler — observe `glasses.toggles.state` and call `session.sleep()` when `listening_mode` flips to `off` (a graceful end, not an active-but-deaf agent).\n- **Setting `listening_mode = \"on_demand\"` and expecting STT to only run during push-to-talk.** The library currently treats `on_demand` as listening-on (same as `always_on`). Your handler can implement the gating itself by flipping `audio_capture_enabled` around the active window.\n- **Comparing toggle values with the wrong type.** The values are typed JSON — booleans are `JsonPrimitive(true)`, not `JsonPrimitive(\"true\")`. Pattern-match the JSONValue — e.g. `(toggles[\"privacy_mode\"] as? JsonPrimitive)?.booleanOrNull`. There are no typed accessors on Android; the state is a `Map<String, JSONValue>`.\n- **Trying to set a key not in the 8-toggle allowlist.** Library rejects unknown keys; the canonical list is enforced server-side too (the connection page UI only exposes these 8).\n- **Flipping `battery_save_mode` and assuming the full intended behaviour is in effect.** Only the videoFrames LOW+2fps clamp ships today. Other intended effects (outgoing_video_stream off, ask_user shorter timeouts) are deferred; if your handler depends on them, read the toggle and implement the behaviour yourself.",
|
|
303
304
|
keywords: [
|
|
304
305
|
"toggle",
|
|
305
306
|
"privacy_mode",
|
|
@@ -322,8 +323,8 @@ export const DOC_INDEX = [
|
|
|
322
323
|
{
|
|
323
324
|
topic: "connection_state_model",
|
|
324
325
|
title: "Connection State Model",
|
|
325
|
-
content: "6 GlassesState buckets: NotRegistered, Registered, DeviceDiscovered, Connecting, Active, Disconnected. Active is a supertype covering reconnection + other internal states; a transport failure surfaces as Disconnected(cause), not a separate Failed bucket. Transport selects one of BrowserSimTransport / LocalSimTransport / RealMetaTransport and drives the state machine. Scope is per-session — app tear-down resets to NotRegistered.",
|
|
326
|
-
keywords: ["connection", "state", "active", "disconnected", "glassesstate", "transport", "reconnect"],
|
|
326
|
+
content: "6 GlassesState buckets: NotRegistered, Registered, DeviceDiscovered, Connecting, Active, Disconnected. Active is a supertype covering reconnection + other internal states; a transport failure surfaces as Disconnected(cause), not a separate Failed bucket. Transport selects one of BrowserSimTransport / LocalSimTransport / RealMetaTransport and drives the state machine. Scope is per-session — app tear-down resets to NotRegistered.\n\n**The rule for app code: treat ONLY `Disconnected` (and demotion out of `Active`, e.g. back to `Registered` on a lost link) as a lost connection — never `!Active`.** Internal work (camera session arming, auto-recovery, stream re-arms) stays WITHIN Active. Tearing down app resources (an RTMP relay, a recording, a subscription) on any non-Active state will kill them during normal internal transitions. Once connected, `Connecting` only reappears after a genuine demotion.\n\n`Active(Connected)` carries a `camera: CameraStatus` refinement — `ready` (capture works, or self-arms on demand), `starting` (session warming, self-resolving — render neutrally, never prompt the user to act), `broken` (a capture failed and won't self-heal mid-session; pull-to-refresh / app reopen fixes it — the only state that warrants an actionable warning). The packaged connection page renders these via the core's `connectionSummary` / `connectionIndicatorRole`.",
|
|
327
|
+
keywords: ["connection", "state", "active", "disconnected", "glassesstate", "transport", "reconnect", "captureready", "lifecycle"],
|
|
327
328
|
relatedTools: ["getSimulatorStatus", "getEventLog"],
|
|
328
329
|
},
|
|
329
330
|
{
|
|
@@ -713,6 +714,7 @@ export const DOC_INDEX = [
|
|
|
713
714
|
"- Custom TTS provider (e.g. ElevenLabs) — fetch the audio bytes yourself, then play them through the phone speaker OR fall back to `glasses.audio.speak(...)` for plain text. Direct routing of arbitrary audio bytes to the glasses speaker is a future SDK feature; for now, premium-voice TTS plays from the phone.\n" +
|
|
714
715
|
"- New hardware-event listeners — the library surfaces a fixed set of hardware alerts (thermal, hinges, audio route, call state, lifecycle). Anything not on the list isn't reachable from the SDK; ask for it in the Extentos repo / feedback channel.\n\n" +
|
|
715
716
|
"The SDK keeps a tight, vendor-validated surface intentionally — every primitive is something we can wire to multiple glasses vendors. Adding a primitive here means we commit to maintaining it across the line; custom one-off integrations belong in your handler, not the library.\n\n" +
|
|
717
|
+
"**Escape-hatch policy (when the vendor allows something the vocabulary doesn't cover):** Extentos escape hatches are explicitly opt-in APIs at a LOWER ALTITUDE inside the ecosystem (Android `@ExtentosEscapeHatch`, iOS `@_spi(ExtentosEscapeHatch)`) — never a handout of the raw vendor session. The vendor device session is a single-owner handle; a second owner outside Extentos would fight the SDK over one transport. Everything done through a hatch still rides the Extentos session: same state machine, same event log, same toggles/permission gates. The shipped hatch today is the custom connection-UI surface (see `searchDocs(topic: 'connection_ui')`); vendor-specific extension hatches follow the same rule as they land.\n\n" +
|
|
716
718
|
"If you find yourself wishing for a missing primitive, see the feedback flow in `searchDocs(topic: 'getting_started')` — that's the path to getting it into the library.",
|
|
717
719
|
keywords: ["custom", "extension", "byo", "escape hatch", "missing capability", "stt", "tts", "vision", "audio chunks", "video frames"],
|
|
718
720
|
relatedTools: ["getPlatformInfo"],
|
|
@@ -734,7 +736,7 @@ export const DOC_INDEX = [
|
|
|
734
736
|
"- `status: \"active\"` — first call from this project; new sim minted.\n" +
|
|
735
737
|
"- `status: \"resumed\"` — saved sim already existed; same `sessionUrl`, no rebuild needed for URL-bake users.\n\n" +
|
|
736
738
|
"Saved sims live on the user's dashboard at extentos.com/s. They have NO 24-hour absolute lifetime. After 30 minutes of inactivity (no role connected) a sim flips to `idle` — still listed on the dashboard, still resumable; reconnecting any role transitions it back to `waiting`/`active`. The 90-day cleanup sweep eventually purges abandoned `idle` rows (with a 7-day undo grace via `deleted` state).\n\n" +
|
|
737
|
-
"**Multi-platform note:** Android and iOS versions of the same app share ONE project on the dashboard when the
|
|
739
|
+
"**Multi-platform note:** Android and iOS versions of the same app share ONE project on the dashboard when they broadcast the same Extentos app id — the `appPackage` you scaffold with (baked as `config.appId`, decoupled from the store bundle id). The platform-keyed slot still keeps them as two separate saved sims (one per platform) — they just appear under one card. Give both platforms the same `appPackage` and this works even when the store bundle ids differ. Full details: searchDocs(topic: 'multi_platform_projects').\n\n" +
|
|
738
740
|
"── Iteration model: two things change at different rates ──\n\n" +
|
|
739
741
|
"**1. THE SESSION** (the saved sim row + WebSocket hub)\n" +
|
|
740
742
|
"- Persists indefinitely on the user's account. One per `(account, project, platform)`. No mint-per-iteration.\n" +
|
|
@@ -782,6 +784,8 @@ export const DOC_INDEX = [
|
|
|
782
784
|
"── Special filter values ──\n\n" +
|
|
783
785
|
"- `all` (default) — every layer.\n" +
|
|
784
786
|
"- `errors` — see above; this IS a layer value (no severity special-case in the backend).\n\n" +
|
|
787
|
+
"── Repeat collapsing ──\n\n" +
|
|
788
|
+
"`getEventLog` collapses consecutive payload-identical events (same layer/severity/type/message/details — timestamps and ids excluded) into ONE entry carrying `repeat: N` + `lastTimestamp`, so a runaway emitter can't fill the response with a single line repeated hundreds of times. `totalEvents` and the summary count the RAW events; pass `collapseRepeats: false` for the uncollapsed rows. The simulator page's event feed applies the same stacking visually (a ×N chip; click it to list every occurrence).\n\n" +
|
|
785
789
|
"── Phase metadata ──\n\n" +
|
|
786
790
|
"The event TYPE string encodes phase via suffix convention:\n" +
|
|
787
791
|
" - bare name (`speak`, `capture_photo`) = request\n" +
|
|
@@ -901,23 +905,21 @@ export const DOC_INDEX = [
|
|
|
901
905
|
" - Different reverse-DNS chosen per platform (rare in pro projects, more common in hobby projects).\n" +
|
|
902
906
|
" - Android project had no manifest yet, fell back to `android:<rootProject.name>` while iOS used the real bundle ID.\n" +
|
|
903
907
|
" - The Android and iOS apps were authored at different times and didn't coordinate identifiers.\n\n" +
|
|
908
|
+
"── Key insight: the Extentos id is DECOUPLED from the store bundle id ──\n" +
|
|
909
|
+
"The `appPackage` you scaffold with is baked as `config.appId` (iOS: the `EXTENTOS_APP_ID` Info.plist key; Android: the `appId` field in ExtentosConfig) — it does NOT have to equal the store bundle id / applicationId. The SDK keys telemetry, agent config, and sounds on `config.appId`, not on the store identifier. So identifier mismatch is a SOLVED problem, even for shipped apps:\n" +
|
|
904
910
|
"── Resolving a mismatch ──\n" +
|
|
905
|
-
"
|
|
906
|
-
" (1) **Best long-term: align the identifiers.** Update one platform's reverse-DNS in source (Android: `applicationId`; iOS: bundle identifier in Xcode), regenerate the manifest, mint again. Future mints group correctly. Same root cause permanently fixed. Caveat: changing applicationId after a Play Store release is a breaking change for installed users — don't do it lightly on a shipped app.\n" +
|
|
907
|
-
" (2) **One-shot cleanup: dashboard Merge.** On the source project's Settings tab (extentos.com/projects/[id]/settings) → Danger Zone → Merge into another project. Pick the target, confirm, all live sessions move into the target. Source disappears.\n\n" +
|
|
908
|
-
"── What the Merge does at the data layer ──\n" +
|
|
909
|
-
"POST /api/projects/[sourceId]/merge with `{ targetId }`. Atomically updates `project_install_id` and `app_label` on every live source session to the target's values via a single UPDATE statement. WS sockets survive the DB update (sessionId-keyed, not projectId-keyed). Platform collisions (e.g. both source and target have a live Android sim) are rejected with HTTP 409 — the user must Reset or Delete the duplicate first. There's no automatic undo; running a reverse merge restores the prior layout.\n\n" +
|
|
911
|
+
"**Set the same `appPackage` on both platforms.** Scaffold Android and iOS with the SAME app id (e.g. `com.example.myapp`), and both broadcast that id to Extentos → one project. This works EVEN WHEN the store bundle ids differ and are locked (Android `applicationId` and iOS `PRODUCT_BUNDLE_IDENTIFIER` stay whatever the stores froze — they're irrelevant to the Extentos grouping). Because integrating Extentos is itself a store release, an existing app picks its unified Extentos id at integration time at zero cost. This replaces the old dashboard 'Merge' action (removed — it relabeled rows but couldn't change what a shipped device broadcasts).\n\n" +
|
|
910
912
|
"── Three identifier fields on every session row ──\n" +
|
|
911
|
-
"Each session row carries three identifiers with distinct roles
|
|
912
|
-
" - `project_install_id` — the dashboard grouping key
|
|
913
|
-
" - `platform_install_id` — the
|
|
914
|
-
" - `app_label` — the friendly display name
|
|
913
|
+
"Each session row carries three identifiers with distinct roles:\n" +
|
|
914
|
+
" - `project_install_id` — the dashboard grouping key = the scaffold `appPackage` (= `config.appId`). Controls which card the session appears under.\n" +
|
|
915
|
+
" - `platform_install_id` — the id the shipped app actually broadcasts (Android applicationId / iOS bundle id), set on insert, never modified. Equals `project_install_id` in the normal case; differs only when a separate install-id has been linked to this project. Surfaces in Settings → Project info → per-platform identifiers when divergent.\n" +
|
|
916
|
+
" - `app_label` — the friendly display name (editable in Settings → Project info → Display name; saves via PATCH /api/projects/[projectId]).\n\n" +
|
|
915
917
|
"── What agents can do proactively ──\n" +
|
|
916
|
-
"When minting the second platform's sim, if the project's appPackage matches an existing project the user already has, **the join happens automatically** — no special tool call, no flag
|
|
918
|
+
"When minting the second platform's sim, if the project's appPackage matches an existing project the user already has, **the join happens automatically** — no special tool call, no flag. Just call createSimulatorSession for that platform's project. If the appPackage is NEW, a new project is created. When scaffolding the second platform of an existing app, PROACTIVELY tell the dev: 'Use the same Extentos app id (`appPackage`) as your other platform so they share one project — it's independent of your store bundle id.' There is no merge/link action to run; matching the appPackage IS the mechanism.",
|
|
917
919
|
keywords: [
|
|
918
920
|
"multi-platform",
|
|
919
921
|
"android ios",
|
|
920
|
-
"
|
|
922
|
+
"cross-platform app id",
|
|
921
923
|
"matching reverse-dns",
|
|
922
924
|
"applicationid",
|
|
923
925
|
"bundle id",
|
|
@@ -980,7 +982,7 @@ export const DOC_INDEX = [
|
|
|
980
982
|
content: "**ExtentosConnectionPage** is the drop-in UI that handles pairing, status, toggles, and developer-facing diagnostics for the glasses connection. Three customization layers:\n\n" +
|
|
981
983
|
"1. **Drop-in** — `ExtentosConnectionPage(glasses)` (Kotlin) / `ExtentosConnectionPage(glasses: glasses)` (Swift). Zero config; works out of the box. Auto-updates with new library versions.\n" +
|
|
982
984
|
"2. **Theme** — pass an `ExtentosTheme` to override colors / typography while keeping the structural layout. Auto-updates with new library versions.\n" +
|
|
983
|
-
"3. **`@ExtentosEscapeHatch`** — full replacement with your own UI. Build against `glasses.connection.state`, `glasses.toggles.state`, and `glasses.connection.simulatorHint` directly. Forfeits structural auto-updates: when the library adds a new connection sub-state or toggle, your UI won't show it until you re-implement.\n\n" +
|
|
985
|
+
"3. **`@ExtentosEscapeHatch`** — full replacement with your own UI. Build against `glasses.connection.state`, `glasses.toggles.state`, and `glasses.connection.simulatorHint` directly (iOS: `@_spi(ExtentosEscapeHatch)` import; Android: `@OptIn(ExtentosEscapeHatch::class)`). Forfeits structural auto-updates: when the library adds a new connection sub-state or toggle, your UI won't show it until you re-implement. The hatch stays fully inside the Extentos ecosystem — you're reading the same Extentos state streams the packaged page renders (lower altitude, same session/state machine/telemetry); it never exposes the raw vendor SDK session (see `searchDocs(topic: 'custom_extensions')` for the policy).\n\n" +
|
|
984
986
|
"── Placement patterns ──\n\n" +
|
|
985
987
|
"Five placements covered by `generateConnectionModule`'s placement gate (`searchDocs(topic: 'connection_ui_placement')` for full code snippets):\n" +
|
|
986
988
|
"- **dedicated_route** — single-purpose route with a back-arrow scaffold.\n" +
|
|
@@ -1178,12 +1180,39 @@ export const DOC_INDEX = [
|
|
|
1178
1180
|
"After steps 1–9 + wrapper bootstrap, run `./gradlew :app:assembleDebug` from project root (Windows: `gradlew.bat :app:assembleDebug` from PowerShell/cmd — the wrapper bootstrap writes both `gradlew` and `gradlew.bat`; on PowerShell set env vars with `$env:JAVA_HOME=\"...\"`, not the POSIX `KEY=value` form). Expected: ~1–3 min for first build (downloads Gradle distribution + dependencies). On success, APK lands at `app/build/outputs/apk/debug/app-debug.apk`. On failure, `JAVA_HOME` or `sdk.dir` is the most common culprit (see prerequisites).\n\n" +
|
|
1179
1181
|
"── Now run generateConnectionModule ──\n" +
|
|
1180
1182
|
"With the host app building cleanly, call `generateConnectionModule({ platform: 'android', glasses: 'meta_rayban', appPackage: 'com.example.myapp' })`. The first call returns the placement question; ask the dev which placement; re-call with `placement: '<chosen_id>'` to receive the scaffold.\n\n" +
|
|
1181
|
-
"── iOS — minimum-viable SwiftUI app ──\n" +
|
|
1182
|
-
"
|
|
1183
|
+
"── iOS — minimum-viable SwiftUI app (GUI path) ──\n" +
|
|
1184
|
+
"Xcode users: New Project wizard (File > New > Project > App, SwiftUI lifecycle, target iOS 16.0+). After the project is created, `xcodebuild -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 16 Pro' build` should succeed before running generateConnectionModule.\n\n" +
|
|
1185
|
+
"── iOS — headless / CLI path (xcodegen) ──\n" +
|
|
1186
|
+
"CLI agents can't open Xcode, and hand-authoring .xcodeproj is impractical — use **xcodegen** (`brew install xcodegen`): declare the project in `project.yml`, run `xcodegen generate`, build with xcodebuild. Minimum-viable `project.yml`:\n" +
|
|
1187
|
+
"```yaml\n" +
|
|
1188
|
+
"name: MyApp\n" +
|
|
1189
|
+
"options:\n" +
|
|
1190
|
+
" bundleIdPrefix: com.example\n" +
|
|
1191
|
+
"packages:\n" +
|
|
1192
|
+
" Extentos:\n" +
|
|
1193
|
+
" url: https://github.com/extentos/swift-glasses\n" +
|
|
1194
|
+
" from: <published version> # unpublished today — use `path: <local checkout>` until the SPM package ships\n" +
|
|
1195
|
+
"targets:\n" +
|
|
1196
|
+
" MyApp:\n" +
|
|
1197
|
+
" type: application\n" +
|
|
1198
|
+
" platform: iOS\n" +
|
|
1199
|
+
" deploymentTarget: '16.0'\n" +
|
|
1200
|
+
" sources: [Sources]\n" +
|
|
1201
|
+
" settings:\n" +
|
|
1202
|
+
" base:\n" +
|
|
1203
|
+
" INFOPLIST_FILE: Info.plist # generateConnectionModule emits its plist at the PROJECT ROOT (matching the manifest record) — point here, don't GENERATE_INFOPLIST_FILE\n" +
|
|
1204
|
+
" EXCLUDED_ARCHS[sdk=iphonesimulator*]: x86_64 # local/unpublished SDK ships an arm64-only simulator slice\n" +
|
|
1205
|
+
" dependencies:\n" +
|
|
1206
|
+
" - package: Extentos\n" +
|
|
1207
|
+
" product: GlassesCore\n" +
|
|
1208
|
+
" - package: Extentos\n" +
|
|
1209
|
+
" product: GlassesUI\n" +
|
|
1210
|
+
"```\n" +
|
|
1211
|
+
"Layout sources under `Sources/MyApp/` (generateConnectionModule emits files at `Sources/<AppName>/Extentos/...` — matching that layout means the scaffold drops in verbatim). After `xcodegen generate`, verify with `xcodebuild -scheme MyApp -destination 'generic/platform=iOS Simulator' build`. generateConnectionModule's wireInstructions are phrased for Xcode's GUI — translate \"add SPM package\" to the `packages:` block and \"add build phase\" additions into `project.yml` stanzas.\n\n" +
|
|
1183
1212
|
"── When this topic does NOT apply ──\n" +
|
|
1184
1213
|
"- You're scaffolding into an existing app (any non-trivial Compose / SwiftUI project) — skip this topic, go straight to generateConnectionModule.\n" +
|
|
1185
1214
|
"- You can open Android Studio / Xcode — use the New Project wizard, then come back to generateConnectionModule.\n" +
|
|
1186
|
-
"- You're rebuilding an existing Extentos integration — use inspectIntegration
|
|
1215
|
+
"- You're rebuilding an existing Extentos integration — use inspectIntegration to read the current state, then re-run generateConnectionModule (idempotent) only if the scaffold itself needs regenerating.",
|
|
1187
1216
|
keywords: [
|
|
1188
1217
|
"scaffold",
|
|
1189
1218
|
"host app",
|