@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
package/README.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# @extentos/mcp-server
|
|
2
|
+
|
|
3
|
+
MCP server for building Meta-glasses-connected apps with Claude Code and other
|
|
4
|
+
MCP-aware agents. Exposes 18 deterministic tools covering planning, spec
|
|
5
|
+
authoring, code generation, permissions, credential guidance, validation, and
|
|
6
|
+
a browser-based simulator for testing without physical hardware.
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
Register the server with Claude Code (or any MCP host) in one line:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
claude mcp add extentos -- npx -y @extentos/mcp-server@latest
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Restart Claude Code. `/mcp` should list `extentos` with all tools available.
|
|
17
|
+
|
|
18
|
+
Prerequisites: Node.js 20+ on `PATH`. That's it — `npx` fetches the package on
|
|
19
|
+
first run and caches it.
|
|
20
|
+
|
|
21
|
+
## What it does
|
|
22
|
+
|
|
23
|
+
The agent drives a full integration flow:
|
|
24
|
+
|
|
25
|
+
1. `planIntegration` — pick the tool sequence for a goal
|
|
26
|
+
2. `generateConnectionModule` — write the bootstrap code + Gradle/SPM wiring
|
|
27
|
+
3. `initSpec` / `updateSpec` — build up the app's behavior spec
|
|
28
|
+
4. `generateConsumer(kind: "callback")` — emit BYOK handler stubs
|
|
29
|
+
5. `getPermissions` / `validateIntegration` — check wiring before running
|
|
30
|
+
6. `createSimulatorSession` — provision a browser-hosted glasses surrogate
|
|
31
|
+
7. `getEventLog` / `inspectIntegration` — debug a running session
|
|
32
|
+
8. `getProductionChecklist` — walk through ship-readiness
|
|
33
|
+
|
|
34
|
+
See the full tool reference and example flow in the repo:
|
|
35
|
+
|
|
36
|
+
- [MCP tool catalog](https://github.com/Asgermolgaard/vibe-hardware/blob/master/docs/mcp/MCP_TOOLS.md)
|
|
37
|
+
- [12-step example flow](https://github.com/Asgermolgaard/vibe-hardware/blob/master/docs/mcp/EXAMPLE_FLOW.md)
|
|
38
|
+
- [Authentication model](https://github.com/Asgermolgaard/vibe-hardware/blob/master/docs/mcp/AUTHENTICATION.md)
|
|
39
|
+
|
|
40
|
+
## Platforms
|
|
41
|
+
|
|
42
|
+
- **Android** — primary target for the current pre-release. Library resolves
|
|
43
|
+
from `mavenLocal()` during Phase 7a; Maven Central promotion is on the
|
|
44
|
+
Phase 7b roadmap.
|
|
45
|
+
- **iOS** — supported via SPM. Same MCP tool surface, different generated
|
|
46
|
+
artifacts.
|
|
47
|
+
|
|
48
|
+
## Status
|
|
49
|
+
|
|
50
|
+
Pre-1.0. APIs may shift between minor versions until the hardware test loop
|
|
51
|
+
closes. Pin to an exact version (`@0.1.0`) if you need reproducibility across
|
|
52
|
+
sessions.
|
|
53
|
+
|
|
54
|
+
## License
|
|
55
|
+
|
|
56
|
+
MIT — see [LICENSE](https://github.com/Asgermolgaard/vibe-hardware/blob/master/LICENSE) in the repo.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/cli/login.ts"],"names":[],"mappings":"AA0BA,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CA2C3C"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// `extentos-mcp login` — explicitly initiate the device-code flow.
|
|
2
|
+
// Spec: docs/mcp/AUTHENTICATION.md § Device-code upgrade flow (on-demand trigger).
|
|
3
|
+
//
|
|
4
|
+
// Flow:
|
|
5
|
+
// 1. POST /api/auth/device/code — backend issues {deviceCode, userCode, verificationUrl, ...}
|
|
6
|
+
// 2. Print user-visible code + URL, best-effort auto-open the verification URL
|
|
7
|
+
// 3. Call handleCompleteAuthLink to poll until approved / expired / denied
|
|
8
|
+
// 4. handleCompleteAuthLink writes ~/.extentos/auth.json and emits telemetry
|
|
9
|
+
//
|
|
10
|
+
// Telemetry: emits `account.login_initiated` with trigger=cli_explicit at step 1.
|
|
11
|
+
// `account.login_completed` + `account.linked` are emitted by completeAuthLink.
|
|
12
|
+
import { spawn } from "node:child_process";
|
|
13
|
+
import { backendFetch } from "../tools/util/backendClient.js";
|
|
14
|
+
import { handleCompleteAuthLink } from "../tools/handlers/completeAuthLink.js";
|
|
15
|
+
import { drainTelemetry, emitLoginInitiated } from "../telemetry/index.js";
|
|
16
|
+
export async function login() {
|
|
17
|
+
emitLoginInitiated("cli_explicit");
|
|
18
|
+
const res = await backendFetch("/api/auth/device/code", {
|
|
19
|
+
method: "POST",
|
|
20
|
+
body: { scope: "account_full" },
|
|
21
|
+
});
|
|
22
|
+
if (!res.ok || !res.data?.deviceCode || !res.data?.userCode || !res.data?.verificationUrl) {
|
|
23
|
+
console.error("[extentos-mcp login] Failed to start device-code flow:");
|
|
24
|
+
console.error(` ${res.errorText ?? `HTTP ${res.status}`}`);
|
|
25
|
+
await drainTelemetry();
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
const { deviceCode, userCode, verificationUrl, expiresInSeconds, pollIntervalSeconds } = res.data;
|
|
29
|
+
console.log("Extentos account linking");
|
|
30
|
+
console.log("");
|
|
31
|
+
console.log(` User code: ${userCode}`);
|
|
32
|
+
console.log(` Verification URL: ${verificationUrl}`);
|
|
33
|
+
console.log("");
|
|
34
|
+
console.log(`Opening browser… (if it doesn't open, paste the URL above)`);
|
|
35
|
+
autoOpen(verificationUrl);
|
|
36
|
+
console.log(`Polling for up to ${expiresInSeconds ?? 600}s. Ctrl-C to cancel.`);
|
|
37
|
+
const result = await handleCompleteAuthLink({
|
|
38
|
+
deviceCode,
|
|
39
|
+
maxWaitSeconds: expiresInSeconds ?? 600,
|
|
40
|
+
pollIntervalSeconds: pollIntervalSeconds ?? 5,
|
|
41
|
+
});
|
|
42
|
+
const text = result.content?.[0]?.text ?? "";
|
|
43
|
+
if (result.isError) {
|
|
44
|
+
console.error("[extentos-mcp login] Link failed:");
|
|
45
|
+
console.error(text);
|
|
46
|
+
await drainTelemetry();
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
console.log("Linked.");
|
|
50
|
+
console.log(text);
|
|
51
|
+
await drainTelemetry();
|
|
52
|
+
}
|
|
53
|
+
function autoOpen(url) {
|
|
54
|
+
if (process.env.EXTENTOS_NO_AUTO_OPEN === "1")
|
|
55
|
+
return;
|
|
56
|
+
try {
|
|
57
|
+
if (process.platform === "darwin") {
|
|
58
|
+
spawn("open", [url], { detached: true, stdio: "ignore" }).unref();
|
|
59
|
+
}
|
|
60
|
+
else if (process.platform === "win32") {
|
|
61
|
+
spawn("cmd.exe", ["/c", "start", "", url], { detached: true, stdio: "ignore" }).unref();
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
spawn("xdg-open", [url], { detached: true, stdio: "ignore" }).unref();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// best-effort — URL is already printed above
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/cli/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/cli/logout.ts"],"names":[],"mappings":"AAqBA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAqC5C"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// `extentos-mcp logout` — clear ~/.extentos/auth.json.
|
|
2
|
+
// Spec: docs/mcp/AUTHENTICATION.md § CLI commands.
|
|
3
|
+
//
|
|
4
|
+
// Calls POST /api/auth/logout (best-effort — if the network is down we still
|
|
5
|
+
// delete the local file so the install cleanly reverts to anonymous), then
|
|
6
|
+
// unlinks the local auth.json.
|
|
7
|
+
//
|
|
8
|
+
// Telemetry: emits `account.logged_out` with sessionLifetimeDays computed
|
|
9
|
+
// from auth.json's `linkedAt` timestamp.
|
|
10
|
+
import { existsSync, readFileSync, rmSync } from "node:fs";
|
|
11
|
+
import { homedir } from "node:os";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { backendFetch } from "../tools/util/backendClient.js";
|
|
14
|
+
import { drainTelemetry, emitLoggedOut } from "../telemetry/index.js";
|
|
15
|
+
function authPath() {
|
|
16
|
+
const base = process.env.EXTENTOS_CONFIG_DIR || join(homedir(), ".extentos");
|
|
17
|
+
return join(base, "auth.json");
|
|
18
|
+
}
|
|
19
|
+
export async function logout() {
|
|
20
|
+
const path = authPath();
|
|
21
|
+
if (!existsSync(path)) {
|
|
22
|
+
console.log("Not linked — no ~/.extentos/auth.json to remove.");
|
|
23
|
+
await drainTelemetry();
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
let token = null;
|
|
27
|
+
let linkedAt = null;
|
|
28
|
+
try {
|
|
29
|
+
const raw = readFileSync(path, "utf-8");
|
|
30
|
+
const parsed = JSON.parse(raw);
|
|
31
|
+
if (typeof parsed.authToken === "string")
|
|
32
|
+
token = parsed.authToken;
|
|
33
|
+
if (typeof parsed.linkedAt === "string")
|
|
34
|
+
linkedAt = parsed.linkedAt;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// fall through — still delete the file
|
|
38
|
+
}
|
|
39
|
+
if (token) {
|
|
40
|
+
// Best-effort server revocation. Ignore failures.
|
|
41
|
+
await backendFetch("/api/auth/logout", { method: "POST", body: { authToken: token } });
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
rmSync(path);
|
|
45
|
+
console.log("Logged out. Install returns to anonymous.");
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
console.error(`[extentos-mcp logout] Failed to delete ${path}:`);
|
|
49
|
+
console.error(` ${err instanceof Error ? err.message : String(err)}`);
|
|
50
|
+
await drainTelemetry();
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
const lifetimeDays = computeLifetimeDays(linkedAt);
|
|
54
|
+
emitLoggedOut(lifetimeDays);
|
|
55
|
+
await drainTelemetry();
|
|
56
|
+
}
|
|
57
|
+
function computeLifetimeDays(linkedAt) {
|
|
58
|
+
if (!linkedAt)
|
|
59
|
+
return null;
|
|
60
|
+
const ms = Date.parse(linkedAt);
|
|
61
|
+
if (Number.isNaN(ms))
|
|
62
|
+
return null;
|
|
63
|
+
return Math.max(0, Math.round((Date.now() - ms) / (24 * 60 * 60 * 1000)));
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/cli/logout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privacy.d.ts","sourceRoot":"","sources":["../../src/cli/privacy.ts"],"names":[],"mappings":"AAkBA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAWnD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAepD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// `extentos-mcp accept-privacy` / `decline-privacy` — persist consent decision.
|
|
2
|
+
// Spec: docs/mcp/TELEMETRY.md § Consent flow,
|
|
3
|
+
// docs/mcp/AUTHENTICATION.md § CLI commands.
|
|
4
|
+
//
|
|
5
|
+
// Both write ~/.extentos/consent; the emit order matters:
|
|
6
|
+
// - accept: write "accepted" first, then emit mcp.consent_accepted (gate is now open)
|
|
7
|
+
// - decline: emit mcp.consent_declined first, then write "declined" (last event
|
|
8
|
+
// on the way out; once written, the gate closes and further emits no-op)
|
|
9
|
+
import { writeConsent } from "../telemetry/consent.js";
|
|
10
|
+
import { drainTelemetry, emitConsentAccepted, emitConsentDeclined, } from "../telemetry/index.js";
|
|
11
|
+
const POLICY_VERSION = "2026-04-22";
|
|
12
|
+
export async function acceptPrivacy() {
|
|
13
|
+
const res = writeConsent("accepted");
|
|
14
|
+
if (!res.ok) {
|
|
15
|
+
console.error(`[extentos-mcp accept-privacy] Failed to write ${res.path}:`);
|
|
16
|
+
console.error(` ${res.error ?? "unknown error"}`);
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
emitConsentAccepted(POLICY_VERSION);
|
|
20
|
+
console.log(`Consent recorded at ${res.path}.`);
|
|
21
|
+
console.log("Telemetry upload enabled.");
|
|
22
|
+
await drainTelemetry();
|
|
23
|
+
}
|
|
24
|
+
export async function declinePrivacy() {
|
|
25
|
+
// Emit BEFORE writing "declined" so this final event passes the enabled() gate.
|
|
26
|
+
emitConsentDeclined(POLICY_VERSION);
|
|
27
|
+
// Drain synchronously so the decline event actually reaches the backend before
|
|
28
|
+
// subsequent emits are gated off.
|
|
29
|
+
await drainTelemetry();
|
|
30
|
+
const res = writeConsent("declined");
|
|
31
|
+
if (!res.ok) {
|
|
32
|
+
console.error(`[extentos-mcp decline-privacy] Failed to write ${res.path}:`);
|
|
33
|
+
console.error(` ${res.error ?? "unknown error"}`);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
console.log(`Consent recorded at ${res.path}.`);
|
|
37
|
+
console.log("Telemetry upload disabled. Simulator continues to work.");
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=privacy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privacy.js","sourceRoot":"","sources":["../../src/cli/privacy.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,8CAA8C;AAC9C,mDAAmD;AACnD,EAAE;AACF,0DAA0D;AAC1D,wFAAwF;AACxF,kFAAkF;AAClF,6EAA6E;AAE7E,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,cAAc,GAAG,YAAY,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,iDAAiD,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;QAC5E,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,mBAAmB,CAAC,cAAc,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,MAAM,cAAc,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,gFAAgF;IAChF,mBAAmB,CAAC,cAAc,CAAC,CAAC;IACpC,+EAA+E;IAC/E,kCAAkC;IAClC,MAAM,cAAc,EAAE,CAAC;IAEvB,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,kDAAkD,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;QAC7E,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"AAIA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAM5C"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// `extentos-mcp status` — Phase 0 shell.
|
|
2
|
+
// Full mechanics: docs/mcp/AUTHENTICATION.md § CLI commands.
|
|
3
|
+
// Superset of whoami plus consent state, versions, library recommendations.
|
|
4
|
+
export async function status() {
|
|
5
|
+
console.error("[extentos-mcp status] Phase 0 scaffold — not implemented.");
|
|
6
|
+
console.error("When implemented: prints consent state, installId, linked account, tier, MCP server version, library version recommendations.");
|
|
7
|
+
process.exit(1);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,6DAA6D;AAC7D,4EAA4E;AAE5E,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC3E,OAAO,CAAC,KAAK,CACX,+HAA+H,CAChI,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/cli/update.ts"],"names":[],"mappings":"AAGA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAM5C"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// `extentos-mcp update` — Phase 0 shell.
|
|
2
|
+
// Full mechanics: docs/mcp/MCP_TOOLS.md § CLI subcommands.
|
|
3
|
+
export async function update() {
|
|
4
|
+
console.error("[extentos-mcp update] Phase 0 scaffold — not implemented.");
|
|
5
|
+
console.error("When implemented: no-op on npx @extentos/mcp-server@latest installs; for pinned installs prints instructions to bump version in agent MCP config.");
|
|
6
|
+
process.exit(1);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/cli/update.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,2DAA2D;AAE3D,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC3E,OAAO,CAAC,KAAK,CACX,mJAAmJ,CACpJ,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/cli/whoami.ts"],"names":[],"mappings":"AAGA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAM5C"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// `extentos-mcp whoami` — Phase 0 shell.
|
|
2
|
+
// Full mechanics: docs/mcp/AUTHENTICATION.md § CLI commands.
|
|
3
|
+
export async function whoami() {
|
|
4
|
+
console.error("[extentos-mcp whoami] Phase 0 scaffold — not implemented.");
|
|
5
|
+
console.error("When implemented: prints installId, accountId (if linked), tier, meterRemaining, authExpiry.");
|
|
6
|
+
process.exit(1);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/cli/whoami.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,6DAA6D;AAE7D,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC3E,OAAO,CAAC,KAAK,CACX,8FAA8F,CAC/F,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Extentos MCP CLI — Phase 0 shells.
|
|
3
|
+
// 7 subcommands per docs/mcp/AUTHENTICATION.md § CLI commands.
|
|
4
|
+
// Running with no subcommand starts the MCP server over stdio.
|
|
5
|
+
import { Command } from "commander";
|
|
6
|
+
import { login } from "./cli/login.js";
|
|
7
|
+
import { logout } from "./cli/logout.js";
|
|
8
|
+
import { whoami } from "./cli/whoami.js";
|
|
9
|
+
import { acceptPrivacy, declinePrivacy } from "./cli/privacy.js";
|
|
10
|
+
import { status } from "./cli/status.js";
|
|
11
|
+
import { update } from "./cli/update.js";
|
|
12
|
+
const program = new Command();
|
|
13
|
+
program
|
|
14
|
+
.name("extentos-mcp")
|
|
15
|
+
.description("Extentos MCP server and developer CLI.")
|
|
16
|
+
.version("0.0.1");
|
|
17
|
+
program
|
|
18
|
+
.command("login")
|
|
19
|
+
.description("Link this install to an Extentos account via device-code flow.")
|
|
20
|
+
.action(async () => {
|
|
21
|
+
await login();
|
|
22
|
+
});
|
|
23
|
+
program
|
|
24
|
+
.command("logout")
|
|
25
|
+
.description("Clear ~/.extentos/auth.json. Install returns to anonymous tier.")
|
|
26
|
+
.action(async () => {
|
|
27
|
+
await logout();
|
|
28
|
+
});
|
|
29
|
+
program
|
|
30
|
+
.command("whoami")
|
|
31
|
+
.description("Print installId, accountId, tier, meter remaining, auth expiry.")
|
|
32
|
+
.action(async () => {
|
|
33
|
+
await whoami();
|
|
34
|
+
});
|
|
35
|
+
program
|
|
36
|
+
.command("accept-privacy")
|
|
37
|
+
.description("Record privacy policy consent (enables telemetry upload).")
|
|
38
|
+
.action(async () => {
|
|
39
|
+
await acceptPrivacy();
|
|
40
|
+
});
|
|
41
|
+
program
|
|
42
|
+
.command("decline-privacy")
|
|
43
|
+
.description("Record privacy policy decline (disables telemetry upload).")
|
|
44
|
+
.action(async () => {
|
|
45
|
+
await declinePrivacy();
|
|
46
|
+
});
|
|
47
|
+
program
|
|
48
|
+
.command("status")
|
|
49
|
+
.description("Print consent state, install ID, linked account, MCP/library versions.")
|
|
50
|
+
.action(async () => {
|
|
51
|
+
await status();
|
|
52
|
+
});
|
|
53
|
+
program
|
|
54
|
+
.command("update")
|
|
55
|
+
.description("Check for MCP server updates (no-op on npx @latest installs).")
|
|
56
|
+
.action(async () => {
|
|
57
|
+
await update();
|
|
58
|
+
});
|
|
59
|
+
if (process.argv.length <= 2) {
|
|
60
|
+
// No subcommand — run the MCP server over stdio.
|
|
61
|
+
await import("./index.js");
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
program.parseAsync(process.argv).catch((err) => {
|
|
65
|
+
console.error("[extentos-mcp] error:", err);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,qCAAqC;AACrC,+DAA+D;AAC/D,+DAA+D;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,cAAc,CAAC;KACpB,WAAW,CAAC,wCAAwC,CAAC;KACrD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,KAAK,EAAE,CAAC;AAChB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,iEAAiE,CAAC;KAC9E,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,MAAM,EAAE,CAAC;AACjB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,iEAAiE,CAAC;KAC9E,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,MAAM,EAAE,CAAC;AACjB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,2DAA2D,CAAC;KACxE,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,aAAa,EAAE,CAAC;AACxB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,4DAA4D,CAAC;KACzE,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,cAAc,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,wEAAwE,CAAC;KACrF,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,MAAM,EAAE,CAAC;AACjB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,+DAA+D,CAAC;KAC5E,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,MAAM,EAAE,CAAC;AACjB,CAAC,CAAC,CAAC;AAEL,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAC7B,iDAAiD;IACjD,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;AAC7B,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QAC7C,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/generated/schemas.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAygE/C,CAAC;AAEX,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA6YnD,CAAC;AAEX,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA4OzD,CAAC"}
|