@stackable-labs/mcp-app-extension 0.24.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,108 +0,0 @@
1
- #!/usr/bin/env node
2
- import { mkdir, writeFile, readFile } from 'fs/promises';
3
- import { join } from 'path';
4
- import { homedir } from 'os';
5
-
6
- // ../../lib/utils-js/src/crypto.ts
7
- var getCrypto = () => {
8
- if (typeof globalThis !== "undefined" && globalThis.crypto) {
9
- return globalThis.crypto;
10
- }
11
- throw new Error("Web Crypto API not available \u2014 requires Node.js 22+ or a modern browser");
12
- };
13
- var getSubtle = () => {
14
- const crypto = getCrypto();
15
- if (crypto.subtle) {
16
- return crypto.subtle;
17
- }
18
- throw new Error("SubtleCrypto not available \u2014 requires a secure context (HTTPS) or Node.js 22+");
19
- };
20
- var encodeBytes = (bytes, encoding) => {
21
- if (encoding === "hex") {
22
- return [...bytes].map((b) => b.toString(16).padStart(2, "0")).join("");
23
- }
24
- const base64 = btoa(String.fromCharCode(...bytes));
25
- if (encoding === "base64url") {
26
- return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
27
- }
28
- return base64;
29
- };
30
- var getRandomBytes = (length, encoding = "base64") => {
31
- const bytes = new Uint8Array(length);
32
- getCrypto().getRandomValues(bytes);
33
- return encodeBytes(bytes, encoding);
34
- };
35
- var getDigest = async (input, encoding = "hex") => {
36
- const digest = await getSubtle().digest(
37
- "SHA-256",
38
- new TextEncoder().encode(input)
39
- );
40
- return encodeBytes(new Uint8Array(digest), encoding);
41
- };
42
- var getNonce = () => getRandomBytes(16, "base64url");
43
- var getVerifier = () => getRandomBytes(32, "base64url");
44
-
45
- // ../../lib/utils-auth/src/constants.ts
46
- var STANDALONE_CLIENT_DATA = {
47
- CLI: { name: "@stackable-labs/cli-app-extension", authFile: "cli-auth.json" },
48
- MCP: { name: "@stackable-labs/mcp-app-extension", authFile: "mcp-auth.json" }
49
- };
50
- var STANDALONE_CLIENT = Object.fromEntries(
51
- Object.entries(STANDALONE_CLIENT_DATA).map(([k, v]) => [k, v.name])
52
- );
53
- var STANDALONE_CLIENT_AUTH_FILE = Object.fromEntries(
54
- Object.entries(STANDALONE_CLIENT_DATA).map(([k, v]) => [k, v.authFile])
55
- );
56
- Object.values(STANDALONE_CLIENT);
57
-
58
- // ../../lib/contracts/src/custom.ts
59
- var CUSTOM_ROLE = {
60
- SUPER_ADMIN: "super_admin"
61
- };
62
- new Set(Object.values(CUSTOM_ROLE));
63
-
64
- // ../../lib/utils-auth/src/index.ts
65
- var deriveClientId = async (clientName) => (await getDigest(clientName)).slice(0, 32);
66
- var AUTH_DIR = join(homedir(), ".stackable");
67
- join(AUTH_DIR, STANDALONE_CLIENT_AUTH_FILE.CLI);
68
- var MCP_AUTH_FILE = join(AUTH_DIR, STANDALONE_CLIENT_AUTH_FILE.MCP);
69
- var resolveAuthFile = (filename) => join(AUTH_DIR, filename ?? STANDALONE_CLIENT_AUTH_FILE.CLI);
70
- var readAuthState = async (filename) => {
71
- try {
72
- const content = await readFile(resolveAuthFile(filename), "utf8");
73
- return JSON.parse(content);
74
- } catch {
75
- return null;
76
- }
77
- };
78
- var writeAuthState = async (state, filename) => {
79
- await mkdir(AUTH_DIR, { recursive: true, mode: 448 });
80
- await writeFile(resolveAuthFile(filename), JSON.stringify(state, null, 2), { mode: 384 });
81
- };
82
- var decodeJwtPayload = (token) => {
83
- try {
84
- const [, payload] = token.split(".");
85
- if (!payload) {
86
- return null;
87
- }
88
- const json = Buffer.from(payload, "base64url").toString("utf8");
89
- return JSON.parse(json);
90
- } catch {
91
- return null;
92
- }
93
- };
94
- var getToken = async (filename) => {
95
- const state = await readAuthState(filename);
96
- if (!state) {
97
- throw new Error("Not authenticated. Run `stackable-app-extension auth login` first.");
98
- }
99
- const payload = decodeJwtPayload(state.token);
100
- if (payload?.exp && typeof payload.exp === "number") {
101
- if (Date.now() >= payload.exp * 1e3) {
102
- throw new Error("Session expired. Run `stackable-app-extension auth login` to re-authenticate.");
103
- }
104
- }
105
- return state.token;
106
- };
107
-
108
- export { MCP_AUTH_FILE, STANDALONE_CLIENT, STANDALONE_CLIENT_AUTH_FILE, deriveClientId, getDigest, getNonce, getToken, getVerifier, writeAuthState };
@@ -1,107 +0,0 @@
1
- import { mkdir, writeFile, readFile } from 'fs/promises';
2
- import { join } from 'path';
3
- import { homedir } from 'os';
4
-
5
- // ../../lib/utils-js/src/crypto.ts
6
- var getCrypto = () => {
7
- if (typeof globalThis !== "undefined" && globalThis.crypto) {
8
- return globalThis.crypto;
9
- }
10
- throw new Error("Web Crypto API not available \u2014 requires Node.js 22+ or a modern browser");
11
- };
12
- var getSubtle = () => {
13
- const crypto = getCrypto();
14
- if (crypto.subtle) {
15
- return crypto.subtle;
16
- }
17
- throw new Error("SubtleCrypto not available \u2014 requires a secure context (HTTPS) or Node.js 22+");
18
- };
19
- var encodeBytes = (bytes, encoding) => {
20
- if (encoding === "hex") {
21
- return [...bytes].map((b) => b.toString(16).padStart(2, "0")).join("");
22
- }
23
- const base64 = btoa(String.fromCharCode(...bytes));
24
- if (encoding === "base64url") {
25
- return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
26
- }
27
- return base64;
28
- };
29
- var getRandomBytes = (length, encoding = "base64") => {
30
- const bytes = new Uint8Array(length);
31
- getCrypto().getRandomValues(bytes);
32
- return encodeBytes(bytes, encoding);
33
- };
34
- var getDigest = async (input, encoding = "hex") => {
35
- const digest = await getSubtle().digest(
36
- "SHA-256",
37
- new TextEncoder().encode(input)
38
- );
39
- return encodeBytes(new Uint8Array(digest), encoding);
40
- };
41
- var getNonce = () => getRandomBytes(16, "base64url");
42
- var getVerifier = () => getRandomBytes(32, "base64url");
43
-
44
- // ../../lib/utils-auth/src/constants.ts
45
- var STANDALONE_CLIENT_DATA = {
46
- CLI: { name: "@stackable-labs/cli-app-extension", authFile: "cli-auth.json" },
47
- MCP: { name: "@stackable-labs/mcp-app-extension", authFile: "mcp-auth.json" }
48
- };
49
- var STANDALONE_CLIENT = Object.fromEntries(
50
- Object.entries(STANDALONE_CLIENT_DATA).map(([k, v]) => [k, v.name])
51
- );
52
- var STANDALONE_CLIENT_AUTH_FILE = Object.fromEntries(
53
- Object.entries(STANDALONE_CLIENT_DATA).map(([k, v]) => [k, v.authFile])
54
- );
55
- Object.values(STANDALONE_CLIENT);
56
-
57
- // ../../lib/contracts/src/custom.ts
58
- var CUSTOM_ROLE = {
59
- SUPER_ADMIN: "super_admin"
60
- };
61
- new Set(Object.values(CUSTOM_ROLE));
62
-
63
- // ../../lib/utils-auth/src/index.ts
64
- var deriveClientId = async (clientName) => (await getDigest(clientName)).slice(0, 32);
65
- var AUTH_DIR = join(homedir(), ".stackable");
66
- join(AUTH_DIR, STANDALONE_CLIENT_AUTH_FILE.CLI);
67
- var MCP_AUTH_FILE = join(AUTH_DIR, STANDALONE_CLIENT_AUTH_FILE.MCP);
68
- var resolveAuthFile = (filename) => join(AUTH_DIR, filename ?? STANDALONE_CLIENT_AUTH_FILE.CLI);
69
- var readAuthState = async (filename) => {
70
- try {
71
- const content = await readFile(resolveAuthFile(filename), "utf8");
72
- return JSON.parse(content);
73
- } catch {
74
- return null;
75
- }
76
- };
77
- var writeAuthState = async (state, filename) => {
78
- await mkdir(AUTH_DIR, { recursive: true, mode: 448 });
79
- await writeFile(resolveAuthFile(filename), JSON.stringify(state, null, 2), { mode: 384 });
80
- };
81
- var decodeJwtPayload = (token) => {
82
- try {
83
- const [, payload] = token.split(".");
84
- if (!payload) {
85
- return null;
86
- }
87
- const json = Buffer.from(payload, "base64url").toString("utf8");
88
- return JSON.parse(json);
89
- } catch {
90
- return null;
91
- }
92
- };
93
- var getToken = async (filename) => {
94
- const state = await readAuthState(filename);
95
- if (!state) {
96
- throw new Error("Not authenticated. Run `stackable-app-extension auth login` first.");
97
- }
98
- const payload = decodeJwtPayload(state.token);
99
- if (payload?.exp && typeof payload.exp === "number") {
100
- if (Date.now() >= payload.exp * 1e3) {
101
- throw new Error("Session expired. Run `stackable-app-extension auth login` to re-authenticate.");
102
- }
103
- }
104
- return state.token;
105
- };
106
-
107
- export { MCP_AUTH_FILE, STANDALONE_CLIENT, STANDALONE_CLIENT_AUTH_FILE, deriveClientId, getDigest, getNonce, getToken, getVerifier, writeAuthState };