@evercam/mcp 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 +1017 -0
- package/dist/bin/evercam-mcp.d.ts +3 -0
- package/dist/bin/evercam-mcp.d.ts.map +1 -0
- package/dist/bin/evercam-mcp.js +87 -0
- package/dist/bin/evercam-mcp.js.map +1 -0
- package/dist/src/auth/auth.d.ts +9 -0
- package/dist/src/auth/auth.d.ts.map +1 -0
- package/dist/src/auth/auth.js +44 -0
- package/dist/src/auth/auth.js.map +1 -0
- package/dist/src/auth/tokenStore.d.ts +9 -0
- package/dist/src/auth/tokenStore.d.ts.map +1 -0
- package/dist/src/auth/tokenStore.js +42 -0
- package/dist/src/auth/tokenStore.js.map +1 -0
- package/dist/src/cli/auth.d.ts +13 -0
- package/dist/src/cli/auth.d.ts.map +1 -0
- package/dist/src/cli/auth.js +98 -0
- package/dist/src/cli/auth.js.map +1 -0
- package/dist/src/cli/doctor.d.ts +4 -0
- package/dist/src/cli/doctor.d.ts.map +1 -0
- package/dist/src/cli/doctor.js +54 -0
- package/dist/src/cli/doctor.js.map +1 -0
- package/dist/src/cli/profile.d.ts +10 -0
- package/dist/src/cli/profile.d.ts.map +1 -0
- package/dist/src/cli/profile.js +53 -0
- package/dist/src/cli/profile.js.map +1 -0
- package/dist/src/cli/run.d.ts +5 -0
- package/dist/src/cli/run.d.ts.map +1 -0
- package/dist/src/cli/run.js +63 -0
- package/dist/src/cli/run.js.map +1 -0
- package/dist/src/cli/serve.d.ts +13 -0
- package/dist/src/cli/serve.d.ts.map +1 -0
- package/dist/src/cli/serve.js +58 -0
- package/dist/src/cli/serve.js.map +1 -0
- package/dist/src/cli/tools.d.ts +3 -0
- package/dist/src/cli/tools.d.ts.map +1 -0
- package/dist/src/cli/tools.js +151 -0
- package/dist/src/cli/tools.js.map +1 -0
- package/dist/src/config/env.d.ts +3 -0
- package/dist/src/config/env.d.ts.map +1 -0
- package/dist/src/config/env.js +17 -0
- package/dist/src/config/env.js.map +1 -0
- package/dist/src/config/profiles.d.ts +17 -0
- package/dist/src/config/profiles.d.ts.map +1 -0
- package/dist/src/config/profiles.js +56 -0
- package/dist/src/config/profiles.js.map +1 -0
- package/dist/src/index.d.ts +7 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +7 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/server.d.ts +8 -0
- package/dist/src/server.d.ts.map +1 -0
- package/dist/src/server.js +23 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/tools/anpr.d.ts +4 -0
- package/dist/src/tools/anpr.d.ts.map +1 -0
- package/dist/src/tools/anpr.js +75 -0
- package/dist/src/tools/anpr.js.map +1 -0
- package/dist/src/tools/bim.d.ts +4 -0
- package/dist/src/tools/bim.d.ts.map +1 -0
- package/dist/src/tools/bim.js +24 -0
- package/dist/src/tools/bim.js.map +1 -0
- package/dist/src/tools/cameras.d.ts +4 -0
- package/dist/src/tools/cameras.d.ts.map +1 -0
- package/dist/src/tools/cameras.js +31 -0
- package/dist/src/tools/cameras.js.map +1 -0
- package/dist/src/tools/copilot.d.ts +4 -0
- package/dist/src/tools/copilot.d.ts.map +1 -0
- package/dist/src/tools/copilot.js +58 -0
- package/dist/src/tools/copilot.js.map +1 -0
- package/dist/src/tools/detections.d.ts +4 -0
- package/dist/src/tools/detections.d.ts.map +1 -0
- package/dist/src/tools/detections.js +40 -0
- package/dist/src/tools/detections.js.map +1 -0
- package/dist/src/tools/index.d.ts +4 -0
- package/dist/src/tools/index.d.ts.map +1 -0
- package/dist/src/tools/index.js +31 -0
- package/dist/src/tools/index.js.map +1 -0
- package/dist/src/tools/media.d.ts +4 -0
- package/dist/src/tools/media.d.ts.map +1 -0
- package/dist/src/tools/media.js +38 -0
- package/dist/src/tools/media.js.map +1 -0
- package/dist/src/tools/mutations.d.ts +8 -0
- package/dist/src/tools/mutations.d.ts.map +1 -0
- package/dist/src/tools/mutations.js +41 -0
- package/dist/src/tools/mutations.js.map +1 -0
- package/dist/src/tools/notifications.d.ts +4 -0
- package/dist/src/tools/notifications.d.ts.map +1 -0
- package/dist/src/tools/notifications.js +21 -0
- package/dist/src/tools/notifications.js.map +1 -0
- package/dist/src/tools/progressPhotos.d.ts +4 -0
- package/dist/src/tools/progressPhotos.d.ts.map +1 -0
- package/dist/src/tools/progressPhotos.js +36 -0
- package/dist/src/tools/progressPhotos.js.map +1 -0
- package/dist/src/tools/projects.d.ts +4 -0
- package/dist/src/tools/projects.d.ts.map +1 -0
- package/dist/src/tools/projects.js +56 -0
- package/dist/src/tools/projects.js.map +1 -0
- package/dist/src/tools/ptz.d.ts +4 -0
- package/dist/src/tools/ptz.d.ts.map +1 -0
- package/dist/src/tools/ptz.js +38 -0
- package/dist/src/tools/ptz.js.map +1 -0
- package/dist/src/tools/shares.d.ts +4 -0
- package/dist/src/tools/shares.d.ts.map +1 -0
- package/dist/src/tools/shares.js +11 -0
- package/dist/src/tools/shares.js.map +1 -0
- package/dist/src/tools/siteAnalytics.d.ts +4 -0
- package/dist/src/tools/siteAnalytics.d.ts.map +1 -0
- package/dist/src/tools/siteAnalytics.js +51 -0
- package/dist/src/tools/siteAnalytics.js.map +1 -0
- package/dist/src/tools/snapshots.d.ts +4 -0
- package/dist/src/tools/snapshots.d.ts.map +1 -0
- package/dist/src/tools/snapshots.js +83 -0
- package/dist/src/tools/snapshots.js.map +1 -0
- package/dist/src/tools/weather.d.ts +4 -0
- package/dist/src/tools/weather.d.ts.map +1 -0
- package/dist/src/tools/weather.js +11 -0
- package/dist/src/tools/weather.js.map +1 -0
- package/dist/src/transports/http.d.ts +24 -0
- package/dist/src/transports/http.d.ts.map +1 -0
- package/dist/src/transports/http.js +373 -0
- package/dist/src/transports/http.js.map +1 -0
- package/dist/src/transports/stdio.d.ts +3 -0
- package/dist/src/transports/stdio.d.ts.map +1 -0
- package/dist/src/transports/stdio.js +6 -0
- package/dist/src/transports/stdio.js.map +1 -0
- package/dist/src/utils/callTool.d.ts +18 -0
- package/dist/src/utils/callTool.d.ts.map +1 -0
- package/dist/src/utils/callTool.js +54 -0
- package/dist/src/utils/callTool.js.map +1 -0
- package/dist/src/utils/errors.d.ts +7 -0
- package/dist/src/utils/errors.d.ts.map +1 -0
- package/dist/src/utils/errors.js +70 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/logger.d.ts +10 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +4 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/retry.d.ts +12 -0
- package/dist/src/utils/retry.d.ts.map +1 -0
- package/dist/src/utils/retry.js +29 -0
- package/dist/src/utils/retry.js.map +1 -0
- package/dist/src/utils/toolOutput.d.ts +21 -0
- package/dist/src/utils/toolOutput.d.ts.map +1 -0
- package/dist/src/utils/toolOutput.js +35 -0
- package/dist/src/utils/toolOutput.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evercam-mcp.d.ts","sourceRoot":"","sources":["../../bin/evercam-mcp.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAA"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import "dotenv/config";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import { authLogin, authRelogin, authLogout, authStatus } from "../src/cli/auth.js";
|
|
5
|
+
import { profileList, profileAdd, profileSwitch, profileDelete } from "../src/cli/profile.js";
|
|
6
|
+
import { toolsList } from "../src/cli/tools.js";
|
|
7
|
+
import { runTool } from "../src/cli/run.js";
|
|
8
|
+
import { serve } from "../src/cli/serve.js";
|
|
9
|
+
import { doctor } from "../src/cli/doctor.js";
|
|
10
|
+
const program = new Command();
|
|
11
|
+
program.name("evercam-mcp").description("MCP server + CLI for Evercam").version("0.1.0");
|
|
12
|
+
// auth
|
|
13
|
+
const auth = program.command("auth").description("Authentication commands");
|
|
14
|
+
auth
|
|
15
|
+
.command("login")
|
|
16
|
+
.description("Log in to Evercam")
|
|
17
|
+
.option("--profile <name>", "Profile to use", "default")
|
|
18
|
+
.action(authLogin);
|
|
19
|
+
auth
|
|
20
|
+
.command("logout")
|
|
21
|
+
.description("Log out of Evercam")
|
|
22
|
+
.option("--profile <name>", "Profile to use", "default")
|
|
23
|
+
.action(authLogout);
|
|
24
|
+
auth
|
|
25
|
+
.command("relogin")
|
|
26
|
+
.description("Prompt credentials and replace the stored token")
|
|
27
|
+
.option("--profile <name>", "Profile to use", "default")
|
|
28
|
+
.action(authRelogin);
|
|
29
|
+
auth
|
|
30
|
+
.command("status")
|
|
31
|
+
.description("Show authentication status")
|
|
32
|
+
.option("--profile <name>", "Profile to check", "default")
|
|
33
|
+
.action(authStatus);
|
|
34
|
+
// profile
|
|
35
|
+
const profile = program.command("profile").description("Profile management");
|
|
36
|
+
profile.command("list").description("List all profiles").action(profileList);
|
|
37
|
+
profile
|
|
38
|
+
.command("add <name>")
|
|
39
|
+
.description("Add a new profile")
|
|
40
|
+
.option("--base-url <url>", "Evercam backend URL")
|
|
41
|
+
.option("--ai-url <url>", "Evercam AI API URL")
|
|
42
|
+
.option("--labs-url <url>", "Evercam Labs URL")
|
|
43
|
+
.option("--ingest-url <url>", "Evercam Ingest URL")
|
|
44
|
+
.action(profileAdd);
|
|
45
|
+
profile.command("switch <name>").description("Switch active profile").action(profileSwitch);
|
|
46
|
+
profile
|
|
47
|
+
.command("delete <name>")
|
|
48
|
+
.description("Delete a profile and its stored token")
|
|
49
|
+
.action(profileDelete);
|
|
50
|
+
// tools
|
|
51
|
+
const tools = program.command("tools").description("Tool discovery");
|
|
52
|
+
tools.command("list").description("List all available MCP tools").action(toolsList);
|
|
53
|
+
// run
|
|
54
|
+
program
|
|
55
|
+
.command("run <tool> [args...]")
|
|
56
|
+
.description("Run a tool directly (args as key=value pairs)")
|
|
57
|
+
.option("--profile <name>", "Profile to use", "default")
|
|
58
|
+
.option("--format <format>", "Output format: json or table", "json")
|
|
59
|
+
.action((tool, args, options) => runTool(tool, args, options));
|
|
60
|
+
// serve
|
|
61
|
+
program
|
|
62
|
+
.command("serve")
|
|
63
|
+
.description("Start the MCP server")
|
|
64
|
+
.option("--transport <type>", "Transport: stdio or http", "stdio")
|
|
65
|
+
.option("--port <number>", "HTTP port (http transport only)", "4004")
|
|
66
|
+
.option("--profile <name>", "Profile to use", "default")
|
|
67
|
+
.option("--allowed-origins <origins>", "CORS allowed origins (comma-separated or *)", "*")
|
|
68
|
+
.option("--timeout <ms>", "Tool call timeout in milliseconds (http transport)", "30000")
|
|
69
|
+
.option("--api-key <key>", "Require Authorization: ApiKey <key> on HTTP endpoints")
|
|
70
|
+
.option("--allowed-tools <tools>", "Comma-separated tool allowlist for HTTP REST endpoint")
|
|
71
|
+
.option("--denied-tools <tools>", "Comma-separated tool denylist for HTTP REST endpoint")
|
|
72
|
+
.option("--rate-limit <number>", "Max POST /tools requests per minute per IP", "60")
|
|
73
|
+
.option("--enable-mutations", "Enable mutating tools (create/update/delete/actions). Disabled by default.")
|
|
74
|
+
.action((options) => serve({
|
|
75
|
+
...options,
|
|
76
|
+
port: parseInt(options.port, 10),
|
|
77
|
+
timeout: parseInt(options.timeout, 10),
|
|
78
|
+
rateLimit: parseInt(options.rateLimit, 10),
|
|
79
|
+
}));
|
|
80
|
+
// doctor
|
|
81
|
+
program
|
|
82
|
+
.command("doctor")
|
|
83
|
+
.description("Check authentication, config, and API connectivity")
|
|
84
|
+
.option("--profile <name>", "Profile to check", "default")
|
|
85
|
+
.action((options) => doctor(options));
|
|
86
|
+
program.parse();
|
|
87
|
+
//# sourceMappingURL=evercam-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evercam-mcp.js","sourceRoot":"","sources":["../../bin/evercam-mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function login(username: string, password: string, profile?: string): Promise<string>;
|
|
2
|
+
export declare function logout(profile?: string): Promise<void>;
|
|
3
|
+
export declare function getAuthStatus(profile?: string): {
|
|
4
|
+
loggedIn: boolean;
|
|
5
|
+
profile: string;
|
|
6
|
+
token: string | null;
|
|
7
|
+
tokenAgeDays: number | null;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/auth/auth.ts"],"names":[],"mappings":"AAKA,wBAAsB,KAAK,CACzB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,SAAY,GAClB,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED,wBAAsB,MAAM,CAAC,OAAO,SAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAY/D;AAED,wBAAgB,aAAa,CAAC,OAAO,SAAY,GAAG;IAClD,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B,CAQA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Evercam } from "@evercam/sdk";
|
|
2
|
+
import { setToken, clearToken, getToken, getTokenAge } from "./tokenStore.js";
|
|
3
|
+
import { resolveConfig } from "../config/env.js";
|
|
4
|
+
import { normalizeError } from "../utils/errors.js";
|
|
5
|
+
export async function login(username, password, profile = "default") {
|
|
6
|
+
const config = resolveConfig(profile);
|
|
7
|
+
const evercam = new Evercam({
|
|
8
|
+
...config,
|
|
9
|
+
credentials: { username, password },
|
|
10
|
+
});
|
|
11
|
+
try {
|
|
12
|
+
await evercam.connect();
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
throw new Error(normalizeError(err).message);
|
|
16
|
+
}
|
|
17
|
+
const token = evercam.token;
|
|
18
|
+
if (!token) {
|
|
19
|
+
throw new Error("Login succeeded but no token was returned");
|
|
20
|
+
}
|
|
21
|
+
setToken(token, profile);
|
|
22
|
+
return token;
|
|
23
|
+
}
|
|
24
|
+
export async function logout(profile = "default") {
|
|
25
|
+
const token = getToken(profile);
|
|
26
|
+
if (token) {
|
|
27
|
+
const evercam = new Evercam({
|
|
28
|
+
...resolveConfig(profile),
|
|
29
|
+
credentials: { token },
|
|
30
|
+
});
|
|
31
|
+
await evercam.disconnect().catch(() => { });
|
|
32
|
+
}
|
|
33
|
+
clearToken(profile);
|
|
34
|
+
}
|
|
35
|
+
export function getAuthStatus(profile = "default") {
|
|
36
|
+
const token = getToken(profile);
|
|
37
|
+
return {
|
|
38
|
+
loggedIn: !!token,
|
|
39
|
+
profile,
|
|
40
|
+
token: token ? `${token.slice(0, 6)}...${token.slice(-4)}` : null,
|
|
41
|
+
tokenAgeDays: token ? getTokenAge(profile) : null,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/auth/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEnD,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,QAAgB,EAChB,QAAgB,EAChB,OAAO,GAAG,SAAS;IAEnB,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IACrC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;QAC1B,GAAG,MAAM;QACT,WAAW,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;KACpC,CAAC,CAAA;IAEF,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAA;IAC9C,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;IAE3B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;IAC9D,CAAC;IAED,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACxB,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAO,GAAG,SAAS;IAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;IAE/B,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;YAC1B,GAAG,aAAa,CAAC,OAAO,CAAC;YACzB,WAAW,EAAE,EAAE,KAAK,EAAE;SACvB,CAAC,CAAA;QACF,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAC5C,CAAC;IAED,UAAU,CAAC,OAAO,CAAC,CAAA;AACrB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAO,GAAG,SAAS;IAM/C,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC/B,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,KAAK;QACjB,OAAO;QACP,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;QACjE,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI;KAClD,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function getToken(profile?: string): string | undefined;
|
|
2
|
+
export declare function setToken(token: string, profile?: string): void;
|
|
3
|
+
export declare function clearToken(profile?: string): void;
|
|
4
|
+
/**
|
|
5
|
+
* Returns token age in days for the given profile.
|
|
6
|
+
* Returns null if the entry uses the legacy string format (savedAt unknown).
|
|
7
|
+
*/
|
|
8
|
+
export declare function getTokenAge(profile?: string): number | null;
|
|
9
|
+
//# sourceMappingURL=tokenStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenStore.d.ts","sourceRoot":"","sources":["../../../src/auth/tokenStore.ts"],"names":[],"mappings":"AAyBA,wBAAgB,QAAQ,CAAC,OAAO,SAAY,GAAG,MAAM,GAAG,SAAS,CAIhE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAY,GAAG,IAAI,CAIjE;AAED,wBAAgB,UAAU,CAAC,OAAO,SAAY,GAAG,IAAI,CAIpD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,SAAY,GAAG,MAAM,GAAG,IAAI,CAK9D"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
const CONFIG_DIR = path.join(os.homedir(), ".evercam");
|
|
5
|
+
const TOKENS_FILE = path.join(CONFIG_DIR, "tokens.json");
|
|
6
|
+
function readTokens() {
|
|
7
|
+
if (!fs.existsSync(TOKENS_FILE))
|
|
8
|
+
return {};
|
|
9
|
+
return JSON.parse(fs.readFileSync(TOKENS_FILE, "utf-8"));
|
|
10
|
+
}
|
|
11
|
+
function writeTokens(tokens) {
|
|
12
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
13
|
+
fs.writeFileSync(TOKENS_FILE, JSON.stringify(tokens, null, 2), { mode: 0o600 });
|
|
14
|
+
}
|
|
15
|
+
export function getToken(profile = "default") {
|
|
16
|
+
const entry = readTokens()[profile];
|
|
17
|
+
if (!entry)
|
|
18
|
+
return undefined;
|
|
19
|
+
return typeof entry === "string" ? entry : entry.token;
|
|
20
|
+
}
|
|
21
|
+
export function setToken(token, profile = "default") {
|
|
22
|
+
const tokens = readTokens();
|
|
23
|
+
tokens[profile] = { token, savedAt: Date.now() };
|
|
24
|
+
writeTokens(tokens);
|
|
25
|
+
}
|
|
26
|
+
export function clearToken(profile = "default") {
|
|
27
|
+
const tokens = readTokens();
|
|
28
|
+
delete tokens[profile];
|
|
29
|
+
writeTokens(tokens);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Returns token age in days for the given profile.
|
|
33
|
+
* Returns null if the entry uses the legacy string format (savedAt unknown).
|
|
34
|
+
*/
|
|
35
|
+
export function getTokenAge(profile = "default") {
|
|
36
|
+
const entry = readTokens()[profile];
|
|
37
|
+
if (!entry || typeof entry === "string")
|
|
38
|
+
return null;
|
|
39
|
+
const ageMs = Date.now() - entry.savedAt;
|
|
40
|
+
return Math.floor(ageMs / (1000 * 60 * 60 * 24));
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=tokenStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenStore.js","sourceRoot":"","sources":["../../../src/auth/tokenStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAA;AACtD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;AAUxD,SAAS,UAAU;IACjB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAA;IAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAe,CAAA;AACxE,CAAC;AAED,SAAS,WAAW,CAAC,MAAkB;IACrC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;AACjF,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAO,GAAG,SAAS;IAC1C,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC,OAAO,CAAC,CAAA;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAA;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAA;AACxD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,OAAO,GAAG,SAAS;IACzD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;IAChD,WAAW,CAAC,MAAM,CAAC,CAAA;AACrB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAO,GAAG,SAAS;IAC5C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,OAAO,MAAM,CAAC,OAAO,CAAC,CAAA;IACtB,WAAW,CAAC,MAAM,CAAC,CAAA;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,OAAO,GAAG,SAAS;IAC7C,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC,OAAO,CAAC,CAAA;IACnC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,OAAO,CAAA;IACxC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;AAClD,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare function authLogin(options: {
|
|
2
|
+
profile?: string;
|
|
3
|
+
}): Promise<void>;
|
|
4
|
+
export declare function authRelogin(options: {
|
|
5
|
+
profile?: string;
|
|
6
|
+
}): Promise<void>;
|
|
7
|
+
export declare function authLogout(options: {
|
|
8
|
+
profile?: string;
|
|
9
|
+
}): Promise<void>;
|
|
10
|
+
export declare function authStatus(options: {
|
|
11
|
+
profile?: string;
|
|
12
|
+
}): void;
|
|
13
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/cli/auth.ts"],"names":[],"mappings":"AAuCA,wBAAsB,SAAS,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5E;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9E;AAoCD,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7E;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiB9D"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import * as readline from "node:readline/promises";
|
|
3
|
+
import { stdin as input, stdout as output } from "node:process";
|
|
4
|
+
import { login, logout, getAuthStatus } from "../auth/auth.js";
|
|
5
|
+
import { normalizeError } from "../utils/errors.js";
|
|
6
|
+
function readPassword(prompt) {
|
|
7
|
+
return new Promise((resolve) => {
|
|
8
|
+
output.write(prompt);
|
|
9
|
+
let password = "";
|
|
10
|
+
input.setRawMode(true);
|
|
11
|
+
input.resume();
|
|
12
|
+
input.setEncoding("utf8");
|
|
13
|
+
const onData = (char) => {
|
|
14
|
+
if (char === "\r" || char === "\n") {
|
|
15
|
+
input.setRawMode(false);
|
|
16
|
+
input.pause();
|
|
17
|
+
input.removeListener("data", onData);
|
|
18
|
+
output.write("\n");
|
|
19
|
+
resolve(password);
|
|
20
|
+
}
|
|
21
|
+
else if (char === "\u0003") {
|
|
22
|
+
input.setRawMode(false);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
else if (char === "\u007f" || char === "\b") {
|
|
26
|
+
if (password.length > 0) {
|
|
27
|
+
password = password.slice(0, -1);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
password += char;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
input.on("data", onData);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
export async function authLogin(options) {
|
|
38
|
+
await runAuthLogin(options, "Logged in successfully");
|
|
39
|
+
}
|
|
40
|
+
export async function authRelogin(options) {
|
|
41
|
+
await runAuthLogin(options, "Re-authenticated successfully");
|
|
42
|
+
}
|
|
43
|
+
async function runAuthLogin(options, successMessage) {
|
|
44
|
+
const profile = options.profile ?? "default";
|
|
45
|
+
const rl = readline.createInterface({ input, output });
|
|
46
|
+
try {
|
|
47
|
+
const maxAttempts = 3;
|
|
48
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
49
|
+
const username = await rl.question("Username or email: ");
|
|
50
|
+
const password = await readPassword("Password: ");
|
|
51
|
+
console.log(chalk.dim("Connecting to Evercam..."));
|
|
52
|
+
try {
|
|
53
|
+
await login(username, password, profile);
|
|
54
|
+
console.log(chalk.green(`✓ ${successMessage} (profile: ${profile})`));
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
const message = normalizeError(err).message;
|
|
59
|
+
if (attempt < maxAttempts) {
|
|
60
|
+
console.error(chalk.yellow(`✗ Login failed (${attempt}/${maxAttempts}): ${message}`));
|
|
61
|
+
console.log(chalk.dim("Try again.\n"));
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
console.error(chalk.red(`✗ Login failed (${attempt}/${maxAttempts}): ${message}`));
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
console.error(chalk.red(`✗ Login failed: ${normalizeError(err).message}`));
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
rl.close();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export async function authLogout(options) {
|
|
78
|
+
const profile = options.profile ?? "default";
|
|
79
|
+
await logout(profile);
|
|
80
|
+
console.log(chalk.green(`✓ Logged out (profile: ${profile})`));
|
|
81
|
+
}
|
|
82
|
+
export function authStatus(options) {
|
|
83
|
+
const profile = options.profile ?? "default";
|
|
84
|
+
const status = getAuthStatus(profile);
|
|
85
|
+
if (status.loggedIn) {
|
|
86
|
+
console.log(chalk.green(`✓ Logged in`));
|
|
87
|
+
console.log(` Profile: ${status.profile}`);
|
|
88
|
+
console.log(` Token: ${status.token}`);
|
|
89
|
+
if (status.tokenAgeDays !== null && status.tokenAgeDays > 25) {
|
|
90
|
+
console.log(chalk.yellow(` ⚠ Token is ${status.tokenAgeDays} days old — consider re-authenticating`));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
console.log(chalk.yellow(`✗ Not logged in (profile: ${status.profile})`));
|
|
95
|
+
console.log(` Run: evercam-mcp auth login`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEnD,SAAS,YAAY,CAAC,MAAc;IAClC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAEpB,IAAI,QAAQ,GAAG,EAAE,CAAA;QAEjB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACtB,KAAK,CAAC,MAAM,EAAE,CAAA;QACd,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;QAEzB,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;YAC9B,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACnC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;gBACvB,KAAK,CAAC,KAAK,EAAE,CAAA;gBACb,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;gBACpC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBAClB,OAAO,CAAC,QAAQ,CAAC,CAAA;YACnB,CAAC;iBAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;gBACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;iBAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC9C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxB,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;gBAClC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,QAAQ,IAAI,IAAI,CAAA;YAClB,CAAC;QACH,CAAC,CAAA;QAED,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1B,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAA6B;IAC3D,MAAM,YAAY,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAA;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA6B;IAC7D,MAAM,YAAY,CAAC,OAAO,EAAE,+BAA+B,CAAC,CAAA;AAC9D,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,OAA6B,EAAE,cAAsB;IAC/E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,SAAS,CAAA;IAC5C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;IAEtD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,CAAC,CAAA;QACrB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YACxD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAA;YACzD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,CAAA;YAEjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAA;YAClD,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;gBACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,cAAc,cAAc,OAAO,GAAG,CAAC,CAAC,CAAA;gBACrE,OAAM;YACR,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,CAAA;gBAC3C,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;oBAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,OAAO,IAAI,WAAW,MAAM,OAAO,EAAE,CAAC,CAAC,CAAA;oBACrF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAA;oBACtC,SAAQ;gBACV,CAAC;gBACD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,OAAO,IAAI,WAAW,MAAM,OAAO,EAAE,CAAC,CAAC,CAAA;gBAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAA;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAA6B;IAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,SAAS,CAAA;IAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,CAAA;IACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,OAAO,GAAG,CAAC,CAAC,CAAA;AAChE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAA6B;IACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,SAAS,CAAA;IAC5C,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IAErC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAA;QACvC,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;QAC3C,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;QACzC,IAAI,MAAM,CAAC,YAAY,KAAK,IAAI,IAAI,MAAM,CAAC,YAAY,GAAG,EAAE,EAAE,CAAC;YAC7D,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,gBAAgB,MAAM,CAAC,YAAY,wCAAwC,CAAC,CAC1F,CAAA;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6BAA6B,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,CAAA;QACzE,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAA;IAC9C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/doctor.ts"],"names":[],"mappings":"AAQA,wBAAsB,MAAM,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDzE"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { Evercam } from "@evercam/sdk";
|
|
3
|
+
import { getAuthStatus } from "../auth/auth.js";
|
|
4
|
+
import { getToken, getTokenAge } from "../auth/tokenStore.js";
|
|
5
|
+
import { resolveConfig } from "../config/env.js";
|
|
6
|
+
import { TOOL_DESCRIPTIONS } from "./tools.js";
|
|
7
|
+
import { normalizeError } from "../utils/errors.js";
|
|
8
|
+
export async function doctor(options) {
|
|
9
|
+
const profile = options.profile ?? "default";
|
|
10
|
+
console.log(chalk.bold("\nevercam-mcp doctor\n"));
|
|
11
|
+
// 1. Auth check
|
|
12
|
+
const status = getAuthStatus(profile);
|
|
13
|
+
if (status.loggedIn) {
|
|
14
|
+
console.log(chalk.green("✓ Authenticated"), chalk.dim(`(profile: ${profile}, token: ${status.token})`));
|
|
15
|
+
const age = getTokenAge(profile);
|
|
16
|
+
if (age === null) {
|
|
17
|
+
console.log(chalk.dim(" ℹ Token age unknown (legacy format — re-login to track age)"));
|
|
18
|
+
}
|
|
19
|
+
else if (age > 60) {
|
|
20
|
+
console.log(chalk.red(` ✗ Token is ${age} days old — re-authenticate now`));
|
|
21
|
+
}
|
|
22
|
+
else if (age > 25) {
|
|
23
|
+
console.log(chalk.yellow(` ⚠ Token is ${age} days old — consider re-authenticating`));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
console.log(chalk.red("✗ Not authenticated"), chalk.dim(`— run: evercam-mcp auth login`));
|
|
28
|
+
}
|
|
29
|
+
// 2. Config check
|
|
30
|
+
const config = resolveConfig(profile);
|
|
31
|
+
console.log(chalk.green("✓ Config resolved"));
|
|
32
|
+
console.log(chalk.dim(` Base URL: ${config.baseUrls?.baseUrl ?? "(sdk default)"}`));
|
|
33
|
+
console.log(chalk.dim(` AI URL: ${config.baseUrls?.aiApiUrl ?? "(sdk default)"}`));
|
|
34
|
+
console.log(chalk.dim(` Labs URL: ${config.baseUrls?.evercamLabsUrl ?? "(sdk default)"}`));
|
|
35
|
+
// 3. API connectivity (only if authenticated)
|
|
36
|
+
if (status.loggedIn) {
|
|
37
|
+
const token = getToken(profile);
|
|
38
|
+
process.stdout.write(" Checking API connectivity... ");
|
|
39
|
+
try {
|
|
40
|
+
const evercam = new Evercam(config);
|
|
41
|
+
evercam.setToken(token);
|
|
42
|
+
await evercam.api.projects.index();
|
|
43
|
+
console.log(chalk.green("✓ Evercam API reachable"));
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
console.log(chalk.red(`✗ Evercam API unreachable — ${normalizeError(err).message}`));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// 4. Tool count
|
|
50
|
+
const count = Object.keys(TOOL_DESCRIPTIONS).length;
|
|
51
|
+
console.log(chalk.green(`✓ ${count} tools registered`));
|
|
52
|
+
console.log();
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function profileList(): void;
|
|
2
|
+
export declare function profileAdd(name: string, options: {
|
|
3
|
+
baseUrl?: string;
|
|
4
|
+
aiUrl?: string;
|
|
5
|
+
labsUrl?: string;
|
|
6
|
+
ingestUrl?: string;
|
|
7
|
+
}): void;
|
|
8
|
+
export declare function profileSwitch(name: string): void;
|
|
9
|
+
export declare function profileDelete(name: string): void;
|
|
10
|
+
//# sourceMappingURL=profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../src/cli/profile.ts"],"names":[],"mappings":"AAKA,wBAAgB,WAAW,IAAI,IAAI,CAoBlC;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACP,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,GACA,IAAI,CAQN;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAQhD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAShD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { listProfiles, addProfile, switchProfile, deleteProfile } from "../config/profiles.js";
|
|
3
|
+
import { clearToken } from "../auth/tokenStore.js";
|
|
4
|
+
import { normalizeError } from "../utils/errors.js";
|
|
5
|
+
export function profileList() {
|
|
6
|
+
const profiles = listProfiles();
|
|
7
|
+
if (profiles.length === 0) {
|
|
8
|
+
console.log(chalk.dim("No profiles configured."));
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
for (const p of profiles) {
|
|
12
|
+
const marker = p.active ? chalk.green("● ") : " ";
|
|
13
|
+
const urls = [
|
|
14
|
+
p.config.baseUrl && `backend: ${p.config.baseUrl}`,
|
|
15
|
+
p.config.aiApiUrl && `ai: ${p.config.aiApiUrl}`,
|
|
16
|
+
p.config.evercamLabsUrl && `labs: ${p.config.evercamLabsUrl}`,
|
|
17
|
+
]
|
|
18
|
+
.filter(Boolean)
|
|
19
|
+
.join(", ");
|
|
20
|
+
console.log(`${marker}${chalk.bold(p.name)}${urls ? chalk.dim(` (${urls})`) : ""}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function profileAdd(name, options) {
|
|
24
|
+
addProfile(name, {
|
|
25
|
+
baseUrl: options.baseUrl,
|
|
26
|
+
aiApiUrl: options.aiUrl,
|
|
27
|
+
evercamLabsUrl: options.labsUrl,
|
|
28
|
+
ingestApiUrl: options.ingestUrl,
|
|
29
|
+
});
|
|
30
|
+
console.log(chalk.green(`✓ Profile "${name}" added`));
|
|
31
|
+
}
|
|
32
|
+
export function profileSwitch(name) {
|
|
33
|
+
try {
|
|
34
|
+
switchProfile(name);
|
|
35
|
+
console.log(chalk.green(`✓ Switched to profile "${name}"`));
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
console.error(chalk.red(`✗ ${normalizeError(err).message}`));
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function profileDelete(name) {
|
|
43
|
+
try {
|
|
44
|
+
deleteProfile(name);
|
|
45
|
+
clearToken(name);
|
|
46
|
+
console.log(chalk.green(`✓ Profile "${name}" deleted`));
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
console.error(chalk.red(`✗ ${normalizeError(err).message}`));
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../../src/cli/profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/run.ts"],"names":[],"mappings":"AA8BA,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAAC,IAAI,CAAC,CAiCf"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { createEvercamMcpServer } from "../server.js";
|
|
3
|
+
import { resolveConfig } from "../config/env.js";
|
|
4
|
+
import { callToolDirect } from "../utils/callTool.js";
|
|
5
|
+
import { normalizeError } from "../utils/errors.js";
|
|
6
|
+
function parseArgs(args) {
|
|
7
|
+
const result = {};
|
|
8
|
+
for (const arg of args) {
|
|
9
|
+
const [key, ...rest] = arg.split("=");
|
|
10
|
+
const value = rest.join("=");
|
|
11
|
+
const cleanKey = key.replace(/^--/, "");
|
|
12
|
+
if (value === "true") {
|
|
13
|
+
result[cleanKey] = true;
|
|
14
|
+
}
|
|
15
|
+
else if (value === "false") {
|
|
16
|
+
result[cleanKey] = false;
|
|
17
|
+
}
|
|
18
|
+
else if (!isNaN(Number(value)) && value !== "") {
|
|
19
|
+
result[cleanKey] = Number(value);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
try {
|
|
23
|
+
result[cleanKey] = JSON.parse(value);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
result[cleanKey] = value;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
export async function runTool(toolName, rawArgs, options) {
|
|
33
|
+
const config = resolveConfig(options.profile);
|
|
34
|
+
if (!config.credentials?.token) {
|
|
35
|
+
console.error(chalk.red("✗ Not authenticated. Run: evercam-mcp auth login"));
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
const args = parseArgs(rawArgs);
|
|
39
|
+
const { server } = await createEvercamMcpServer(config);
|
|
40
|
+
try {
|
|
41
|
+
const result = await callToolDirect(server, toolName, args);
|
|
42
|
+
const text = result?.content?.[0]?.text ?? JSON.stringify(result, null, 2);
|
|
43
|
+
if (options.format === "table") {
|
|
44
|
+
try {
|
|
45
|
+
const parsed = JSON.parse(text);
|
|
46
|
+
const rows = Array.isArray(parsed)
|
|
47
|
+
? parsed
|
|
48
|
+
: (parsed?.data ?? parsed?.items ?? parsed?.cameras ?? parsed?.projects ?? [parsed]);
|
|
49
|
+
console.table(rows);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// fall through to JSON
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
console.log(text);
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
console.error(chalk.red(`✗ Tool "${toolName}" failed: ${normalizeError(err).message}`));
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEnD,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,MAAM,GAA4B,EAAE,CAAA;IAC1C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QAEvC,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAA;QACzB,CAAC;aAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YAC7B,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAA;QAC1B,CAAC;aAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACjD,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;QAClC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAA;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,QAAgB,EAChB,OAAiB,EACjB,OAA8C;IAE9C,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAE7C,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC,CAAA;QAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;IAC/B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,sBAAsB,CAAC,MAAM,CAAC,CAAA;IAEvD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;QAC3D,MAAM,IAAI,GAAI,MAAc,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAEnF,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;oBAChC,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,IAAI,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,OAAO,IAAI,MAAM,EAAE,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;gBACtF,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBACnB,OAAM;YACR,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,QAAQ,aAAa,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare function serve(options: {
|
|
2
|
+
transport?: string;
|
|
3
|
+
port?: number;
|
|
4
|
+
profile?: string;
|
|
5
|
+
allowedOrigins?: string;
|
|
6
|
+
timeout?: number;
|
|
7
|
+
apiKey?: string;
|
|
8
|
+
allowedTools?: string;
|
|
9
|
+
deniedTools?: string;
|
|
10
|
+
rateLimit?: number;
|
|
11
|
+
enableMutations?: boolean;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=serve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../src/cli/serve.ts"],"names":[],"mappings":"AAOA,wBAAsB,KAAK,CAAC,OAAO,EAAE;IACnC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DhB"}
|