@extentos/mcp-server 0.0.16 → 0.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generated/schemas.js +7 -7
- package/dist/generated/schemas.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/tools/data/capabilities.js +1 -1
- package/dist/tools/data/capabilities.js.map +1 -1
- package/dist/tools/data/version.d.ts.map +1 -1
- package/dist/tools/data/version.js +6 -1
- package/dist/tools/data/version.js.map +1 -1
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +33 -6
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/docs/index.d.ts.map +1 -1
- package/dist/tools/docs/index.js +64 -27
- package/dist/tools/docs/index.js.map +1 -1
- package/dist/tools/handlers/createSimulatorSession.js +2 -2
- package/dist/tools/handlers/createSimulatorSession.js.map +1 -1
- package/dist/tools/handlers/generateConnectionModule.d.ts.map +1 -1
- package/dist/tools/handlers/generateConnectionModule.js +146 -34
- package/dist/tools/handlers/generateConnectionModule.js.map +1 -1
- package/dist/tools/handlers/generateConsumer.d.ts.map +1 -1
- package/dist/tools/handlers/generateConsumer.js +96 -22
- package/dist/tools/handlers/generateConsumer.js.map +1 -1
- package/dist/tools/handlers/getPlatformInfo.d.ts.map +1 -1
- package/dist/tools/handlers/getPlatformInfo.js +129 -20
- package/dist/tools/handlers/getPlatformInfo.js.map +1 -1
- package/dist/tools/handlers/getVoiceCommandGuidance.js +1 -1
- package/dist/tools/handlers/getVoiceCommandGuidance.js.map +1 -1
- package/dist/tools/handlers/initSpec.d.ts.map +1 -1
- package/dist/tools/handlers/initSpec.js +37 -2
- package/dist/tools/handlers/initSpec.js.map +1 -1
- package/dist/tools/handlers/inspectIntegration.d.ts.map +1 -1
- package/dist/tools/handlers/inspectIntegration.js +5 -35
- package/dist/tools/handlers/inspectIntegration.js.map +1 -1
- package/dist/tools/handlers/updateSpec.d.ts +1 -1
- package/dist/tools/handlers/updateSpec.d.ts.map +1 -1
- package/dist/tools/handlers/updateSpec.js +49 -1
- package/dist/tools/handlers/updateSpec.js.map +1 -1
- package/dist/tools/handlers/validateIntegration.d.ts.map +1 -1
- package/dist/tools/handlers/validateIntegration.js +6 -27
- package/dist/tools/handlers/validateIntegration.js.map +1 -1
- package/dist/tools/templates/androidBootstrap.js +67 -67
- package/dist/tools/templates/callbackHandler.d.ts.map +1 -1
- package/dist/tools/templates/callbackHandler.js +30 -6
- package/dist/tools/templates/callbackHandler.js.map +1 -1
- package/dist/tools/templates/iosBootstrap.js +64 -64
- package/dist/tools/templates/streamConsumer.js +24 -4
- package/dist/tools/templates/streamConsumer.js.map +1 -1
- package/dist/tools/util/dependency.d.ts +7 -0
- package/dist/tools/util/dependency.d.ts.map +1 -0
- package/dist/tools/util/dependency.js +61 -0
- package/dist/tools/util/dependency.js.map +1 -0
- package/dist/tools/util/generatedHash.d.ts +13 -0
- package/dist/tools/util/generatedHash.d.ts.map +1 -0
- package/dist/tools/util/generatedHash.js +37 -0
- package/dist/tools/util/generatedHash.js.map +1 -0
- package/dist/tools/util/permissions.d.ts.map +1 -1
- package/dist/tools/util/permissions.js +26 -5
- package/dist/tools/util/permissions.js.map +1 -1
- package/dist/tools/util/userCodeMerge.d.ts +33 -0
- package/dist/tools/util/userCodeMerge.d.ts.map +1 -0
- package/dist/tools/util/userCodeMerge.js +127 -0
- package/dist/tools/util/userCodeMerge.js.map +1 -0
- package/dist/tools/validation/validateSpec.js +1 -1
- package/dist/tools/validation/validateSpec.js.map +1 -1
- package/package.json +1 -1
|
@@ -14,74 +14,74 @@
|
|
|
14
14
|
import { iosModuleName } from "../util/appPackage.js";
|
|
15
15
|
export function renderIosBootstrap(appPackage) {
|
|
16
16
|
const moduleName = iosModuleName(appPackage);
|
|
17
|
-
return `// EXTENTOS-GENERATED — do not edit manually. Regenerate via MCP tools.
|
|
18
|
-
import Foundation
|
|
19
|
-
import SwiftUI
|
|
20
|
-
import os
|
|
21
|
-
import GlassesCore
|
|
22
|
-
|
|
23
|
-
@MainActor
|
|
24
|
-
final class ExtentosBootstrap: ObservableObject {
|
|
25
|
-
static let shared = ExtentosBootstrap()
|
|
26
|
-
|
|
27
|
-
let glasses: ExtentosGlasses
|
|
28
|
-
let sceneObserver: ExtentosSceneObserver
|
|
29
|
-
|
|
30
|
-
private static let log = Logger(subsystem: "${appPackage}", category: "Extentos")
|
|
31
|
-
|
|
32
|
-
private init() {
|
|
33
|
-
// debug = true gates the auto-bind probe path on Android (rule 4
|
|
34
|
-
// of TransportChoice.Auto). iOS auto-bind isn't built yet, but
|
|
35
|
-
// wiring debug from the build configuration here means the iOS
|
|
36
|
-
// template doesn't have to be regenerated when iOS auto-bind ships.
|
|
37
|
-
#if DEBUG
|
|
38
|
-
let isDebugBuild = true
|
|
39
|
-
#else
|
|
40
|
-
let isDebugBuild = false
|
|
41
|
-
#endif
|
|
42
|
-
let config = ExtentosConfig(
|
|
43
|
-
appId: Bundle.main.infoDictionary?["EXTENTOS_APP_ID"] as? String,
|
|
44
|
-
accountId: Bundle.main.infoDictionary?["EXTENTOS_ACCOUNT_ID"] as? String,
|
|
45
|
-
transport: .auto,
|
|
46
|
-
debug: isDebugBuild,
|
|
47
|
-
telemetryConsent: true
|
|
48
|
-
)
|
|
49
|
-
glasses = Extentos.create(config: config)
|
|
50
|
-
sceneObserver = ExtentosSceneObserver(glasses: glasses)
|
|
51
|
-
|
|
52
|
-
// EXTENTOS-GENERATED-START:dispatch
|
|
53
|
-
// Callback handler registration is emitted by generateConsumer(kind: "callback").
|
|
54
|
-
// EXTENTOS-GENERATED-END:dispatch
|
|
55
|
-
|
|
56
|
-
Task.detached { [glasses] in
|
|
57
|
-
switch await glasses.runtime.loadSpec() {
|
|
58
|
-
case .success(let handle):
|
|
59
|
-
let spec = await glasses.runtime.currentSpec()
|
|
60
|
-
let triggers = spec?.triggers.count ?? 0
|
|
61
|
-
let blocks = spec?.blocks.count ?? 0
|
|
62
|
-
Self.log.info("spec loaded: \\(triggers) trigger(s), \\(blocks) block(s) [handle=\\(handle, privacy: .public)]")
|
|
63
|
-
case .failure(let err):
|
|
64
|
-
Self.log.error("spec load FAILED — triggers will not fire: \\(String(describing: err), privacy: .public)")
|
|
65
|
-
if case .validationFailed(let errors) = err {
|
|
66
|
-
for e in errors {
|
|
67
|
-
Self.log.error(" \\(e.path, privacy: .public): \\(e.message, privacy: .public)")
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
await glasses.connect()
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
17
|
+
return `// EXTENTOS-GENERATED — do not edit manually. Regenerate via MCP tools.
|
|
18
|
+
import Foundation
|
|
19
|
+
import SwiftUI
|
|
20
|
+
import os
|
|
21
|
+
import GlassesCore
|
|
22
|
+
|
|
23
|
+
@MainActor
|
|
24
|
+
final class ExtentosBootstrap: ObservableObject {
|
|
25
|
+
static let shared = ExtentosBootstrap()
|
|
26
|
+
|
|
27
|
+
let glasses: ExtentosGlasses
|
|
28
|
+
let sceneObserver: ExtentosSceneObserver
|
|
29
|
+
|
|
30
|
+
private static let log = Logger(subsystem: "${appPackage}", category: "Extentos")
|
|
31
|
+
|
|
32
|
+
private init() {
|
|
33
|
+
// debug = true gates the auto-bind probe path on Android (rule 4
|
|
34
|
+
// of TransportChoice.Auto). iOS auto-bind isn't built yet, but
|
|
35
|
+
// wiring debug from the build configuration here means the iOS
|
|
36
|
+
// template doesn't have to be regenerated when iOS auto-bind ships.
|
|
37
|
+
#if DEBUG
|
|
38
|
+
let isDebugBuild = true
|
|
39
|
+
#else
|
|
40
|
+
let isDebugBuild = false
|
|
41
|
+
#endif
|
|
42
|
+
let config = ExtentosConfig(
|
|
43
|
+
appId: Bundle.main.infoDictionary?["EXTENTOS_APP_ID"] as? String,
|
|
44
|
+
accountId: Bundle.main.infoDictionary?["EXTENTOS_ACCOUNT_ID"] as? String,
|
|
45
|
+
transport: .auto,
|
|
46
|
+
debug: isDebugBuild,
|
|
47
|
+
telemetryConsent: true
|
|
48
|
+
)
|
|
49
|
+
glasses = Extentos.create(config: config)
|
|
50
|
+
sceneObserver = ExtentosSceneObserver(glasses: glasses)
|
|
51
|
+
|
|
52
|
+
// EXTENTOS-GENERATED-START:dispatch
|
|
53
|
+
// Callback handler registration is emitted by generateConsumer(kind: "callback").
|
|
54
|
+
// EXTENTOS-GENERATED-END:dispatch
|
|
55
|
+
|
|
56
|
+
Task.detached { [glasses] in
|
|
57
|
+
switch await glasses.runtime.loadSpec() {
|
|
58
|
+
case .success(let handle):
|
|
59
|
+
let spec = await glasses.runtime.currentSpec()
|
|
60
|
+
let triggers = spec?.triggers.count ?? 0
|
|
61
|
+
let blocks = spec?.blocks.count ?? 0
|
|
62
|
+
Self.log.info("spec loaded: \\(triggers) trigger(s), \\(blocks) block(s) [handle=\\(handle, privacy: .public)]")
|
|
63
|
+
case .failure(let err):
|
|
64
|
+
Self.log.error("spec load FAILED — triggers will not fire: \\(String(describing: err), privacy: .public)")
|
|
65
|
+
if case .validationFailed(let errors) = err {
|
|
66
|
+
for e in errors {
|
|
67
|
+
Self.log.error(" \\(e.path, privacy: .public): \\(e.message, privacy: .public)")
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
await glasses.connect()
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
75
|
`;
|
|
76
76
|
}
|
|
77
77
|
export function renderIosAppPatchHint(appPackage) {
|
|
78
78
|
const moduleName = iosModuleName(appPackage);
|
|
79
|
-
return `Add inside @main struct ${moduleName}App: App's WindowGroup scene, on the root view:
|
|
80
|
-
.onOpenURL { url in
|
|
81
|
-
Task { _ = try? await Wearables.shared.handleUrl(url) }
|
|
82
|
-
}
|
|
83
|
-
.onChange(of: scenePhase) { _, newPhase in
|
|
84
|
-
ExtentosBootstrap.shared.sceneObserver.scenePhaseChanged(to: newPhase)
|
|
79
|
+
return `Add inside @main struct ${moduleName}App: App's WindowGroup scene, on the root view:
|
|
80
|
+
.onOpenURL { url in
|
|
81
|
+
Task { _ = try? await Wearables.shared.handleUrl(url) }
|
|
82
|
+
}
|
|
83
|
+
.onChange(of: scenePhase) { _, newPhase in
|
|
84
|
+
ExtentosBootstrap.shared.sceneObserver.scenePhaseChanged(to: newPhase)
|
|
85
85
|
}`;
|
|
86
86
|
}
|
|
87
87
|
//# sourceMappingURL=iosBootstrap.js.map
|
|
@@ -29,6 +29,10 @@ function androidLifecycleTemplate(appPackage, streams, concise) {
|
|
|
29
29
|
const types = collectAndroidTypes(streams);
|
|
30
30
|
const header = `// EXTENTOS-GENERATED — stream consumer boilerplate. Regenerate via MCP tools.\n` +
|
|
31
31
|
`package ${appPackage}.extentos\n\n` +
|
|
32
|
+
`// USER-CODE-START:imports\n` +
|
|
33
|
+
`// Auto-imports from your IDE land HERE — anything OUTSIDE this block is\n` +
|
|
34
|
+
`// regenerated and your edits will be lost. The core library imports below\n` +
|
|
35
|
+
`// are pre-populated; add any extras inside this block.\n` +
|
|
32
36
|
`import androidx.lifecycle.Lifecycle\n` +
|
|
33
37
|
`import androidx.lifecycle.LifecycleOwner\n` +
|
|
34
38
|
`import androidx.lifecycle.lifecycleScope\n` +
|
|
@@ -36,7 +40,8 @@ function androidLifecycleTemplate(appPackage, streams, concise) {
|
|
|
36
40
|
`import com.extentos.glasses.core.ExtentosGlasses\n` +
|
|
37
41
|
types.map((t) => `import com.extentos.glasses.core.${t}\n`).join("") +
|
|
38
42
|
`import kotlinx.coroutines.flow.catch\n` +
|
|
39
|
-
`import kotlinx.coroutines.launch\n
|
|
43
|
+
`import kotlinx.coroutines.launch\n` +
|
|
44
|
+
`// USER-CODE-END:imports\n\n`;
|
|
40
45
|
const prose = concise
|
|
41
46
|
? ""
|
|
42
47
|
: `/**\n * Call from onCreate() or a LaunchedEffect after glasses are connected.\n * Collection stops when the lifecycle drops below STARTED (screen off, backgrounded)\n * and resumes automatically when STARTED again.\n */\n`;
|
|
@@ -51,11 +56,16 @@ function androidConnectionTemplate(appPackage, streams, concise) {
|
|
|
51
56
|
const types = collectAndroidTypes(streams);
|
|
52
57
|
const header = `// EXTENTOS-GENERATED — stream consumer boilerplate (connection-scoped). Regenerate via MCP tools.\n` +
|
|
53
58
|
`package ${appPackage}.extentos\n\n` +
|
|
59
|
+
`// USER-CODE-START:imports\n` +
|
|
60
|
+
`// Auto-imports from your IDE land HERE — anything OUTSIDE this block is\n` +
|
|
61
|
+
`// regenerated and your edits will be lost. The core library imports below\n` +
|
|
62
|
+
`// are pre-populated; add any extras inside this block.\n` +
|
|
54
63
|
`import com.extentos.glasses.core.ExtentosGlasses\n` +
|
|
55
64
|
`import com.extentos.glasses.core.GlassesState\n` +
|
|
56
65
|
types.map((t) => `import com.extentos.glasses.core.${t}\n`).join("") +
|
|
57
66
|
`import kotlinx.coroutines.flow.catch\n` +
|
|
58
|
-
`import kotlinx.coroutines.launch\n
|
|
67
|
+
`import kotlinx.coroutines.launch\n` +
|
|
68
|
+
`// USER-CODE-END:imports\n\n`;
|
|
59
69
|
const prose = concise
|
|
60
70
|
? ""
|
|
61
71
|
: `// These collectors live as long as the glasses are connected. They survive\n// Activity recreation but stop on disconnect — the per-connection scope\n// cancels all children automatically when glasses disconnect.\n\n`;
|
|
@@ -172,8 +182,13 @@ function androidStreamMeta(type) {
|
|
|
172
182
|
}
|
|
173
183
|
function iosLifecycleTemplate(streams, concise) {
|
|
174
184
|
const header = `// EXTENTOS-GENERATED — stream consumer boilerplate. Regenerate via MCP tools.\n` +
|
|
185
|
+
`// USER-CODE-START:imports\n` +
|
|
186
|
+
`// Auto-imports from your IDE land HERE — anything OUTSIDE this block is\n` +
|
|
187
|
+
`// regenerated and your edits will be lost. The core library imports below\n` +
|
|
188
|
+
`// are pre-populated; add any extras inside this block.\n` +
|
|
175
189
|
`import Foundation\n` +
|
|
176
|
-
`import GlassesCore\n
|
|
190
|
+
`import GlassesCore\n` +
|
|
191
|
+
`// USER-CODE-END:imports\n\n`;
|
|
177
192
|
const prose = concise
|
|
178
193
|
? ""
|
|
179
194
|
: `/// Call from your View's .task { ... } after glasses are connected.\n/// The Tasks are cancelled automatically when the parent task is cancelled.\n`;
|
|
@@ -187,8 +202,13 @@ function iosLifecycleTemplate(streams, concise) {
|
|
|
187
202
|
}
|
|
188
203
|
function iosConnectionTemplate(streams, concise) {
|
|
189
204
|
const header = `// EXTENTOS-GENERATED — stream consumer boilerplate (connection-scoped). Regenerate via MCP tools.\n` +
|
|
205
|
+
`// USER-CODE-START:imports\n` +
|
|
206
|
+
`// Auto-imports from your IDE land HERE — anything OUTSIDE this block is\n` +
|
|
207
|
+
`// regenerated and your edits will be lost. The core library imports below\n` +
|
|
208
|
+
`// are pre-populated; add any extras inside this block.\n` +
|
|
190
209
|
`import Foundation\n` +
|
|
191
|
-
`import GlassesCore\n
|
|
210
|
+
`import GlassesCore\n` +
|
|
211
|
+
`// USER-CODE-END:imports\n\n`;
|
|
192
212
|
const prose = concise
|
|
193
213
|
? ""
|
|
194
214
|
: `/// Observes ExtentosGlasses state and launches per-connection Tasks that are\n/// cancelled automatically when the glasses disconnect.\n`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamConsumer.js","sourceRoot":"","sources":["../../../src/tools/templates/streamConsumer.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,gFAAgF;AAChF,mEAAmE;AAcnE,MAAM,UAAU,oBAAoB,CAClC,UAAkB,EAClB,OAAqB,EACrB,KAAkB,EAClB,OAAgB;IAEhB,IAAI,KAAK,KAAK,WAAW;QAAE,OAAO,wBAAwB,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACzF,OAAO,yBAAyB,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAqB,EAAE,KAAkB,EAAE,OAAgB;IAC1F,IAAI,KAAK,KAAK,WAAW;QAAE,OAAO,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzE,OAAO,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,yEAAyE;AACzE,2EAA2E;AAC3E,2EAA2E;AAC3E,0EAA0E;AAC1E,kCAAkC;AAClC,MAAM,uBAAuB,GAAyC;IACpE,YAAY,EAAE,CAAC,YAAY,EAAE,kBAAkB,CAAC;IAChD,YAAY,EAAE,CAAC,YAAY,EAAE,kBAAkB,CAAC;IAChD,yBAAyB,EAAE,CAAC,YAAY,EAAE,qBAAqB,CAAC;IAChE,0EAA0E;IAC1E,yDAAyD;IACzD,qBAAqB,EAAE,EAAE;IACzB,qBAAqB,EAAE,EAAE;CAC1B,CAAC;AAEF,SAAS,wBAAwB,CAAC,UAAkB,EAAE,OAAqB,EAAE,OAAgB;IAC3F,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,MAAM,GACV,kFAAkF;QAClF,WAAW,UAAU,eAAe;QACpC,uCAAuC;QACvC,4CAA4C;QAC5C,4CAA4C;QAC5C,+CAA+C;QAC/C,oDAAoD;QACpD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oCAAoC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACpE,wCAAwC;QACxC,
|
|
1
|
+
{"version":3,"file":"streamConsumer.js","sourceRoot":"","sources":["../../../src/tools/templates/streamConsumer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface DependencyResult {
|
|
2
|
+
found: boolean;
|
|
3
|
+
coordinate: string | null;
|
|
4
|
+
file: string | null;
|
|
5
|
+
}
|
|
6
|
+
export declare function inspectDependency(projectPath: string, platform: string | undefined, manifest: Record<string, unknown>): DependencyResult;
|
|
7
|
+
//# sourceMappingURL=dependency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency.d.ts","sourceRoot":"","sources":["../../../src/tools/util/dependency.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,gBAAgB,CAyDlB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Shared dependency-presence inspection for inspectIntegration / validateIntegration.
|
|
2
|
+
// Single source of truth — was duplicated in both handlers and went stale on the
|
|
3
|
+
// catalog-aware bump (modern Android Gradle uses gradle/libs.versions.toml; the
|
|
4
|
+
// old logic only scanned app/build.gradle.kts and false-flagged catalog declarations).
|
|
5
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
export function inspectDependency(projectPath, platform, manifest) {
|
|
8
|
+
if (platform === "android") {
|
|
9
|
+
const gradle = manifest.gradle;
|
|
10
|
+
const coord = typeof gradle?.coordinate === "string" ? gradle.coordinate : null;
|
|
11
|
+
const buildFile = typeof gradle?.buildFile === "string" ? gradle.buildFile : "app/build.gradle.kts";
|
|
12
|
+
if (!coord)
|
|
13
|
+
return { found: false, coordinate: coord, file: buildFile };
|
|
14
|
+
const buildAbs = join(projectPath, buildFile);
|
|
15
|
+
if (!existsSync(buildAbs))
|
|
16
|
+
return { found: false, coordinate: coord, file: buildFile };
|
|
17
|
+
const buildText = readFileSync(buildAbs, "utf8");
|
|
18
|
+
const [group, name] = coord.split(":");
|
|
19
|
+
const groupName = `${group}:${name}`;
|
|
20
|
+
// Path 1: legacy direct-coord declaration in build.gradle.kts.
|
|
21
|
+
if (buildText.includes(groupName)) {
|
|
22
|
+
return { found: true, coordinate: coord, file: buildFile };
|
|
23
|
+
}
|
|
24
|
+
// Path 2: version catalog. Both conditions must hold to avoid false-positives
|
|
25
|
+
// from stray catalog entries that aren't actually wired into the build.
|
|
26
|
+
const catalogRel = "gradle/libs.versions.toml";
|
|
27
|
+
const catalogAbs = join(projectPath, catalogRel);
|
|
28
|
+
if (existsSync(catalogAbs)) {
|
|
29
|
+
const catalogText = readFileSync(catalogAbs, "utf8");
|
|
30
|
+
// Single-line library entry: alias = { group = "...", name = "...", version... }
|
|
31
|
+
// group and name can appear in either order; both must match the coord.
|
|
32
|
+
const entryRe = /^\s*([A-Za-z0-9_.-]+)\s*=\s*\{([^}]*)\}/gm;
|
|
33
|
+
let m;
|
|
34
|
+
while ((m = entryRe.exec(catalogText)) !== null) {
|
|
35
|
+
const [, alias, body] = m;
|
|
36
|
+
const groupMatch = /\bgroup\s*=\s*"([^"]+)"/.exec(body);
|
|
37
|
+
const nameMatch = /\bname\s*=\s*"([^"]+)"/.exec(body);
|
|
38
|
+
if (groupMatch?.[1] === group && nameMatch?.[1] === name) {
|
|
39
|
+
// Aliases in TOML use - or .; in Gradle they're always exposed dotted.
|
|
40
|
+
const dottedAlias = alias.replace(/-/g, ".");
|
|
41
|
+
if (buildText.includes(`libs.${dottedAlias}`)) {
|
|
42
|
+
return { found: true, coordinate: coord, file: `${buildFile} (via ${catalogRel})` };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return { found: false, coordinate: coord, file: buildFile };
|
|
48
|
+
}
|
|
49
|
+
if (platform === "ios") {
|
|
50
|
+
const spm = manifest.spm;
|
|
51
|
+
const pkg = typeof spm?.package === "string" ? spm.package : null;
|
|
52
|
+
const projectFile = typeof spm?.projectFile === "string" ? spm.projectFile : "Package.swift";
|
|
53
|
+
const abs = join(projectPath, projectFile);
|
|
54
|
+
if (!pkg || !existsSync(abs))
|
|
55
|
+
return { found: false, coordinate: pkg, file: projectFile };
|
|
56
|
+
const text = readFileSync(abs, "utf8");
|
|
57
|
+
return { found: text.includes(pkg), coordinate: pkg, file: projectFile };
|
|
58
|
+
}
|
|
59
|
+
return { found: false, coordinate: null, file: null };
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=dependency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency.js","sourceRoot":"","sources":["../../../src/tools/util/dependency.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compute the manifest hash for a generated file. Replaces the body of every
|
|
3
|
+
* USER-CODE-START / USER-CODE-END block with a fixed placeholder before
|
|
4
|
+
* sha256-ing, so user implementations don't trip drift warnings.
|
|
5
|
+
*
|
|
6
|
+
* Returns the canonical `sha256:<hex>` form recorded in manifest.generatedFiles[].hash.
|
|
7
|
+
*
|
|
8
|
+
* Files without any USER-CODE markers (e.g., ExtentosBootstrap) hash exactly
|
|
9
|
+
* as before — the regex finds no match, the content is hashed verbatim. This
|
|
10
|
+
* preserves behavior for tool-owned files that have no developer-edited regions.
|
|
11
|
+
*/
|
|
12
|
+
export declare function hashGeneratedContent(content: string): string;
|
|
13
|
+
//# sourceMappingURL=generatedHash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generatedHash.d.ts","sourceRoot":"","sources":["../../../src/tools/util/generatedHash.ts"],"names":[],"mappings":"AA0BA;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAM5D"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Hash function for generated source files. Used by both the emit side
|
|
2
|
+
// (generateConnectionModule / initSpec / generateConsumer write the recorded
|
|
3
|
+
// hash to manifest.generatedFiles[].hash) and the drift-check side
|
|
4
|
+
// (inspectIntegration / validateIntegration compare live file content against
|
|
5
|
+
// the manifest hash). The two sides MUST use the same function or every fresh
|
|
6
|
+
// integration shows false drift.
|
|
7
|
+
//
|
|
8
|
+
// Bug fixed (F7): the previous implementation hashed the whole file. Files
|
|
9
|
+
// like ExtentosCallbacks.{kt,swift} and ExtentosStreams.{kt,swift} contain
|
|
10
|
+
// USER-CODE-START:<name> / USER-CODE-END:<name> blocks that the developer
|
|
11
|
+
// is EXPECTED to fill in. With whole-file hashing, every successful handler
|
|
12
|
+
// implementation tripped a drift warning, training agents to ignore drift.
|
|
13
|
+
//
|
|
14
|
+
// New contract (matches docs/mcp/INTEGRATION_SHAPE.md § Generated File
|
|
15
|
+
// Conventions): hash covers only what regeneration will overwrite — i.e.,
|
|
16
|
+
// everything OUTSIDE USER-CODE blocks. Marker LINES themselves stay in the
|
|
17
|
+
// hashed content (so renaming or removing a USER-CODE block IS drift —
|
|
18
|
+
// that's a structural change). Only the BODY between the markers is masked.
|
|
19
|
+
import { createHash } from "node:crypto";
|
|
20
|
+
const USER_CODE_BODY_RE = /(\/\/\s*USER-CODE-START:[^\n]*\n)[\s\S]*?(\n[ \t]*\/\/\s*USER-CODE-END:[^\n]*)/g;
|
|
21
|
+
const STRIPPED_PLACEHOLDER = "// [USER-CODE-CONTENT-STRIPPED]";
|
|
22
|
+
/**
|
|
23
|
+
* Compute the manifest hash for a generated file. Replaces the body of every
|
|
24
|
+
* USER-CODE-START / USER-CODE-END block with a fixed placeholder before
|
|
25
|
+
* sha256-ing, so user implementations don't trip drift warnings.
|
|
26
|
+
*
|
|
27
|
+
* Returns the canonical `sha256:<hex>` form recorded in manifest.generatedFiles[].hash.
|
|
28
|
+
*
|
|
29
|
+
* Files without any USER-CODE markers (e.g., ExtentosBootstrap) hash exactly
|
|
30
|
+
* as before — the regex finds no match, the content is hashed verbatim. This
|
|
31
|
+
* preserves behavior for tool-owned files that have no developer-edited regions.
|
|
32
|
+
*/
|
|
33
|
+
export function hashGeneratedContent(content) {
|
|
34
|
+
const stripped = content.replace(USER_CODE_BODY_RE, `$1${STRIPPED_PLACEHOLDER}$2`);
|
|
35
|
+
return `sha256:${createHash("sha256").update(stripped).digest("hex")}`;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=generatedHash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generatedHash.js","sourceRoot":"","sources":["../../../src/tools/util/generatedHash.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,6EAA6E;AAC7E,mEAAmE;AACnE,8EAA8E;AAC9E,8EAA8E;AAC9E,iCAAiC;AACjC,EAAE;AACF,2EAA2E;AAC3E,2EAA2E;AAC3E,0EAA0E;AAC1E,4EAA4E;AAC5E,2EAA2E;AAC3E,EAAE;AACF,uEAAuE;AACvE,0EAA0E;AAC1E,2EAA2E;AAC3E,uEAAuE;AACvE,4EAA4E;AAE5E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,iBAAiB,GACrB,iFAAiF,CAAC;AAEpF,MAAM,oBAAoB,GAAG,iCAAiC,CAAC;AAE/D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAC9B,iBAAiB,EACjB,KAAK,oBAAoB,IAAI,CAC9B,CAAC;IACF,OAAO,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACzE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/tools/util/permissions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/tools/util/permissions.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,EAAE;QACjB,QAAQ,EAAE,OAAO,CAAC;QAClB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5B,CAAC;IACF,oBAAoB,EAAE;QACpB,QAAQ,EAAE,OAAO,CAAC;QAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;KAChC,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAyBD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACtC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACvC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACvC,MAAM,EAAE,CAoCV;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,iBAAiB,CA+D9E;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,CAuCtE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,iBAAiB,CA+B9E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,SAAS,CAMlH"}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
// Shared derivations for spec → platform permissions / Info.plist / DAT needs.
|
|
2
2
|
// Consumed by initSpec, generateConsumer, getPermissions, and validateSpec's stats.
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
import { VERSION_INFO } from "../data/version.js";
|
|
4
|
+
// Single source of truth for Android SDK levels lives in data/version.ts.
|
|
5
|
+
// Hardcoding them here drifted (lib bumped 34→35; this file didn't) and broke
|
|
6
|
+
// fresh-scaffold builds. Do not re-introduce literal values.
|
|
7
|
+
const ANDROID_MIN_SDK = VERSION_INFO.android.minimumSdk;
|
|
8
|
+
const ANDROID_COMPILE_SDK = VERSION_INFO.android.compileSdk;
|
|
9
|
+
const ANDROID_TARGET_SDK = VERSION_INFO.android.targetSdk;
|
|
6
10
|
const IOS_PRIVACY_STRINGS = {
|
|
7
11
|
NSCameraUsageDescription: "Used to capture photos and video from your glasses.",
|
|
8
12
|
NSMicrophoneUsageDescription: "Used to capture audio from your glasses for voice commands.",
|
|
@@ -23,7 +27,13 @@ export function derivePermissions(blocks, streams, triggers) {
|
|
|
23
27
|
for (const b of blocks) {
|
|
24
28
|
if (b.type === "capture_photo" || b.type === "capture_video")
|
|
25
29
|
add("android.permission.CAMERA");
|
|
26
|
-
if (b.type === "
|
|
30
|
+
if (b.type === "record_audio")
|
|
31
|
+
add("android.permission.RECORD_AUDIO");
|
|
32
|
+
// capture_video defaults to include_audio=false per SPEC_SCHEMA.md — only
|
|
33
|
+
// explicit-true configuration triggers RECORD_AUDIO. Adding it
|
|
34
|
+
// unconditionally would over-declare the permission for any video-capture
|
|
35
|
+
// app that doesn't actually use audio (a user-trust problem on its own).
|
|
36
|
+
if (b.type === "capture_video" && isIncludeAudioTrue(b))
|
|
27
37
|
add("android.permission.RECORD_AUDIO");
|
|
28
38
|
}
|
|
29
39
|
for (const st of streams) {
|
|
@@ -116,7 +126,9 @@ export function deriveIos(spec) {
|
|
|
116
126
|
for (const b of blocks) {
|
|
117
127
|
if (b.type === "capture_photo" || b.type === "capture_video")
|
|
118
128
|
needed.add("NSCameraUsageDescription");
|
|
119
|
-
if (b.type === "
|
|
129
|
+
if (b.type === "record_audio")
|
|
130
|
+
needed.add("NSMicrophoneUsageDescription");
|
|
131
|
+
if (b.type === "capture_video" && isIncludeAudioTrue(b))
|
|
120
132
|
needed.add("NSMicrophoneUsageDescription");
|
|
121
133
|
}
|
|
122
134
|
for (const s of streams) {
|
|
@@ -187,4 +199,13 @@ export function derivesInfoPlistPatch(spec) {
|
|
|
187
199
|
function arr(v) {
|
|
188
200
|
return Array.isArray(v) ? v : [];
|
|
189
201
|
}
|
|
202
|
+
// Read `params.include_audio` off a capture_video block. Default is `false`
|
|
203
|
+
// per SPEC_SCHEMA.md — only an explicit-true configuration counts as "this
|
|
204
|
+
// spec uses the microphone via video capture."
|
|
205
|
+
function isIncludeAudioTrue(block) {
|
|
206
|
+
const params = block.params;
|
|
207
|
+
if (!params || typeof params !== "object")
|
|
208
|
+
return false;
|
|
209
|
+
return params.include_audio === true;
|
|
210
|
+
}
|
|
190
211
|
//# sourceMappingURL=permissions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/tools/util/permissions.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,oFAAoF;
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/tools/util/permissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface MergeWarning {
|
|
2
|
+
kind: "duplicate_block" | "unterminated_block";
|
|
3
|
+
name: string;
|
|
4
|
+
detail: string;
|
|
5
|
+
}
|
|
6
|
+
export interface MergeResult {
|
|
7
|
+
/** The merged file content. Write this verbatim to disk. */
|
|
8
|
+
merged: string;
|
|
9
|
+
/** sha256 hash of `merged` in the canonical `sha256:<hex>` form. */
|
|
10
|
+
hash: string;
|
|
11
|
+
/** Block names whose existing body was preserved into the new content. */
|
|
12
|
+
preserved: string[];
|
|
13
|
+
/** Block names that were in `existing` but no longer in `next` — kept as ORPHANED blocks at end-of-file. */
|
|
14
|
+
orphaned: string[];
|
|
15
|
+
/** Soft warnings (corrupt input, duplicate block names). Merge continues; agent surfaces these to the dev. */
|
|
16
|
+
warnings: MergeWarning[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Merge USER-CODE block bodies from `existing` into `next`.
|
|
20
|
+
*
|
|
21
|
+
* Algorithm:
|
|
22
|
+
* 1. Parse `existing` for USER-CODE blocks → Map<name, body>.
|
|
23
|
+
* 2. Walk `next`, replace each block's body with the existing body if the
|
|
24
|
+
* name matches. Track preserved names.
|
|
25
|
+
* 3. Any names in `existing` not present in `next` are appended at end-of-file
|
|
26
|
+
* as `// ORPHANED:<name>` blocks (with markers preserved so a future
|
|
27
|
+
* re-add of that handler picks the body back up automatically).
|
|
28
|
+
*
|
|
29
|
+
* Pure function. Safe to call repeatedly. Stable output: same inputs →
|
|
30
|
+
* identical output (and identical hash).
|
|
31
|
+
*/
|
|
32
|
+
export declare function mergeUserCodeBlocks(existing: string, next: string): MergeResult;
|
|
33
|
+
//# sourceMappingURL=userCodeMerge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userCodeMerge.d.ts","sourceRoot":"","sources":["../../../src/tools/util/userCodeMerge.ts"],"names":[],"mappings":"AAuCA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,iBAAiB,GAAG,oBAAoB,CAAC;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,4GAA4G;IAC5G,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,8GAA8G;IAC9G,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAOD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CA6D/E"}
|