@extentos/mcp-server 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -0
- package/dist/cli/login.d.ts +2 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/login.js +71 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/cli/logout.d.ts +2 -0
- package/dist/cli/logout.d.ts.map +1 -0
- package/dist/cli/logout.js +65 -0
- package/dist/cli/logout.js.map +1 -0
- package/dist/cli/privacy.d.ts +3 -0
- package/dist/cli/privacy.d.ts.map +1 -0
- package/dist/cli/privacy.js +39 -0
- package/dist/cli/privacy.js.map +1 -0
- package/dist/cli/status.d.ts +2 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +9 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/update.d.ts +2 -0
- package/dist/cli/update.d.ts.map +1 -0
- package/dist/cli/update.js +8 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/cli/whoami.d.ts +2 -0
- package/dist/cli/whoami.d.ts.map +1 -0
- package/dist/cli/whoami.js +8 -0
- package/dist/cli/whoami.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +69 -0
- package/dist/cli.js.map +1 -0
- package/dist/generated/schemas.d.ts +4 -0
- package/dist/generated/schemas.d.ts.map +1 -0
- package/dist/generated/schemas.js +2697 -0
- package/dist/generated/schemas.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -0
- package/dist/stub.d.ts +15 -0
- package/dist/stub.d.ts.map +1 -0
- package/dist/stub.js +20 -0
- package/dist/stub.js.map +1 -0
- package/dist/telemetry/client.d.ts +73 -0
- package/dist/telemetry/client.d.ts.map +1 -0
- package/dist/telemetry/client.js +207 -0
- package/dist/telemetry/client.js.map +1 -0
- package/dist/telemetry/consent.d.ts +19 -0
- package/dist/telemetry/consent.d.ts.map +1 -0
- package/dist/telemetry/consent.js +68 -0
- package/dist/telemetry/consent.js.map +1 -0
- package/dist/telemetry/index.d.ts +56 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +151 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/installRegistry.d.ts +18 -0
- package/dist/telemetry/installRegistry.d.ts.map +1 -0
- package/dist/telemetry/installRegistry.js +102 -0
- package/dist/telemetry/installRegistry.js.map +1 -0
- package/dist/tools/data/capabilities.d.ts +566 -0
- package/dist/tools/data/capabilities.d.ts.map +1 -0
- package/dist/tools/data/capabilities.js +243 -0
- package/dist/tools/data/capabilities.js.map +1 -0
- package/dist/tools/data/examplePatterns.d.ts +4 -0
- package/dist/tools/data/examplePatterns.d.ts.map +1 -0
- package/dist/tools/data/examplePatterns.js +546 -0
- package/dist/tools/data/examplePatterns.js.map +1 -0
- package/dist/tools/data/presetTriggers.d.ts +4 -0
- package/dist/tools/data/presetTriggers.d.ts.map +1 -0
- package/dist/tools/data/presetTriggers.js +47 -0
- package/dist/tools/data/presetTriggers.js.map +1 -0
- package/dist/tools/data/version.d.ts +31 -0
- package/dist/tools/data/version.d.ts.map +1 -0
- package/dist/tools/data/version.js +34 -0
- package/dist/tools/data/version.js.map +1 -0
- package/dist/tools/definitions.d.ts +13 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +347 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/docs/index.d.ts +10 -0
- package/dist/tools/docs/index.d.ts.map +1 -0
- package/dist/tools/docs/index.js +220 -0
- package/dist/tools/docs/index.js.map +1 -0
- package/dist/tools/handlers/completeAuthLink.d.ts +3 -0
- package/dist/tools/handlers/completeAuthLink.d.ts.map +1 -0
- package/dist/tools/handlers/completeAuthLink.js +152 -0
- package/dist/tools/handlers/completeAuthLink.js.map +1 -0
- package/dist/tools/handlers/createSimulatorSession.d.ts +3 -0
- package/dist/tools/handlers/createSimulatorSession.d.ts.map +1 -0
- package/dist/tools/handlers/createSimulatorSession.js +231 -0
- package/dist/tools/handlers/createSimulatorSession.js.map +1 -0
- package/dist/tools/handlers/generateConnectionModule.d.ts +3 -0
- package/dist/tools/handlers/generateConnectionModule.d.ts.map +1 -0
- package/dist/tools/handlers/generateConnectionModule.js +222 -0
- package/dist/tools/handlers/generateConnectionModule.js.map +1 -0
- package/dist/tools/handlers/generateConsumer.d.ts +3 -0
- package/dist/tools/handlers/generateConsumer.d.ts.map +1 -0
- package/dist/tools/handlers/generateConsumer.js +257 -0
- package/dist/tools/handlers/generateConsumer.js.map +1 -0
- package/dist/tools/handlers/getCredentialGuide.d.ts +3 -0
- package/dist/tools/handlers/getCredentialGuide.d.ts.map +1 -0
- package/dist/tools/handlers/getCredentialGuide.js +296 -0
- package/dist/tools/handlers/getCredentialGuide.js.map +1 -0
- package/dist/tools/handlers/getEventLog.d.ts +3 -0
- package/dist/tools/handlers/getEventLog.d.ts.map +1 -0
- package/dist/tools/handlers/getEventLog.js +90 -0
- package/dist/tools/handlers/getEventLog.js.map +1 -0
- package/dist/tools/handlers/getExampleSpec.d.ts +3 -0
- package/dist/tools/handlers/getExampleSpec.d.ts.map +1 -0
- package/dist/tools/handlers/getExampleSpec.js +44 -0
- package/dist/tools/handlers/getExampleSpec.js.map +1 -0
- package/dist/tools/handlers/getPermissions.d.ts +3 -0
- package/dist/tools/handlers/getPermissions.d.ts.map +1 -0
- package/dist/tools/handlers/getPermissions.js +50 -0
- package/dist/tools/handlers/getPermissions.js.map +1 -0
- package/dist/tools/handlers/getPlatformInfo.d.ts +3 -0
- package/dist/tools/handlers/getPlatformInfo.d.ts.map +1 -0
- package/dist/tools/handlers/getPlatformInfo.js +78 -0
- package/dist/tools/handlers/getPlatformInfo.js.map +1 -0
- package/dist/tools/handlers/getProductionChecklist.d.ts +3 -0
- package/dist/tools/handlers/getProductionChecklist.d.ts.map +1 -0
- package/dist/tools/handlers/getProductionChecklist.js +238 -0
- package/dist/tools/handlers/getProductionChecklist.js.map +1 -0
- package/dist/tools/handlers/getSimulatorStatus.d.ts +3 -0
- package/dist/tools/handlers/getSimulatorStatus.d.ts.map +1 -0
- package/dist/tools/handlers/getSimulatorStatus.js +56 -0
- package/dist/tools/handlers/getSimulatorStatus.js.map +1 -0
- package/dist/tools/handlers/getVoiceCommandGuidance.d.ts +3 -0
- package/dist/tools/handlers/getVoiceCommandGuidance.d.ts.map +1 -0
- package/dist/tools/handlers/getVoiceCommandGuidance.js +200 -0
- package/dist/tools/handlers/getVoiceCommandGuidance.js.map +1 -0
- package/dist/tools/handlers/initSpec.d.ts +3 -0
- package/dist/tools/handlers/initSpec.d.ts.map +1 -0
- package/dist/tools/handlers/initSpec.js +234 -0
- package/dist/tools/handlers/initSpec.js.map +1 -0
- package/dist/tools/handlers/inspectIntegration.d.ts +3 -0
- package/dist/tools/handlers/inspectIntegration.d.ts.map +1 -0
- package/dist/tools/handlers/inspectIntegration.js +204 -0
- package/dist/tools/handlers/inspectIntegration.js.map +1 -0
- package/dist/tools/handlers/planIntegration.d.ts +3 -0
- package/dist/tools/handlers/planIntegration.d.ts.map +1 -0
- package/dist/tools/handlers/planIntegration.js +279 -0
- package/dist/tools/handlers/planIntegration.js.map +1 -0
- package/dist/tools/handlers/searchDocs.d.ts +3 -0
- package/dist/tools/handlers/searchDocs.d.ts.map +1 -0
- package/dist/tools/handlers/searchDocs.js +41 -0
- package/dist/tools/handlers/searchDocs.js.map +1 -0
- package/dist/tools/handlers/updateSpec.d.ts +3 -0
- package/dist/tools/handlers/updateSpec.d.ts.map +1 -0
- package/dist/tools/handlers/updateSpec.js +453 -0
- package/dist/tools/handlers/updateSpec.js.map +1 -0
- package/dist/tools/handlers/validateIntegration.d.ts +3 -0
- package/dist/tools/handlers/validateIntegration.d.ts.map +1 -0
- package/dist/tools/handlers/validateIntegration.js +546 -0
- package/dist/tools/handlers/validateIntegration.js.map +1 -0
- package/dist/tools/handlers/validateSpec.d.ts +3 -0
- package/dist/tools/handlers/validateSpec.d.ts.map +1 -0
- package/dist/tools/handlers/validateSpec.js +26 -0
- package/dist/tools/handlers/validateSpec.js.map +1 -0
- package/dist/tools/registry.d.ts +4 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +43 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/response.d.ts +12 -0
- package/dist/tools/response.d.ts.map +1 -0
- package/dist/tools/response.js +19 -0
- package/dist/tools/response.js.map +1 -0
- package/dist/tools/templates/androidBootstrap.d.ts +2 -0
- package/dist/tools/templates/androidBootstrap.d.ts.map +1 -0
- package/dist/tools/templates/androidBootstrap.js +40 -0
- package/dist/tools/templates/androidBootstrap.js.map +1 -0
- package/dist/tools/templates/callbackHandler.d.ts +11 -0
- package/dist/tools/templates/callbackHandler.d.ts.map +1 -0
- package/dist/tools/templates/callbackHandler.js +177 -0
- package/dist/tools/templates/callbackHandler.js.map +1 -0
- package/dist/tools/templates/iosBootstrap.d.ts +3 -0
- package/dist/tools/templates/iosBootstrap.d.ts.map +1 -0
- package/dist/tools/templates/iosBootstrap.js +50 -0
- package/dist/tools/templates/iosBootstrap.js.map +1 -0
- package/dist/tools/templates/streamConsumer.d.ts +8 -0
- package/dist/tools/templates/streamConsumer.d.ts.map +1 -0
- package/dist/tools/templates/streamConsumer.js +248 -0
- package/dist/tools/templates/streamConsumer.js.map +1 -0
- package/dist/tools/util/appPackage.d.ts +4 -0
- package/dist/tools/util/appPackage.d.ts.map +1 -0
- package/dist/tools/util/appPackage.js +16 -0
- package/dist/tools/util/appPackage.js.map +1 -0
- package/dist/tools/util/backendClient.d.ts +25 -0
- package/dist/tools/util/backendClient.d.ts.map +1 -0
- package/dist/tools/util/backendClient.js +144 -0
- package/dist/tools/util/backendClient.js.map +1 -0
- package/dist/tools/util/manifest.d.ts +9 -0
- package/dist/tools/util/manifest.d.ts.map +1 -0
- package/dist/tools/util/manifest.js +62 -0
- package/dist/tools/util/manifest.js.map +1 -0
- package/dist/tools/util/permissions.d.ts +32 -0
- package/dist/tools/util/permissions.d.ts.map +1 -0
- package/dist/tools/util/permissions.js +165 -0
- package/dist/tools/util/permissions.js.map +1 -0
- package/dist/tools/validation/validateSpec.d.ts +22 -0
- package/dist/tools/validation/validateSpec.d.ts.map +1 -0
- package/dist/tools/validation/validateSpec.js +370 -0
- package/dist/tools/validation/validateSpec.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
// Bundled documentation index for searchDocs.
|
|
2
|
+
// 26 topics per MCP_TOOLS.md § searchDocs.
|
|
3
|
+
// Content is curated summary + key rules — not full verbatim doc bodies.
|
|
4
|
+
// Authoritative sources live in /docs/mcp/*.md; update both together.
|
|
5
|
+
export const DOC_INDEX = [
|
|
6
|
+
{
|
|
7
|
+
topic: "getting_started",
|
|
8
|
+
title: "Getting Started with Extentos",
|
|
9
|
+
content: "Extentos lets agents build Meta Ray-Ban apps from a structured spec. Standard tool order: planIntegration → getPlatformInfo → generateConnectionModule → initSpec → generateConsumer(callback) → validateIntegration → createSimulatorSession. The library carries all hardware logic — developer code is a spec file plus thin generated glue (bootstrap + callback dispatch + optional stream consumer) plus handler bodies.",
|
|
10
|
+
keywords: ["setup", "start", "first", "begin", "overview", "walkthrough", "tool order", "workflow"],
|
|
11
|
+
relatedTools: ["planIntegration", "generateConnectionModule", "initSpec", "getPlatformInfo"],
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
topic: "block_types",
|
|
15
|
+
title: "Block Types",
|
|
16
|
+
content: "3 blocks: capture_photo (one-shot still), capture_video (bounded clip with duration), record_audio (bounded mic capture). Each returns a URI plus format metadata. Blocks are discrete, bounded operations — continuous media uses streams. Constraints: Meta DAT does not expose live-stream video capture, so capture_video is clip-only.",
|
|
17
|
+
keywords: ["block", "capture_photo", "capture_video", "record_audio", "photo", "video", "audio", "capture"],
|
|
18
|
+
relatedTools: ["getPlatformInfo", "initSpec", "updateSpec"],
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
topic: "stream_types",
|
|
22
|
+
title: "Stream Types",
|
|
23
|
+
content: "5 streams: video_frames (outbound from glasses camera), audio_chunks (outbound mic), transcription_incremental (STT events), outgoing_video_stream (phone→glasses video), outgoing_audio_stream (phone→glasses audio). Consumption: Kotlin Flow on Android, AsyncStream on iOS. Backpressure via buffering strategy per stream config. Lifecycle: start/stop tied to app foreground; foreground service required on Android 14+.",
|
|
24
|
+
keywords: ["stream", "video_frames", "audio_chunks", "transcription", "flow", "asyncstream", "backpressure", "continuous"],
|
|
25
|
+
relatedTools: ["getPlatformInfo", "generateConsumer", "getPermissions"],
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
topic: "trigger_types",
|
|
29
|
+
title: "Trigger Types",
|
|
30
|
+
content: "13 triggers: voice_command (custom phrase), wake_word, push_to_talk, capture_button, tap, double_tap, manual_launch, phone_notification_forwarded, incoming_call_detected, location_updated, thermal_warning, connection_state_changed, fallback_default. Payloads vary — voice_command exposes captures dict, tap has position, location_updated has lat/long.",
|
|
31
|
+
keywords: ["trigger", "voice_command", "tap", "capture_button", "wake_word", "fallback", "notification", "thermal"],
|
|
32
|
+
relatedTools: ["getPlatformInfo", "getVoiceCommandGuidance", "updateSpec"],
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
topic: "action_types",
|
|
36
|
+
title: "Action Types",
|
|
37
|
+
content: "15 actions inside trigger flows: block_call, stream_start, stream_stop, speak, app_callback, set_toggle, set_variable, branch, retry_with_backoff, when_connected, wait, delay, stop_flow, log, emit_event. app_callback routes to host-code handlers for AI / domain logic. branch supports depth cap of 4. retry_with_backoff succeeds when save_as is populated.",
|
|
38
|
+
keywords: ["action", "block_call", "app_callback", "branch", "retry", "speak", "set_toggle", "set_variable"],
|
|
39
|
+
relatedTools: ["updateSpec", "generateConsumer"],
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
topic: "voice_ux_guide",
|
|
43
|
+
title: "Voice Command UX",
|
|
44
|
+
content: "Phrases should be 3+ syllables, free of homophones, free of digits (STT rarely round-trips them), free of punctuation. Named captures {{query}} must be the final token. Provide 3+ alternates for natural paraphrase. Avoid Meta wake words (hey meta, hey facebook, ok meta) — they conflict with on-device Meta AI. Consider matchMode: \"fuzzy\" for long phrases.",
|
|
45
|
+
keywords: ["voice", "phrase", "command", "homophone", "capture", "stt", "disambiguation", "alternate"],
|
|
46
|
+
relatedTools: ["getVoiceCommandGuidance", "updateSpec"],
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
topic: "spec_format",
|
|
50
|
+
title: "Spec Format",
|
|
51
|
+
content: "Top-level: extentos_version ('1.0'), target.vendor ('meta_rayban'), blocks[], streams[], triggers[]. Each block/stream/trigger has a unique id. Triggers declare a type, optional id, and an actions[] array. Spec file lives at app/src/main/assets/extentos.spec.json (Android) or Resources/extentos.spec.json (iOS), byte-identical across platforms.",
|
|
52
|
+
keywords: ["spec", "format", "structure", "extentos_version", "target", "schema", "top-level"],
|
|
53
|
+
relatedTools: ["validateSpec", "initSpec", "updateSpec", "inspectIntegration"],
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
topic: "spec_validation_rules",
|
|
57
|
+
title: "Spec Validation Rules",
|
|
58
|
+
content: "11 rules: R1 extentos_version, R2 target.vendor, R3 block type supported, R4 stream type supported, R5 id pattern ^[a-z][a-z0-9_]{0,31}$ and uniqueness, R6 trigger type supported, R7 action type supported, R8 app_callback handler name, R9 branch depth ≤ 4, R10 template variable resolvable, R11 toggle key in allowed set. Branch depth cap prevents runaway flow explosion.",
|
|
59
|
+
keywords: ["validation", "rule", "error", "lint", "r1", "r5", "branch depth", "id regex"],
|
|
60
|
+
relatedTools: ["validateSpec", "validateIntegration"],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
topic: "template_syntax",
|
|
64
|
+
title: "Template Variable Syntax",
|
|
65
|
+
content: "Curly-brace interpolation: {{key}} resolves against trigger payload or variables. Dot paths: {{trigger_payload.captures.query}}, {{toggles.listening_mode}}, {{hardware_state.thermal}}. Special namespaces: trigger_payload (per-trigger fields), toggles (runtime state), hardware_state (thermal/battery/audio route/connected). Unresolvable paths fail R10.",
|
|
66
|
+
keywords: ["template", "variable", "substitution", "capture", "interpolation", "curly", "{{"],
|
|
67
|
+
relatedTools: ["validateSpec", "updateSpec"],
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
topic: "toggles",
|
|
71
|
+
title: "Runtime Toggles",
|
|
72
|
+
content: "8 toggles: listening_mode, camera_streaming_enabled, audio_capture_enabled, transcription_enabled, battery_save_mode, voice_confirmations, audio_video_coexistence_policy, privacy_mode. privacy_mode is the super-toggle — when active it suspends all capture. set_toggle action mutates state; flows can gate on toggle values via branch conditions.",
|
|
73
|
+
keywords: ["toggle", "privacy_mode", "set_toggle", "listening_mode", "state", "runtime", "super"],
|
|
74
|
+
relatedTools: ["updateSpec", "getVoiceCommandGuidance"],
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
topic: "connection_state_model",
|
|
78
|
+
title: "Connection State Model",
|
|
79
|
+
content: "8 GlassesState buckets: NotRegistered, Registered, DeviceDiscovered, Connecting, Active, Reconnecting, Disconnected, Failed. Active is a supertype covering multiple internal states. Transport selects one of BrowserSimTransport / LocalSimTransport / RealMetaTransport and drives the state machine. Scope is per-session — app tear-down resets to NotRegistered.",
|
|
80
|
+
keywords: ["connection", "state", "active", "disconnected", "glassesstate", "transport", "reconnect"],
|
|
81
|
+
relatedTools: ["getSimulatorStatus", "getEventLog"],
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
topic: "audio_video_coexistence",
|
|
85
|
+
title: "Audio / Video Coexistence",
|
|
86
|
+
content: "Bluetooth A2DP (stereo media) and HFP (mic + mono audio) cannot run simultaneously on most Meta Ray-Ban pairings. audio_video_coexistence_policy toggle controls behavior: 'mic_priority' downgrades playback to mono when mic is active; 'stereo_priority' disables mic during stereo playback. Events surface 'degraded' markers when fallback occurs.",
|
|
87
|
+
keywords: ["audio", "video", "coexistence", "a2dp", "hfp", "bluetooth", "degraded", "priority"],
|
|
88
|
+
relatedTools: ["updateSpec"],
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
topic: "library_api",
|
|
92
|
+
title: "Extentos Library API",
|
|
93
|
+
content: "ExtentosGlasses is the top-level object, carrying 8 sub-clients: blocks, streams, triggers, toggles, events, extensions, connection, state. ExtentosConfig controls spec source, transport override, appearance theme. Creation: ExtentosGlasses.create() on Android / Extentos.create() on iOS. Register app_callback handlers via glasses.extensions.registerAppCallbackHandler(name, impl).",
|
|
94
|
+
keywords: ["library", "api", "extentosglasses", "config", "subclient", "create", "register"],
|
|
95
|
+
relatedTools: ["generateConnectionModule", "generateConsumer"],
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
topic: "app_callback_guide",
|
|
99
|
+
title: "App Callback Handlers",
|
|
100
|
+
content: "app_callback routes flow control to native code for AI calls, domain logic, external service access. Register via glasses.extensions.registerAppCallbackHandler(name, impl). AppCall shape: { name, args: {...}, caller: { triggerId, flowId } }. Returning a value populates the flow's save_as variable. Timeouts surface as 'callback.timeout' events.",
|
|
101
|
+
keywords: ["app_callback", "callback", "handler", "register", "appcall", "timeout", "byok"],
|
|
102
|
+
relatedTools: ["generateConsumer", "getCredentialGuide", "updateSpec"],
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
topic: "voice_proxy",
|
|
106
|
+
title: "Simulator Voice Proxy",
|
|
107
|
+
content: "Simulator-time STT + TTS runs on Extentos infrastructure — automatic inside BrowserSimTransport, no developer code. Rides on the simulator event meter (anonymous or account tier). Production voice is phone-native: Android SpeechRecognizer + TextToSpeech; iOS SFSpeechRecognizer + AVSpeechSynthesizer + AVAudioSession. Zero Extentos runtime path in production.",
|
|
108
|
+
keywords: ["voice_proxy", "stt", "tts", "simulator", "meter", "proxy", "production voice"],
|
|
109
|
+
relatedTools: ["createSimulatorSession", "getCredentialGuide"],
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
topic: "custom_extensions",
|
|
113
|
+
title: "Custom Extensions",
|
|
114
|
+
content: "Escape hatches for capabilities beyond the spec: glasses.extensions.registerCustomBlock(name, impl) adds a block type; glasses.extensions.registerCustomTrigger(name, impl) adds a trigger type. Custom registrations live outside the generated /extentos directory in developer-owned code. Spec references the custom name like any built-in type.",
|
|
115
|
+
keywords: ["custom", "extension", "registerCustomBlock", "registerCustomTrigger", "escape hatch"],
|
|
116
|
+
relatedTools: ["generateConsumer"],
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
topic: "simulator_local_mode",
|
|
120
|
+
title: "Simulator Local Mode",
|
|
121
|
+
content: "Local mode uses MockCameraKit for deterministic frame generation and no backend dependency. DebugPanel surfaces events, toggles, and flow state in-process. No session URL, no meter consumption, no networking. Ideal for unit tests and offline development.",
|
|
122
|
+
keywords: ["local", "mock", "mockcamerakit", "debug", "offline", "simulator"],
|
|
123
|
+
relatedTools: ["createSimulatorSession"],
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
topic: "simulator_browser_mode",
|
|
127
|
+
title: "Simulator Browser Mode",
|
|
128
|
+
content: "Browser mode provisions a web UI via createSimulatorSession — agent receives sessionUrl, opens in browser, browser loads the spec and drives simulated hardware. WebSocket hub coordinates app ↔ browser ↔ optional observer. Supports injection (forced events) and replay of recorded sessions. Session bound to meter tier.",
|
|
129
|
+
keywords: ["browser", "session", "websocket", "injection", "replay", "simulator", "url"],
|
|
130
|
+
relatedTools: ["createSimulatorSession", "getSimulatorStatus", "getEventLog"],
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
topic: "event_log_schema",
|
|
134
|
+
title: "Event Log Schema",
|
|
135
|
+
content: "29 event types across 7 layers (transport, trigger, block, callback, toggle, stream, system). flowId correlates events inside one trigger execution. type uses dot notation: trigger.fired, block.completed, callback.timeout, stream.started, spec.loaded, account.meter_warning, simulator.session_expired. 10 getEventLog filter values: all, errors, transport, triggers, blocks, callbacks, toggles, streams, system, spec. errors filter is cross-layer severity-based; spec filter is type-prefixed.",
|
|
136
|
+
keywords: ["event", "log", "flowid", "layer", "filter", "schema", "29", "trigger.fired"],
|
|
137
|
+
relatedTools: ["getEventLog", "getSimulatorStatus"],
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
topic: "permissions",
|
|
141
|
+
title: "Permissions Derivation",
|
|
142
|
+
content: "Android runtime permissions and iOS Info.plist keys derive from spec contents. Photo/video blocks → CAMERA. Audio-recording blocks, mic streams, voice triggers → RECORD_AUDIO + NSMicrophoneUsageDescription + NSSpeechRecognitionUsageDescription. Always added: BLUETOOTH_CONNECT, BLUETOOTH_SCAN, INTERNET, NSBluetoothAlwaysUsageDescription. Streams require FOREGROUND_SERVICE + foregroundServiceType (Android) or UIBackgroundModes (iOS). Meta DAT scopes derive from same surface: glasses.connection always; glasses.camera.{photo,video,stream}, glasses.audio.{record,stream} conditionally.",
|
|
143
|
+
keywords: ["permission", "manifest", "info.plist", "camera", "microphone", "bluetooth", "dat", "scope"],
|
|
144
|
+
relatedTools: ["getPermissions", "validateIntegration", "getProductionChecklist"],
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
topic: "credentials",
|
|
148
|
+
title: "Credentials",
|
|
149
|
+
content: "Simulator voice proxy is automatic — no setup. Meta Developer Center registration is required at first real-hardware test (per-developer): create app, enable Wearables DAT, register package name + signing signature (Android) or bundle ID + Team ID (iOS), copy App ID + Client Token into extentos.manifest.json (Android) or Info.plist MWDAT dict (iOS). BYOK provider keys (Anthropic / OpenAI / Google / etc.) live in the developer's secret storage and get consumed inside app_callback handlers — never stored in the manifest.",
|
|
150
|
+
keywords: ["credential", "meta", "developer", "api key", "byok", "dat", "client token", "registration"],
|
|
151
|
+
relatedTools: ["getCredentialGuide", "getProductionChecklist"],
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
topic: "production_checklist",
|
|
155
|
+
title: "Production Checklist",
|
|
156
|
+
content: "8 personalized categories: Meta Developer Account, DAT Registration, Credential Swap, API Keys (skipped if no handlers), Permissions Audit, Foreground Service (skipped if no streams), Transport Config, Store Listing. Each step is personalized to the spec — streams add foreground service / background modes; handlers add API key wiring; simulator URL must be stripped from release builds.",
|
|
157
|
+
keywords: ["production", "checklist", "release", "ship", "store", "ready"],
|
|
158
|
+
relatedTools: ["getProductionChecklist", "getCredentialGuide", "getPermissions"],
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
topic: "concurrency_modes",
|
|
162
|
+
title: "Concurrency Modes",
|
|
163
|
+
content: "Trigger-level concurrency: 'restart' cancels any in-flight flow of the same id and runs the new one; 'single' ignores new invocations while one is running; 'queued' enqueues up to N (default 3). Default is 'single' for voice_command, 'restart' for stream-derived triggers. Applies independently per trigger id.",
|
|
164
|
+
keywords: ["concurrency", "restart", "single", "queued", "trigger", "in-flight"],
|
|
165
|
+
relatedTools: ["updateSpec"],
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
topic: "manifest_format",
|
|
169
|
+
title: "extentos.manifest.json Format",
|
|
170
|
+
content: "Manifest version 1. Top-level: platform ('android'|'ios'), glasses ('meta_rayban'), appPackage, extentos { libraryVersion, specVersion, installedAt, lastUpdatedAt }, spec { path, hash }, generatedFiles[], one of gradle { coordinate, buildFile, additionalArtifacts } or spm { package, packageURL, version, projectFile, additionalProducts }, permissions[], integration { blocks, streams, triggers, handlerNames, togglesOverridden }. Tool-managed; hand-edits trigger drift in validateIntegration.",
|
|
171
|
+
keywords: ["manifest", "json", "extentos.manifest", "spec.hash", "generatedfiles", "gradle", "spm"],
|
|
172
|
+
relatedTools: ["inspectIntegration", "validateIntegration"],
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
topic: "constraints_and_limitations",
|
|
176
|
+
title: "Platform Constraints and Limitations",
|
|
177
|
+
content: "Meta DAT is phone↔glasses — no browser↔glasses. 'Hey Meta' wake word not accessible to third parties. Live video streaming from glasses camera not exposed in current DAT (frames only). Custom gestures beyond tap/double-tap not in preview. Publishing to store is preview-limited; private testing via export is the safe default. iOS SDK: iOS 15.2+, Swift 6 preferred. A2DP/HFP can't run concurrently.",
|
|
178
|
+
keywords: ["limit", "constraint", "dat", "gap", "wake word", "preview", "unsupported"],
|
|
179
|
+
relatedTools: ["getPlatformInfo", "planIntegration"],
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
topic: "connection_ui",
|
|
183
|
+
title: "Connection UI",
|
|
184
|
+
content: "3-layer customization: (1) drop-in ExtentosConnectionPage with zero config; (2) appearance tokens via ExtentosTheme for colors/typography; (3) @ExtentosEscapeHatch for full replacement (forfeits auto-updates). Placement patterns: dedicated route, settings subscreen, bottom-nav tab, modal sheet, headless. Auto-grows with spec — new triggers/toggles appear automatically. FAQ: Is it customizable? Yes, 3 layers. Can I hide sections? Yes via ConnectionPageConfig. Can I reorder? No — structural lock (status always first). Can I bring my own design? Yes via escape hatch, but no auto-updates. Does it auto-update with library? Yes for drop-in / themed; no for escape-hatch.",
|
|
185
|
+
keywords: ["ui", "connection page", "theme", "escape hatch", "appearance", "auto-grow", "placement", "connectionpageconfig"],
|
|
186
|
+
relatedTools: ["generateConnectionModule"],
|
|
187
|
+
},
|
|
188
|
+
];
|
|
189
|
+
export function searchDocsIndex(query, topicFilter) {
|
|
190
|
+
const q = query.trim().toLowerCase();
|
|
191
|
+
const filtered = topicFilter ? DOC_INDEX.filter((e) => e.topic === topicFilter) : DOC_INDEX;
|
|
192
|
+
if (!q)
|
|
193
|
+
return filtered;
|
|
194
|
+
const terms = q.split(/\s+/).filter(Boolean);
|
|
195
|
+
const scored = filtered.map((entry) => {
|
|
196
|
+
let score = 0;
|
|
197
|
+
const hay = `${entry.topic} ${entry.title} ${entry.keywords.join(" ")} ${entry.content}`.toLowerCase();
|
|
198
|
+
for (const t of terms) {
|
|
199
|
+
if (entry.topic === t)
|
|
200
|
+
score += 20;
|
|
201
|
+
if (entry.topic.includes(t))
|
|
202
|
+
score += 10;
|
|
203
|
+
if (entry.title.toLowerCase().includes(t))
|
|
204
|
+
score += 8;
|
|
205
|
+
for (const kw of entry.keywords) {
|
|
206
|
+
if (kw === t)
|
|
207
|
+
score += 6;
|
|
208
|
+
else if (kw.includes(t))
|
|
209
|
+
score += 2;
|
|
210
|
+
}
|
|
211
|
+
const occurrences = hay.split(t).length - 1;
|
|
212
|
+
if (occurrences > 0)
|
|
213
|
+
score += Math.min(occurrences, 3);
|
|
214
|
+
}
|
|
215
|
+
return { entry, score };
|
|
216
|
+
});
|
|
217
|
+
const hits = scored.filter((s) => s.score > 0).sort((a, b) => b.score - a.score);
|
|
218
|
+
return hits.length ? hits.map((s) => s.entry) : filtered.slice(0, 0);
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/docs/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completeAuthLink.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/completeAuthLink.ts"],"names":[],"mappings":"AAYA,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAyB5E,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAmI9E"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// completeAuthLink — poll the backend device-token endpoint until the user
|
|
2
|
+
// completes signup at the verification URL, then persist the bearer token to
|
|
3
|
+
// ~/.extentos/auth.json. Spec: docs/mcp/AUTHENTICATION.md § Device-code upgrade flow.
|
|
4
|
+
//
|
|
5
|
+
// Agent flow:
|
|
6
|
+
// 1. createSimulatorSession returns { status: "auth_required", deviceCode, userCode, verificationUrl, pollIntervalSeconds, expiresInSeconds }
|
|
7
|
+
// 2. Agent surfaces userCode + verificationUrl to the developer
|
|
8
|
+
// 3. Agent calls completeAuthLink with the deviceCode
|
|
9
|
+
// 4. This handler polls /api/auth/device/token until approved/expired/denied
|
|
10
|
+
// 5. On approval, writes auth.json and returns { linked: true, tier, accountId }
|
|
11
|
+
// 6. Agent re-invokes createSimulatorSession — now uses the bearer token
|
|
12
|
+
import { okResponse, errorResponse } from "../response.js";
|
|
13
|
+
import { backendFetch, writeAuthToken } from "../util/backendClient.js";
|
|
14
|
+
import { emitAccountLinked, emitLoginCompleted, } from "../../telemetry/index.js";
|
|
15
|
+
export async function handleCompleteAuthLink(raw) {
|
|
16
|
+
const parsed = parseArgs(raw);
|
|
17
|
+
if ("error" in parsed)
|
|
18
|
+
return parsed.error;
|
|
19
|
+
const { deviceCode, maxWaitSeconds, pollIntervalSeconds } = parsed;
|
|
20
|
+
const startedAt = Date.now();
|
|
21
|
+
const deadline = startedAt + maxWaitSeconds * 1000;
|
|
22
|
+
let interval = Math.max(1, pollIntervalSeconds);
|
|
23
|
+
let pollCount = 0;
|
|
24
|
+
const finish = (outcome, res) => {
|
|
25
|
+
emitLoginCompleted({ outcome, durationMs: Date.now() - startedAt });
|
|
26
|
+
return res;
|
|
27
|
+
};
|
|
28
|
+
while (Date.now() < deadline) {
|
|
29
|
+
pollCount += 1;
|
|
30
|
+
const res = await backendFetch("/api/auth/device/token", {
|
|
31
|
+
method: "POST",
|
|
32
|
+
body: { deviceCode },
|
|
33
|
+
});
|
|
34
|
+
if (res.status === 404) {
|
|
35
|
+
return finish("code_expired", errorResponse({
|
|
36
|
+
code: "unknown_device_code",
|
|
37
|
+
message: "Backend does not recognize this deviceCode — it may have expired or never existed.",
|
|
38
|
+
fixHint: "Call createSimulatorSession again to get a fresh deviceCode.",
|
|
39
|
+
retryable: false,
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
if (res.status === 410) {
|
|
43
|
+
return finish("code_expired", errorResponse({
|
|
44
|
+
code: "device_code_expired",
|
|
45
|
+
message: "The device-code window (10 min) elapsed before the user finished signup.",
|
|
46
|
+
fixHint: "Call createSimulatorSession again to get a fresh code.",
|
|
47
|
+
retryable: true,
|
|
48
|
+
}));
|
|
49
|
+
}
|
|
50
|
+
if (res.status === 403) {
|
|
51
|
+
return finish("user_denied", errorResponse({
|
|
52
|
+
code: "device_code_denied",
|
|
53
|
+
message: "The developer declined the signup prompt at the verification page.",
|
|
54
|
+
fixHint: "Ask the developer to retry and accept the prompt.",
|
|
55
|
+
retryable: true,
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
if (!res.ok || !res.data) {
|
|
59
|
+
return finish("network_error", errorResponse({
|
|
60
|
+
code: "backend_unreachable",
|
|
61
|
+
message: `Polling /api/auth/device/token failed: ${res.errorText ?? `HTTP ${res.status}`}.`,
|
|
62
|
+
fixHint: "Check the backend is reachable and the EXTENTOS_BACKEND_URL is correct.",
|
|
63
|
+
retryable: true,
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
const body = res.data;
|
|
67
|
+
if (body.pending) {
|
|
68
|
+
if (typeof body.pollIntervalSeconds === "number" && body.pollIntervalSeconds > 0) {
|
|
69
|
+
interval = body.pollIntervalSeconds;
|
|
70
|
+
}
|
|
71
|
+
const waitMs = Math.min(interval * 1000, Math.max(0, deadline - Date.now()));
|
|
72
|
+
if (waitMs <= 0)
|
|
73
|
+
break;
|
|
74
|
+
await sleep(waitMs);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (body.authToken && body.accountId && body.linkedAt && body.expiresAt && body.tier) {
|
|
78
|
+
const write = writeAuthToken({
|
|
79
|
+
authToken: body.authToken,
|
|
80
|
+
accountId: body.accountId,
|
|
81
|
+
linkedAt: body.linkedAt,
|
|
82
|
+
expiresAt: body.expiresAt,
|
|
83
|
+
scope: "account_full",
|
|
84
|
+
});
|
|
85
|
+
// Emit linked BEFORE login_completed so the analytics timeline orders
|
|
86
|
+
// the two events naturally (signup -> link -> login done).
|
|
87
|
+
emitAccountLinked();
|
|
88
|
+
return finish("success", okResponse({
|
|
89
|
+
linked: true,
|
|
90
|
+
tier: body.tier,
|
|
91
|
+
accountId: body.accountId,
|
|
92
|
+
linkedAt: body.linkedAt,
|
|
93
|
+
expiresAt: body.expiresAt,
|
|
94
|
+
authTokenFile: {
|
|
95
|
+
path: write.path,
|
|
96
|
+
written: write.ok,
|
|
97
|
+
error: write.error ?? null,
|
|
98
|
+
},
|
|
99
|
+
pollCount,
|
|
100
|
+
summary: `Account linked (tier: ${body.tier}). Re-invoke createSimulatorSession to use the new bearer token.`,
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
return finish("network_error", errorResponse({
|
|
104
|
+
code: "backend_invalid_response",
|
|
105
|
+
message: "Poll response did not match any known shape (pending | approved | error).",
|
|
106
|
+
fixHint: "Check backend version compatibility.",
|
|
107
|
+
retryable: false,
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
return finish("polling_aborted", errorResponse({
|
|
111
|
+
code: "auth_timeout",
|
|
112
|
+
message: `Polling timed out after ${maxWaitSeconds}s without user approval.`,
|
|
113
|
+
fixHint: "Ask the developer to complete signup at the verificationUrl, then call completeAuthLink again with the same deviceCode (while it's still valid).",
|
|
114
|
+
retryable: true,
|
|
115
|
+
}));
|
|
116
|
+
}
|
|
117
|
+
function sleep(ms) {
|
|
118
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
119
|
+
}
|
|
120
|
+
function parseArgs(raw) {
|
|
121
|
+
if (!raw || typeof raw !== "object") {
|
|
122
|
+
return {
|
|
123
|
+
error: errorResponse({
|
|
124
|
+
code: "invalid_arguments",
|
|
125
|
+
message: "completeAuthLink requires { deviceCode }.",
|
|
126
|
+
fixHint: "Pass the deviceCode returned from createSimulatorSession's auth_required response.",
|
|
127
|
+
retryable: false,
|
|
128
|
+
}),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
const o = raw;
|
|
132
|
+
if (typeof o.deviceCode !== "string" || !o.deviceCode.trim()) {
|
|
133
|
+
return {
|
|
134
|
+
error: errorResponse({
|
|
135
|
+
code: "invalid_arguments",
|
|
136
|
+
message: "deviceCode (string) is required.",
|
|
137
|
+
fixHint: "Pass the deviceCode from createSimulatorSession's auth_required response.",
|
|
138
|
+
retryable: false,
|
|
139
|
+
}),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
const maxWait = typeof o.maxWaitSeconds === "number" && o.maxWaitSeconds > 0 ? Math.min(o.maxWaitSeconds, 600) : 600;
|
|
143
|
+
const interval = typeof o.pollIntervalSeconds === "number" && o.pollIntervalSeconds > 0
|
|
144
|
+
? Math.min(Math.max(o.pollIntervalSeconds, 1), 30)
|
|
145
|
+
: 5;
|
|
146
|
+
return {
|
|
147
|
+
deviceCode: o.deviceCode.trim(),
|
|
148
|
+
maxWaitSeconds: maxWait,
|
|
149
|
+
pollIntervalSeconds: interval,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=completeAuthLink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completeAuthLink.js","sourceRoot":"","sources":["../../../src/tools/handlers/completeAuthLink.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSimulatorSession.d.ts","sourceRoot":"","sources":["../../../src/tools/handlers/createSimulatorSession.ts"],"names":[],"mappings":"AAMA,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAkC5E,wBAAsB,4BAA4B,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAiHpF"}
|