zeroauth 1.0.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.
- package/dist/api/authorizer.d.ts +12 -0
- package/dist/api/authorizer.d.ts.map +1 -0
- package/dist/api/authorizer.js +157 -0
- package/dist/api/authorizer.js.map +1 -0
- package/dist/api/config/intent-config.d.ts +45 -0
- package/dist/api/config/intent-config.d.ts.map +1 -0
- package/dist/api/config/intent-config.js +95 -0
- package/dist/api/config/intent-config.js.map +1 -0
- package/dist/api/index.d.ts +4 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +722 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/routing/intent-router.d.ts +56 -0
- package/dist/api/routing/intent-router.d.ts.map +1 -0
- package/dist/api/routing/intent-router.js +140 -0
- package/dist/api/routing/intent-router.js.map +1 -0
- package/dist/api/routing/intent-validator.d.ts +83 -0
- package/dist/api/routing/intent-validator.d.ts.map +1 -0
- package/dist/api/routing/intent-validator.js +187 -0
- package/dist/api/routing/intent-validator.js.map +1 -0
- package/dist/api/services/billing.d.ts +9 -0
- package/dist/api/services/billing.d.ts.map +1 -0
- package/dist/api/services/billing.js +49 -0
- package/dist/api/services/billing.js.map +1 -0
- package/dist/api/services/stripe.d.ts +17 -0
- package/dist/api/services/stripe.d.ts.map +1 -0
- package/dist/api/services/stripe.js +69 -0
- package/dist/api/services/stripe.js.map +1 -0
- package/dist/authorizer.zip +0 -0
- package/dist/cli/auth.d.ts +20 -0
- package/dist/cli/auth.d.ts.map +1 -0
- package/dist/cli/auth.js +264 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/config.d.ts +17 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +94 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +371 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/proxy.d.ts +2 -0
- package/dist/cli/proxy.d.ts.map +1 -0
- package/dist/cli/proxy.js +171 -0
- package/dist/cli/proxy.js.map +1 -0
- package/dist/data/catalog.d.ts +54 -0
- package/dist/data/catalog.d.ts.map +1 -0
- package/dist/data/catalog.js +108 -0
- package/dist/data/catalog.js.map +1 -0
- package/dist/db/dal.d.ts +75 -0
- package/dist/db/dal.d.ts.map +1 -0
- package/dist/db/dal.js +124 -0
- package/dist/db/dal.js.map +1 -0
- package/dist/index.js +156 -0
- package/dist/index.ts +134 -0
- package/dist/logger.d.ts +8 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +19 -0
- package/dist/logger.js.map +1 -0
- package/dist/test/setup.d.ts +2 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/test/setup.js +27 -0
- package/dist/test/setup.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.stripe = void 0;
|
|
7
|
+
exports.createStripeCustomer = createStripeCustomer;
|
|
8
|
+
exports.reportUsage = reportUsage;
|
|
9
|
+
const stripe_1 = __importDefault(require("stripe"));
|
|
10
|
+
const logger_1 = require("../../logger");
|
|
11
|
+
const STRIPE_API_KEY = process.env.STRIPE_API_KEY || "sk_test_123"; // Default for mock
|
|
12
|
+
const STRIPE_API_BASE_URL = process.env.STRIPE_API_BASE_URL; // Used for stripe-mock in dev
|
|
13
|
+
/**
|
|
14
|
+
* Initialize Stripe Client
|
|
15
|
+
*
|
|
16
|
+
* In production: Connects to real Stripe API
|
|
17
|
+
* In development: Connects to stripe-mock container if STRIPE_API_BASE_URL is set
|
|
18
|
+
*/
|
|
19
|
+
exports.stripe = new stripe_1.default(STRIPE_API_KEY, {
|
|
20
|
+
apiVersion: "2025-10-29.clover", // Pin to latest version
|
|
21
|
+
typescript: true,
|
|
22
|
+
host: STRIPE_API_BASE_URL ? STRIPE_API_BASE_URL.replace("http://", "").replace("https://", "").split(":")[0] : undefined,
|
|
23
|
+
port: STRIPE_API_BASE_URL ? parseInt(STRIPE_API_BASE_URL.split(":")[2] || "80") : undefined,
|
|
24
|
+
protocol: STRIPE_API_BASE_URL && STRIPE_API_BASE_URL.startsWith("http:") ? "http" : "https",
|
|
25
|
+
maxNetworkRetries: 3,
|
|
26
|
+
});
|
|
27
|
+
logger_1.log.info(`Stripe initialized. Mock Mode: ${!!STRIPE_API_BASE_URL}`);
|
|
28
|
+
/**
|
|
29
|
+
* Creates a Stripe Customer for an Organization
|
|
30
|
+
*/
|
|
31
|
+
async function createStripeCustomer(organizationId, email, name) {
|
|
32
|
+
try {
|
|
33
|
+
const customer = await exports.stripe.customers.create({
|
|
34
|
+
email,
|
|
35
|
+
name,
|
|
36
|
+
metadata: {
|
|
37
|
+
organizationId,
|
|
38
|
+
},
|
|
39
|
+
// In a real app we might attach a payment method here
|
|
40
|
+
});
|
|
41
|
+
logger_1.log.info({ customerId: customer.id, organizationId }, "Created Stripe Customer");
|
|
42
|
+
return customer;
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
logger_1.log.error({ error, organizationId }, "Failed to create Stripe Customer");
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Reports usage for Metered Billing using Stripe's modern Metering API
|
|
51
|
+
*/
|
|
52
|
+
async function reportUsage(customerId, tokens) {
|
|
53
|
+
try {
|
|
54
|
+
// With Stripe's new Metering API, we send events.
|
|
55
|
+
// Stripe handle the aggregation based on the Meter configuration in the dashboard.
|
|
56
|
+
await exports.stripe.billing.meterEvents.create({
|
|
57
|
+
event_name: "tokens_used",
|
|
58
|
+
payload: {
|
|
59
|
+
stripe_customer_id: customerId,
|
|
60
|
+
value: tokens.toString(),
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
logger_1.log.info({ customerId, tokens, event: "tokens_used" }, "Successfully reported usage event to Stripe");
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
logger_1.log.error({ error, customerId }, "Failed to report usage event to Stripe");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=stripe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stripe.js","sourceRoot":"","sources":["../../../src/api/services/stripe.ts"],"names":[],"mappings":";;;;;;AA0BA,oDAoBC;AAKD,kCAsBC;AAzED,oDAA4B;AAC5B,yCAAmC;AAEnC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,aAAa,CAAC,CAAC,mBAAmB;AACvF,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,8BAA8B;AAE3F;;;;;GAKG;AACU,QAAA,MAAM,GAAG,IAAI,gBAAM,CAAC,cAAc,EAAE;IAC/C,UAAU,EAAE,mBAAmB,EAAE,wBAAwB;IACzD,UAAU,EAAE,IAAI;IAChB,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;IACxH,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;IAC3F,QAAQ,EAAE,mBAAmB,IAAI,mBAAmB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;IAC3F,iBAAiB,EAAE,CAAC;CACrB,CAAC,CAAC;AAEH,YAAG,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC;AAEpE;;GAEG;AACI,KAAK,UAAU,oBAAoB,CACxC,cAAsB,EACtB,KAAa,EACb,IAAY;IAEZ,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,cAAM,CAAC,SAAS,CAAC,MAAM,CAAC;YAC7C,KAAK;YACL,IAAI;YACJ,QAAQ,EAAE;gBACR,cAAc;aACf;YACD,sDAAsD;SACvD,CAAC,CAAC;QACH,YAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,cAAc,EAAE,EAAE,yBAAyB,CAAC,CAAC;QACjF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,YAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,kCAAkC,CAAC,CAAC;QACzE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,WAAW,CAC/B,UAAkB,EAClB,MAAc;IAEd,IAAI,CAAC;QACH,kDAAkD;QAClD,mFAAmF;QACnF,MAAM,cAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;YACtC,UAAU,EAAE,aAAa;YACzB,OAAO,EAAE;gBACP,kBAAkB,EAAE,UAAU;gBAC9B,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE;aACzB;SACF,CAAC,CAAC;QAEH,YAAG,CAAC,IAAI,CACN,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,EAC5C,6CAA6C,CAC9C,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,YAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,wCAAwC,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC"}
|
|
Binary file
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface Tokens {
|
|
2
|
+
access_token: string;
|
|
3
|
+
refresh_token: string;
|
|
4
|
+
id_token?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function getOidcEndpoints(): Promise<{
|
|
7
|
+
authorization_endpoint: string;
|
|
8
|
+
token_endpoint: string;
|
|
9
|
+
logout_endpoint: string;
|
|
10
|
+
}>;
|
|
11
|
+
export declare function saveTokens(tokens: Tokens): void;
|
|
12
|
+
export declare function loadTokens(): Tokens | null;
|
|
13
|
+
export declare function getTokenClaims(token: string): any;
|
|
14
|
+
export declare function isTokenExpired(token: string): boolean;
|
|
15
|
+
export declare function getTokenTimeRemaining(token: string): number;
|
|
16
|
+
export declare function refreshAccessToken(refreshToken: string): Promise<string | null>;
|
|
17
|
+
export declare function getValidAccessToken(): Promise<string | null>;
|
|
18
|
+
export declare function performLogin(): Promise<string | null>;
|
|
19
|
+
export declare function exchangeCodeForToken(code: string): Promise<Tokens>;
|
|
20
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/cli/auth.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,MAAM;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAQD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC;IAChD,sBAAsB,EAAE,MAAM,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC,CAoBD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAQ/C;AAED,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAW1C;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAMjD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAMrD;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ3D;AAED,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgCxB;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkBlE;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAwF3D;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BxE"}
|
package/dist/cli/auth.js
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.getOidcEndpoints = getOidcEndpoints;
|
|
40
|
+
exports.saveTokens = saveTokens;
|
|
41
|
+
exports.loadTokens = loadTokens;
|
|
42
|
+
exports.getTokenClaims = getTokenClaims;
|
|
43
|
+
exports.isTokenExpired = isTokenExpired;
|
|
44
|
+
exports.getTokenTimeRemaining = getTokenTimeRemaining;
|
|
45
|
+
exports.refreshAccessToken = refreshAccessToken;
|
|
46
|
+
exports.getValidAccessToken = getValidAccessToken;
|
|
47
|
+
exports.performLogin = performLogin;
|
|
48
|
+
exports.exchangeCodeForToken = exchangeCodeForToken;
|
|
49
|
+
const axios_1 = __importDefault(require("axios"));
|
|
50
|
+
const fs = __importStar(require("fs"));
|
|
51
|
+
const path = __importStar(require("path"));
|
|
52
|
+
const os = __importStar(require("os"));
|
|
53
|
+
const open_1 = __importDefault(require("open"));
|
|
54
|
+
const http_1 = require("http");
|
|
55
|
+
const url_1 = require("url");
|
|
56
|
+
const jwt = __importStar(require("jsonwebtoken"));
|
|
57
|
+
const config_1 = require("./config");
|
|
58
|
+
const crypto_1 = require("crypto");
|
|
59
|
+
function getCredentialsFile() {
|
|
60
|
+
return path.join(os.homedir(), ".zeroauth", "credentials.json");
|
|
61
|
+
}
|
|
62
|
+
let oidcEndpointsCache = null;
|
|
63
|
+
async function getOidcEndpoints() {
|
|
64
|
+
if (oidcEndpointsCache) {
|
|
65
|
+
return oidcEndpointsCache;
|
|
66
|
+
}
|
|
67
|
+
const envConfig = (0, config_1.getActiveEnvConfig)();
|
|
68
|
+
const discoveryUrl = `${envConfig.authIssuerUrl}/.well-known/openid-configuration`;
|
|
69
|
+
try {
|
|
70
|
+
const response = await axios_1.default.get(discoveryUrl);
|
|
71
|
+
oidcEndpointsCache = {
|
|
72
|
+
authorization_endpoint: response.data.authorization_endpoint,
|
|
73
|
+
token_endpoint: response.data.token_endpoint,
|
|
74
|
+
logout_endpoint: response.data.end_session_endpoint || response.data.logout_endpoint,
|
|
75
|
+
};
|
|
76
|
+
return oidcEndpointsCache;
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
throw new Error(`Failed to fetch OIDC discovery document: ${error}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function saveTokens(tokens) {
|
|
83
|
+
const credentialsFile = getCredentialsFile();
|
|
84
|
+
const dir = path.dirname(credentialsFile);
|
|
85
|
+
if (!fs.existsSync(dir)) {
|
|
86
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
87
|
+
}
|
|
88
|
+
fs.writeFileSync(credentialsFile, JSON.stringify(tokens, null, 2));
|
|
89
|
+
fs.chmodSync(credentialsFile, 0o600);
|
|
90
|
+
}
|
|
91
|
+
function loadTokens() {
|
|
92
|
+
const credentialsFile = getCredentialsFile();
|
|
93
|
+
if (!fs.existsSync(credentialsFile)) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const data = fs.readFileSync(credentialsFile, "utf8");
|
|
98
|
+
return JSON.parse(data);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function getTokenClaims(token) {
|
|
105
|
+
try {
|
|
106
|
+
return jwt.decode(token);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return {};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function isTokenExpired(token) {
|
|
113
|
+
const claims = getTokenClaims(token);
|
|
114
|
+
if (!claims || !claims.exp) {
|
|
115
|
+
return true; // Consider invalid tokens as expired
|
|
116
|
+
}
|
|
117
|
+
return claims.exp < Date.now() / 1000 + 10;
|
|
118
|
+
}
|
|
119
|
+
function getTokenTimeRemaining(token) {
|
|
120
|
+
const claims = getTokenClaims(token);
|
|
121
|
+
if (!claims || !claims.exp) {
|
|
122
|
+
return 0;
|
|
123
|
+
}
|
|
124
|
+
const exp = claims.exp;
|
|
125
|
+
const remaining = exp - Date.now() / 1000;
|
|
126
|
+
return Math.max(remaining, 0);
|
|
127
|
+
}
|
|
128
|
+
async function refreshAccessToken(refreshToken) {
|
|
129
|
+
const endpoints = await getOidcEndpoints();
|
|
130
|
+
const envConfig = (0, config_1.getActiveEnvConfig)(); // Use 'any' for secret
|
|
131
|
+
try {
|
|
132
|
+
const params = new URLSearchParams({
|
|
133
|
+
grant_type: "refresh_token",
|
|
134
|
+
client_id: envConfig.authClientId,
|
|
135
|
+
refresh_token: refreshToken,
|
|
136
|
+
});
|
|
137
|
+
if (envConfig.authClientSecret) {
|
|
138
|
+
params.append("client_secret", envConfig.authClientSecret);
|
|
139
|
+
}
|
|
140
|
+
const response = await axios_1.default.post(endpoints.token_endpoint, params, // Use the new params object
|
|
141
|
+
{
|
|
142
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
143
|
+
timeout: 10000,
|
|
144
|
+
});
|
|
145
|
+
const newTokens = response.data;
|
|
146
|
+
saveTokens(newTokens);
|
|
147
|
+
console.log("Access token refreshed.");
|
|
148
|
+
return newTokens.access_token;
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
// console.error(`❌ Failed to refresh token: ${error}. Please log in again.`);
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
async function getValidAccessToken() {
|
|
156
|
+
const tokens = loadTokens();
|
|
157
|
+
if (!tokens) {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
// Use id_token for API calls since access_token is opaque
|
|
161
|
+
const idToken = tokens.id_token;
|
|
162
|
+
if (idToken && !isTokenExpired(idToken)) {
|
|
163
|
+
return idToken;
|
|
164
|
+
}
|
|
165
|
+
const refreshToken = tokens.refresh_token;
|
|
166
|
+
if (refreshToken) {
|
|
167
|
+
return await refreshAccessToken(refreshToken);
|
|
168
|
+
}
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
async function performLogin() {
|
|
172
|
+
const endpoints = await getOidcEndpoints();
|
|
173
|
+
const envConfig = (0, config_1.getActiveEnvConfig)();
|
|
174
|
+
// --- ADDED: Generate state ---
|
|
175
|
+
const state = (0, crypto_1.randomBytes)(8).toString("hex"); // 16-char random string
|
|
176
|
+
// --- END ADDED ---
|
|
177
|
+
const authUrl = endpoints.authorization_endpoint;
|
|
178
|
+
const params = new URLSearchParams({
|
|
179
|
+
client_id: envConfig.authClientId,
|
|
180
|
+
redirect_uri: envConfig.authRedirectUri,
|
|
181
|
+
response_type: "code",
|
|
182
|
+
scope: "openid", // Keep this from the previous fix
|
|
183
|
+
state: state, // <-- ADDED state parameter
|
|
184
|
+
});
|
|
185
|
+
const url = `${authUrl}?${params.toString()}`;
|
|
186
|
+
await (0, open_1.default)(url);
|
|
187
|
+
return new Promise((resolve) => {
|
|
188
|
+
const server = (0, http_1.createServer)((req, res) => {
|
|
189
|
+
const parsedUrl = (0, url_1.parse)(req.url, true);
|
|
190
|
+
// console.log("\n[Auth Callback Received]");
|
|
191
|
+
// console.log(" Full URL:", req.url);
|
|
192
|
+
// console.log(
|
|
193
|
+
// " Query parameters:",
|
|
194
|
+
// JSON.stringify(parsedUrl.query, null, 2),
|
|
195
|
+
// );
|
|
196
|
+
// --- ADDED: State validation ---
|
|
197
|
+
const receivedState = parsedUrl.query.state;
|
|
198
|
+
if (receivedState !== state) {
|
|
199
|
+
// console.error(`❌ Authentication failed: Invalid state parameter.`);
|
|
200
|
+
// console.error(` Expected: ${state}`);
|
|
201
|
+
// console.error(` Received: ${receivedState || "null"}`);
|
|
202
|
+
res.writeHead(400, { "Content-Type": "text/html" });
|
|
203
|
+
res.end(`<html><body><h1>Login Failed</h1><p>State mismatch (CSRF protection). Please try again.</p></body></html>`);
|
|
204
|
+
server.close();
|
|
205
|
+
resolve(null);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
// --- END ADDED ---
|
|
209
|
+
if (parsedUrl.query.error) {
|
|
210
|
+
// console.error(`❌ Authentication failed: ${parsedUrl.query.error}`);
|
|
211
|
+
// console.error(
|
|
212
|
+
// ` Description: ${parsedUrl.query.error_description || "No description provided."}`,
|
|
213
|
+
// );
|
|
214
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
215
|
+
res.end(`
|
|
216
|
+
<html><head><title>Login Failed</title></head>
|
|
217
|
+
<body>
|
|
218
|
+
<h1>Login Failed</h1>
|
|
219
|
+
<p>Error: ${parsedUrl.query.error}</p>
|
|
220
|
+
<p>Description: ${parsedUrl.query.error_description || "N/A"}</p>
|
|
221
|
+
<p>You can close this window.</p>
|
|
222
|
+
</body></html>
|
|
223
|
+
`);
|
|
224
|
+
server.close();
|
|
225
|
+
resolve(null);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
const code = parsedUrl.query.code;
|
|
229
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
230
|
+
res.end(`
|
|
231
|
+
<html>
|
|
232
|
+
<head><title>Login Successful</title></head>
|
|
233
|
+
<body>Login successful! This window will close automatically in 5 seconds.</body>
|
|
234
|
+
<script>setTimeout(() => window.close(), 5000);</script>
|
|
235
|
+
</html>
|
|
236
|
+
`);
|
|
237
|
+
server.close();
|
|
238
|
+
resolve(code || null);
|
|
239
|
+
});
|
|
240
|
+
server.listen(8085);
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
async function exchangeCodeForToken(code) {
|
|
244
|
+
const endpoints = await getOidcEndpoints();
|
|
245
|
+
const envConfig = (0, config_1.getActiveEnvConfig)(); // Use 'any' to access new secret prop
|
|
246
|
+
// --- MODIFIED: Build params and add secret ---
|
|
247
|
+
const params = new URLSearchParams({
|
|
248
|
+
grant_type: "authorization_code",
|
|
249
|
+
client_id: envConfig.authClientId,
|
|
250
|
+
code: code,
|
|
251
|
+
redirect_uri: envConfig.authRedirectUri,
|
|
252
|
+
});
|
|
253
|
+
if (envConfig.authClientSecret) {
|
|
254
|
+
params.append("client_secret", envConfig.authClientSecret);
|
|
255
|
+
}
|
|
256
|
+
// --- END MODIFIED ---
|
|
257
|
+
const response = await axios_1.default.post(endpoints.token_endpoint, params, // Use the new params object
|
|
258
|
+
{
|
|
259
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
260
|
+
timeout: 10000,
|
|
261
|
+
});
|
|
262
|
+
return response.data;
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/cli/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface EnvConfig {
|
|
2
|
+
apiBaseUrl: string;
|
|
3
|
+
authIssuerUrl: string;
|
|
4
|
+
authClientId: string;
|
|
5
|
+
authRedirectUri: string;
|
|
6
|
+
}
|
|
7
|
+
export interface Config {
|
|
8
|
+
activeEnv: string;
|
|
9
|
+
defaultModel: string;
|
|
10
|
+
envs: {
|
|
11
|
+
[key: string]: EnvConfig;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export declare function loadConfig(): Config;
|
|
15
|
+
export declare function saveConfig(config: Config): void;
|
|
16
|
+
export declare function getActiveEnvConfig(): EnvConfig;
|
|
17
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;CACpC;AAqBD,wBAAgB,UAAU,IAAI,MAAM,CAYnC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAQ/C;AAED,wBAAgB,kBAAkB,IAAI,SAAS,CAS9C"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.loadConfig = loadConfig;
|
|
37
|
+
exports.saveConfig = saveConfig;
|
|
38
|
+
exports.getActiveEnvConfig = getActiveEnvConfig;
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const os = __importStar(require("os"));
|
|
42
|
+
function getConfigFile() {
|
|
43
|
+
return path.join(os.homedir(), ".zeroauth", "config.json");
|
|
44
|
+
}
|
|
45
|
+
const DEFAULT_CONFIG = {
|
|
46
|
+
activeEnv: "local",
|
|
47
|
+
defaultModel: "intent:budget",
|
|
48
|
+
envs: {
|
|
49
|
+
local: {
|
|
50
|
+
apiBaseUrl: "http://localhost:8080/v1",
|
|
51
|
+
authIssuerUrl: "http://localhost:8081/realms/zeroauth",
|
|
52
|
+
authClientId: "zeroauth-cli",
|
|
53
|
+
authRedirectUri: "http://localhost:8085/callback",
|
|
54
|
+
},
|
|
55
|
+
prod: {
|
|
56
|
+
apiBaseUrl: "https://api.zeroauth.ai/v1",
|
|
57
|
+
authIssuerUrl: "https://flexible-doberman-84.clerk.accounts.dev",
|
|
58
|
+
authClientId: "eoLgtLOGjAWdjlFp",
|
|
59
|
+
authRedirectUri: "http://localhost:8085/callback",
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
function loadConfig() {
|
|
64
|
+
const configFile = getConfigFile();
|
|
65
|
+
if (!fs.existsSync(configFile)) {
|
|
66
|
+
saveConfig(DEFAULT_CONFIG);
|
|
67
|
+
return DEFAULT_CONFIG;
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const data = fs.readFileSync(configFile, "utf8");
|
|
71
|
+
return JSON.parse(data);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return DEFAULT_CONFIG;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function saveConfig(config) {
|
|
78
|
+
const configFile = getConfigFile();
|
|
79
|
+
const dir = path.dirname(configFile);
|
|
80
|
+
if (!fs.existsSync(dir)) {
|
|
81
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
82
|
+
}
|
|
83
|
+
fs.writeFileSync(configFile, JSON.stringify(config, null, 2));
|
|
84
|
+
fs.chmodSync(configFile, 0o600);
|
|
85
|
+
}
|
|
86
|
+
function getActiveEnvConfig() {
|
|
87
|
+
const config = loadConfig();
|
|
88
|
+
const activeEnv = config.envs[config.activeEnv];
|
|
89
|
+
if (!activeEnv) {
|
|
90
|
+
throw new Error(`Active environment '${config.activeEnv}' not found in config`);
|
|
91
|
+
}
|
|
92
|
+
return activeEnv;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,gCAYC;AAED,gCAQC;AAED,gDASC;AAzED,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAEzB,SAAS,aAAa;IACpB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;AAC7D,CAAC;AAeD,MAAM,cAAc,GAAW;IAC7B,SAAS,EAAE,OAAO;IAClB,YAAY,EAAE,eAAe;IAC7B,IAAI,EAAE;QACJ,KAAK,EAAE;YACL,UAAU,EAAE,0BAA0B;YACtC,aAAa,EAAE,uCAAuC;YACtD,YAAY,EAAE,cAAc;YAC5B,eAAe,EAAE,gCAAgC;SAClD;QACD,IAAI,EAAE;YACJ,UAAU,EAAE,4BAA4B;YACxC,aAAa,EAAE,iDAAiD;YAChE,YAAY,EAAE,kBAAkB;YAChC,eAAe,EAAE,gCAAgC;SAClD;KACF;CACF,CAAC;AAEF,SAAgB,UAAU;IACxB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,UAAU,CAAC,cAAc,CAAC,CAAC;QAC3B,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,cAAc,CAAC;IACxB,CAAC;AACH,CAAC;AAED,SAAgB,UAAU,CAAC,MAAc;IACvC,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9D,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,SAAgB,kBAAkB;IAChC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAChD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,uBAAuB,MAAM,CAAC,SAAS,uBAAuB,CAC/D,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|