@micropage-sh/mcp 0.1.2 → 0.1.3
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 +11 -0
- package/dist/client/assets.d.ts +26 -8
- package/dist/client/assets.js +54 -116
- package/dist/client/assets.js.map +1 -1
- package/dist/client/auth-provider.d.ts +9 -3
- package/dist/client/auth-provider.js +11 -0
- package/dist/client/auth-provider.js.map +1 -1
- package/dist/client/bearer-auth.d.ts +16 -0
- package/dist/client/bearer-auth.js +24 -0
- package/dist/client/bearer-auth.js.map +1 -0
- package/dist/client/deploy-token.d.ts +6 -0
- package/dist/client/deploy-token.js +10 -4
- package/dist/client/deploy-token.js.map +1 -1
- package/dist/client/errors.d.ts +1 -1
- package/dist/client/errors.js.map +1 -1
- package/dist/client/http.d.ts +4 -0
- package/dist/client/http.js +7 -4
- package/dist/client/http.js.map +1 -1
- package/dist/client/ip.d.ts +12 -0
- package/dist/client/ip.js +93 -0
- package/dist/client/ip.js.map +1 -0
- package/dist/client/session-store.d.ts +3 -2
- package/dist/client/session-store.js +5 -1
- package/dist/client/session-store.js.map +1 -1
- package/dist/client/tier.d.ts +23 -3
- package/dist/client/tier.js +56 -17
- package/dist/client/tier.js.map +1 -1
- package/dist/context.d.ts +43 -7
- package/dist/guards.d.ts +11 -10
- package/dist/guards.js +21 -19
- package/dist/guards.js.map +1 -1
- package/dist/hints.d.ts +46 -0
- package/dist/hints.js +70 -0
- package/dist/hints.js.map +1 -0
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/node/deps.d.ts +26 -0
- package/dist/node/deps.js +51 -0
- package/dist/node/deps.js.map +1 -0
- package/dist/node/host-lookup.d.ts +3 -0
- package/dist/node/host-lookup.js +4 -0
- package/dist/node/host-lookup.js.map +1 -0
- package/dist/node/path-source.d.ts +3 -0
- package/dist/node/path-source.js +28 -0
- package/dist/node/path-source.js.map +1 -0
- package/dist/reference/prompts.d.ts +2 -1
- package/dist/reference/prompts.js +4 -3
- package/dist/reference/prompts.js.map +1 -1
- package/dist/reference.d.ts +1 -1
- package/dist/reference.js +2 -2
- package/dist/reference.js.map +1 -1
- package/dist/server.d.ts +4 -19
- package/dist/server.js +27 -33
- package/dist/server.js.map +1 -1
- package/dist/tools/account.d.ts +1 -0
- package/dist/tools/account.js +8 -8
- package/dist/tools/account.js.map +1 -1
- package/dist/tools/files.d.ts +15 -6
- package/dist/tools/files.js +63 -45
- package/dist/tools/files.js.map +1 -1
- package/dist/tools/forms.js +1 -1
- package/dist/tools/forms.js.map +1 -1
- package/dist/tools/posts.d.ts +2 -3
- package/dist/tools/posts.js +15 -16
- package/dist/tools/posts.js.map +1 -1
- package/dist/tools/projects.js +2 -2
- package/dist/tools/projects.js.map +1 -1
- package/dist/tools/shared.d.ts +1 -1
- package/dist/tools/shared.js +1 -1
- package/dist/tools/shared.js.map +1 -1
- package/dist/version.d.ts +2 -2
- package/dist/version.js +6 -7
- package/dist/version.js.map +1 -1
- package/package.json +6 -3
package/dist/client/errors.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type MicropageErrorCode = "NOT_LOGGED_IN" | "SESSION_EXPIRED" | "HTTP" | "TIMEOUT" | "NETWORK" | "CONFIRM_REQUIRED" | "CONFIRM_INVALID" | "DISABLED" | "NOT_ALLOWED_IN_DEPLOY_TOKEN_MODE" | "PLAN_REQUIRED" | (string & {});
|
|
1
|
+
export type MicropageErrorCode = "NOT_LOGGED_IN" | "SESSION_EXPIRED" | "AUTH_EXPIRED" | "HTTP" | "TIMEOUT" | "NETWORK" | "CONFIRM_REQUIRED" | "CONFIRM_INVALID" | "DISABLED" | "NOT_ALLOWED_IN_DEPLOY_TOKEN_MODE" | "PLAN_REQUIRED" | (string & {});
|
|
2
2
|
export interface MicropageErrorOptions {
|
|
3
3
|
status?: number;
|
|
4
4
|
data?: unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/client/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/client/errors.ts"],"names":[],"mappings":"AAoBA;;;;GAIG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,IAAI,CAAqB;IACzB,MAAM,CAAqB;IAC3B,IAAI,CAAU;IAEvB,YAAY,IAAwB,EAAE,OAAe,EAAE,UAAiC,EAAE;QACxF,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,OAAO,GAAG,YAAY,cAAc,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,8BAA8B,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAa,EAAE,UAAiC,EAAE;IAClF,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACnD,MAAM,IAAI,GAAG,IAA+B,CAAC;IAC7C,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe;QAAE,OAAO,IAAI,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3G,uFAAuF;IACvF,sDAAsD;IACtD,MAAM,YAAY,GAChB,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpG,MAAM,MAAM,GACV,YAAY;QACZ,cAAc,SAAS,CAAC,CAAC,CAAC,OAAO,SAAS,OAAO,CAAC,CAAC,CAAC,yBAAyB,GAAG,CAAC;IACnF,MAAM,GAAG,GAAG,CAAC,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC;IACtF,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC;IAC/D,OAAO,IAAI,cAAc,CAAC,eAAe,EAAE,GAAG,QAAQ,eAAe,GAAG,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AACrG,CAAC"}
|
package/dist/client/http.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type ModeHints } from "../hints.js";
|
|
1
2
|
import type { AuthProvider } from "./auth-provider.js";
|
|
2
3
|
import type { MicropageConfig } from "./config.js";
|
|
3
4
|
export type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;
|
|
@@ -7,6 +8,8 @@ export interface HttpOptions {
|
|
|
7
8
|
fetch?: FetchLike;
|
|
8
9
|
timeoutMs?: number;
|
|
9
10
|
userAgent?: string;
|
|
11
|
+
/** Wording of the 401 error. Defaults to the stdio wording. */
|
|
12
|
+
hints?: Pick<ModeHints, "sessionInvalid">;
|
|
10
13
|
}
|
|
11
14
|
export interface RequestOptions {
|
|
12
15
|
/** JSON-serialised into the request body. */
|
|
@@ -46,6 +49,7 @@ export declare class Http {
|
|
|
46
49
|
private readonly fetchImpl;
|
|
47
50
|
private readonly timeoutMs;
|
|
48
51
|
private readonly userAgent;
|
|
52
|
+
private readonly sessionInvalid;
|
|
49
53
|
constructor(options: HttpOptions);
|
|
50
54
|
request<T = unknown>(method: string, url: string, options?: RequestOptions): Promise<T>;
|
|
51
55
|
/** The response after auth and the one 401 retry; the caller reads (or cancels) the body. */
|
package/dist/client/http.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { STDIO_HINTS } from "../hints.js";
|
|
1
2
|
import { VERSION } from "../version.js";
|
|
2
3
|
import { MicropageError, planRequiredError } from "./errors.js";
|
|
3
4
|
export const eq = (v) => `eq.${v}`;
|
|
@@ -18,18 +19,20 @@ export class Http {
|
|
|
18
19
|
fetchImpl;
|
|
19
20
|
timeoutMs;
|
|
20
21
|
userAgent;
|
|
22
|
+
sessionInvalid;
|
|
21
23
|
constructor(options) {
|
|
22
24
|
this.config = options.config;
|
|
23
25
|
this.auth = options.auth;
|
|
24
26
|
this.fetchImpl = options.fetch ?? ((input, init) => fetch(input, init));
|
|
25
27
|
this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
26
28
|
this.userAgent = options.userAgent ?? `micropage-mcp/${VERSION}`;
|
|
29
|
+
this.sessionInvalid = (options.hints ?? STDIO_HINTS).sessionInvalid;
|
|
27
30
|
}
|
|
28
31
|
async request(method, url, options = {}) {
|
|
29
32
|
const res = await this.exchange(method, url, options);
|
|
30
33
|
const data = await readBody(res);
|
|
31
34
|
if (!res.ok)
|
|
32
|
-
throw httpError(method, url, res, data);
|
|
35
|
+
throw httpError(method, url, res, data, this.sessionInvalid);
|
|
33
36
|
return data;
|
|
34
37
|
}
|
|
35
38
|
/** The response after auth and the one 401 retry; the caller reads (or cancels) the body. */
|
|
@@ -60,7 +63,7 @@ export class Http {
|
|
|
60
63
|
const res = await this.exchange("HEAD", url, { headers: { Prefer: "count=exact" } });
|
|
61
64
|
const data = await readBody(res);
|
|
62
65
|
if (!res.ok)
|
|
63
|
-
throw httpError("HEAD", url, res, data);
|
|
66
|
+
throw httpError("HEAD", url, res, data, this.sessionInvalid);
|
|
64
67
|
const total = /\/(\d+)\s*$/.exec(res.headers.get("content-range") ?? "")?.[1];
|
|
65
68
|
if (total === undefined) {
|
|
66
69
|
throw new MicropageError("HTTP", `HEAD ${new URL(url).pathname} returned no row count (Content-Range). Retry shortly.`, {
|
|
@@ -171,12 +174,12 @@ function describe(method, url) {
|
|
|
171
174
|
}
|
|
172
175
|
return `${method} ${path}`;
|
|
173
176
|
}
|
|
174
|
-
function httpError(method, url, res, data) {
|
|
177
|
+
function httpError(method, url, res, data, sessionInvalid) {
|
|
175
178
|
const planRequired = planRequiredError(data, { status: res.status });
|
|
176
179
|
if (planRequired)
|
|
177
180
|
return planRequired;
|
|
178
181
|
if (res.status === 401) {
|
|
179
|
-
return new MicropageError("SESSION_EXPIRED",
|
|
182
|
+
return new MicropageError("SESSION_EXPIRED", sessionInvalid, { status: 401, data });
|
|
180
183
|
}
|
|
181
184
|
const detail = (data && typeof data === "object" && (pick(data, "message") ?? pick(data, "error"))) ||
|
|
182
185
|
(typeof data === "string" && data.length < 500 ? data : null) ||
|
package/dist/client/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/client/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGxC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/client/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGxC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AA8BhE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAA4B,EAAU,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;AACtE,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAA4B,EAAU,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;AACxE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAA4B,EAAU,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;AACtE,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,EAAkC,EAAU,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAC7F,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAkB,EAAU,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;AAS5D,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,OAAO,IAAI;IACN,MAAM,CAAkB;IACxB,IAAI,CAAe;IACX,SAAS,CAAY;IACrB,SAAS,CAAS;IAClB,SAAS,CAAS;IAClB,cAAc,CAAS;IAExC,YAAY,OAAoB;QAC9B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;QACzD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,iBAAiB,OAAO,EAAE,CAAC;QACjE,IAAI,CAAC,cAAc,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC,CAAC,cAAc,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,OAAO,CAAc,MAAc,EAAE,GAAW,EAAE,UAA0B,EAAE;QAClF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1E,OAAO,IAAS,CAAC;IACnB,CAAC;IAED,6FAA6F;IACrF,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,GAAW,EAAE,OAAuB;QACzE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC;QACvC,IAAI,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;QACrF,IAAI,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAEvD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YACzE,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;gBACxB,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAChD,KAAK,GAAG,SAAS,CAAC;gBAClB,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,KAAa,EAAE,UAAmB,EAAE;QAC9C,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC1B,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;QACrF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1E,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9E,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,QAAQ,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,wDAAwD,EAAE;gBACtH,MAAM,EAAE,GAAG,CAAC,MAAM;aACnB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,MAAM,CAAc,KAAa,EAAE,UAAyB,EAAE;QAClE,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC;QAC5C,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,OAAO,CAAC,KAAK;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACtD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAa,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QAChF,OAAO,IAAI,IAAI,EAAE,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,SAAS,CAAc,KAAa,EAAE,UAAyB,EAAE;QACrE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAI,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,MAAM,CAAc,KAAa,EAAE,IAAuB;QAC9D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAa,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACtE,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,EAAE,MAAM,EAAE,uBAAuB,EAAE;SAC7C,CAAC,CAAC;QACH,OAAO,GAAG,IAAI,EAAE,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,KAAK,CAAc,KAAa,EAAE,OAAgB,EAAE,MAAc;QACtE,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,+DAA+D;YAC/D,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,qBAAqB,KAAK,oBAAoB,CAAC,CAAC;QACnF,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAa,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE;YAC/E,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,EAAE,MAAM,EAAE,uBAAuB,EAAE;SAC7C,CAAC,CAAC;QACH,OAAO,GAAG,IAAI,EAAE,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,MAAM,CAAc,IAAY,EAAE,IAAc;QACpD,OAAO,IAAI,CAAC,OAAO,CAAI,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,KAAK,CAAC,SAAS,CAAc,IAAY,EAAE,SAAiC,EAAE;QAC5E,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC,OAAO,CAAI,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,CAAC,KAAa,EAAE,MAAwB;QAC7C,MAAM,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC9B,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,YAAY,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC5E,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,iBAAiB,IAAI,EAAE,CAAC;IAC3D,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,GAAW,EAAE,KAAa,EAAE,OAAuB;QACpF,MAAM,OAAO,GAA2B;YACtC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe;YACnC,aAAa,EAAE,UAAU,KAAK,EAAE;YAChC,YAAY,EAAE,IAAI,CAAC,SAAS;YAC5B,GAAG,OAAO,CAAC,OAAO;SACnB,CAAC;QACF,MAAM,IAAI,GAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3F,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;QAC9B,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,CAAC,cAAc,CAAC,KAAK,kBAAkB,CAAC;YAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACpC,IAAI,GAAG,YAAY,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,cAAc,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,EAAE,CAAC;gBACvF,MAAM,IAAI,cAAc,CACtB,SAAS,EACT,GAAG,KAAK,oBAAoB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,oDAAoD,EACjH,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,cAAc,CACtB,SAAS,EACT,GAAG,KAAK,sCAAsC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,iCAAiC,EAC/H,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAED,SAAS,aAAa,CAAC,MAAuB,EAAE,OAA4B;IAC1E,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC1F,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,GAAa;IACnC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAE,GAAW;IAC3C,oFAAoF;IACpF,IAAI,IAAI,GAAG,GAAG,CAAC;IACf,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,mBAAmB;IACrB,CAAC;IACD,OAAO,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,SAAS,CAAC,MAAc,EAAE,GAAW,EAAE,GAAa,EAAE,IAAa,EAAE,cAAsB;IAClG,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IACtC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO,IAAI,cAAc,CAAC,iBAAiB,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,MAAM,GACV,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QACpF,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7D,GAAG,CAAC,UAAU;QACd,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;IACvB,OAAO,IAAI,cAAc,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,iBAAiB,GAAG,CAAC,MAAM,MAAM,MAAM,EAAE,EAAE;QACnG,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,IAAI;KACL,CAAC,CAAC;AACL,CAAC;AAED,SAAS,IAAI,CAAC,GAAW,EAAE,GAAW;IACpC,MAAM,CAAC,GAAI,GAA+B,CAAC,GAAG,CAAC,CAAC;IAChD,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** The four bytes of a dotted-quad IPv4 address, or null when it is not one. */
|
|
2
|
+
export declare function ipv4Bytes(ip: string): number[] | null;
|
|
3
|
+
/** 16 bytes of an IPv6 address (zone id dropped), or null when it does not parse. */
|
|
4
|
+
export declare function ipv6Bytes(raw: string): number[] | null;
|
|
5
|
+
/** 4 or 6 for an IP literal, 0 otherwise (as net.isIP). */
|
|
6
|
+
export declare function ipFamily(ip: string): 0 | 4 | 6;
|
|
7
|
+
/**
|
|
8
|
+
* True for loopback, private, link-local, CGNAT, benchmarking, ULA, multicast
|
|
9
|
+
* and unspecified addresses, in any notation, and for the NAT64 (64:ff9b::/96)
|
|
10
|
+
* and 6to4 (2002::/16) prefixes, which can carry any IPv4 address, private ones included.
|
|
11
|
+
*/
|
|
12
|
+
export declare function isPrivateAddress(ip: string): boolean;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// Pure IP-literal parsing, so the address checks run where node:net does not
|
|
2
|
+
// exist. Accepts the same textual forms as Node's net.isIP (dotted-quad IPv4
|
|
3
|
+
// without leading zeros; IPv6 with "::", an embedded IPv4 tail, and a zone id).
|
|
4
|
+
/** The four bytes of a dotted-quad IPv4 address, or null when it is not one. */
|
|
5
|
+
export function ipv4Bytes(ip) {
|
|
6
|
+
const parts = ip.split(".");
|
|
7
|
+
if (parts.length !== 4)
|
|
8
|
+
return null;
|
|
9
|
+
const bytes = parts.map((p) => (/^(0|[1-9]\d{0,2})$/.test(p) ? Number(p) : Number.NaN));
|
|
10
|
+
return bytes.every((b) => b >= 0 && b <= 255) ? bytes : null;
|
|
11
|
+
}
|
|
12
|
+
/** 16 bytes of an IPv6 address (zone id dropped), or null when it does not parse. */
|
|
13
|
+
export function ipv6Bytes(raw) {
|
|
14
|
+
const parts = raw.split("%");
|
|
15
|
+
if (parts.length > 2 || (parts.length === 2 && !parts[1]))
|
|
16
|
+
return null;
|
|
17
|
+
let ip = parts[0];
|
|
18
|
+
let tail = [];
|
|
19
|
+
const lastColon = ip.lastIndexOf(":");
|
|
20
|
+
if (lastColon < 0)
|
|
21
|
+
return null;
|
|
22
|
+
if (ip.slice(lastColon + 1).includes(".")) {
|
|
23
|
+
const v4 = ipv4Bytes(ip.slice(lastColon + 1));
|
|
24
|
+
if (!v4)
|
|
25
|
+
return null;
|
|
26
|
+
tail = v4;
|
|
27
|
+
ip = `${ip.slice(0, lastColon + 1)}0:0`;
|
|
28
|
+
}
|
|
29
|
+
const halves = ip.split("::");
|
|
30
|
+
if (halves.length > 2)
|
|
31
|
+
return null;
|
|
32
|
+
const groups = (h) => (h === "" ? [] : h.split(":"));
|
|
33
|
+
const head = groups(halves[0]);
|
|
34
|
+
const back = halves.length === 2 ? groups(halves[1]) : [];
|
|
35
|
+
const fill = 8 - head.length - back.length;
|
|
36
|
+
if (halves.length === 1 ? fill !== 0 : fill < 1)
|
|
37
|
+
return null;
|
|
38
|
+
const all = [...head, ...Array(halves.length === 2 ? fill : 0).fill("0"), ...back];
|
|
39
|
+
const bytes = [];
|
|
40
|
+
for (const g of all) {
|
|
41
|
+
if (!/^[0-9a-f]{1,4}$/i.test(g))
|
|
42
|
+
return null;
|
|
43
|
+
const n = parseInt(g, 16);
|
|
44
|
+
bytes.push(n >> 8, n & 0xff);
|
|
45
|
+
}
|
|
46
|
+
if (tail.length)
|
|
47
|
+
bytes.splice(12, 4, ...tail);
|
|
48
|
+
return bytes;
|
|
49
|
+
}
|
|
50
|
+
/** 4 or 6 for an IP literal, 0 otherwise (as net.isIP). */
|
|
51
|
+
export function ipFamily(ip) {
|
|
52
|
+
if (ipv4Bytes(ip))
|
|
53
|
+
return 4;
|
|
54
|
+
if (ipv6Bytes(ip))
|
|
55
|
+
return 6;
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
58
|
+
function blockedV4([a, b]) {
|
|
59
|
+
return (a === 0 || // 0.0.0.0/8 "this network"
|
|
60
|
+
a === 10 ||
|
|
61
|
+
a === 127 ||
|
|
62
|
+
(a === 100 && b >= 64 && b <= 127) || // CGNAT 100.64/10
|
|
63
|
+
(a === 169 && b === 254) || // link-local, cloud metadata
|
|
64
|
+
(a === 172 && b >= 16 && b <= 31) ||
|
|
65
|
+
(a === 192 && b === 168) ||
|
|
66
|
+
(a === 198 && (b === 18 || b === 19)) || // benchmarking 198.18/15
|
|
67
|
+
a >= 224 // multicast 224/4 and reserved 240/4, incl. broadcast
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* True for loopback, private, link-local, CGNAT, benchmarking, ULA, multicast
|
|
72
|
+
* and unspecified addresses, in any notation, and for the NAT64 (64:ff9b::/96)
|
|
73
|
+
* and 6to4 (2002::/16) prefixes, which can carry any IPv4 address, private ones included.
|
|
74
|
+
*/
|
|
75
|
+
export function isPrivateAddress(ip) {
|
|
76
|
+
const v4 = ipv4Bytes(ip);
|
|
77
|
+
if (v4)
|
|
78
|
+
return blockedV4(v4);
|
|
79
|
+
const b = ipv6Bytes(ip);
|
|
80
|
+
if (!b)
|
|
81
|
+
return true;
|
|
82
|
+
const zeros = (n) => b.slice(0, n).every((x) => x === 0);
|
|
83
|
+
// ::ffff:a.b.c.d (mapped) and ::a.b.c.d (compatible, which also covers :: and ::1).
|
|
84
|
+
if ((zeros(10) && b[10] === 0xff && b[11] === 0xff) || zeros(12))
|
|
85
|
+
return blockedV4(b.slice(12));
|
|
86
|
+
return ((b[0] === 0xfe && (b[1] & 0xc0) === 0x80) || // fe80::/10 link-local
|
|
87
|
+
(b[0] & 0xfe) === 0xfc || // fc00::/7 unique local
|
|
88
|
+
b[0] === 0xff || // ff00::/8 multicast
|
|
89
|
+
(b[0] === 0x20 && b[1] === 0x02) || // 2002::/16 6to4
|
|
90
|
+
(b[0] === 0x00 && b[1] === 0x64 && b[2] === 0xff && b[3] === 0x9b && b.slice(4, 12).every((x) => x === 0)) // 64:ff9b::/96 NAT64
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=ip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ip.js","sourceRoot":"","sources":["../../src/client/ip.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { LOGIN_HINT, type AuthProvider } from "./auth-provider.js";
|
|
2
2
|
import type { MicropageConfig } from "./config.js";
|
|
3
3
|
import type { FetchLike } from "./http.js";
|
|
4
4
|
import { type LockOptions } from "./lock.js";
|
|
5
|
-
export
|
|
5
|
+
export { LOGIN_HINT };
|
|
6
6
|
/** Same location as the CLI (cli/src/auth.js), plus a MICROPAGE_CONFIG_DIR override. */
|
|
7
7
|
export declare function configDir(env?: NodeJS.ProcessEnv): string;
|
|
8
8
|
export declare function sessionFilePath(env?: NodeJS.ProcessEnv): string;
|
|
@@ -68,6 +68,7 @@ export declare class SessionAuthProvider implements AuthProvider {
|
|
|
68
68
|
private readonly log;
|
|
69
69
|
constructor(options: SessionAuthOptions);
|
|
70
70
|
get path(): string;
|
|
71
|
+
get sessionPath(): string;
|
|
71
72
|
hasSession(): Promise<boolean>;
|
|
72
73
|
/** The file's session, or the in-memory one while the file still holds the refresh token it replaced. */
|
|
73
74
|
private currentSession;
|
|
@@ -3,10 +3,11 @@ import { readFile, rename, stat, unlink, writeFile } from "node:fs/promises";
|
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { VERSION } from "../version.js";
|
|
6
|
+
import { LOGIN_HINT } from "./auth-provider.js";
|
|
6
7
|
import { MicropageError } from "./errors.js";
|
|
7
8
|
import { isJwtExpiring } from "./jwt.js";
|
|
8
9
|
import { withFileLock } from "./lock.js";
|
|
9
|
-
export
|
|
10
|
+
export { LOGIN_HINT };
|
|
10
11
|
/** Same location as the CLI (cli/src/auth.js), plus a MICROPAGE_CONFIG_DIR override. */
|
|
11
12
|
export function configDir(env = process.env) {
|
|
12
13
|
const override = env.MICROPAGE_CONFIG_DIR?.trim();
|
|
@@ -130,6 +131,9 @@ export class SessionAuthProvider {
|
|
|
130
131
|
get path() {
|
|
131
132
|
return this.store.path;
|
|
132
133
|
}
|
|
134
|
+
get sessionPath() {
|
|
135
|
+
return this.store.path;
|
|
136
|
+
}
|
|
133
137
|
async hasSession() {
|
|
134
138
|
return (await this.currentSession()) !== null;
|
|
135
139
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/client/session-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/client/session-store.ts"],"names":[],"mappings":"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"}
|
package/dist/client/tier.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ModeHints } from "../hints.js";
|
|
2
|
+
import { type AuthProvider } from "./auth-provider.js";
|
|
2
3
|
import { PRICING_URL } from "./errors.js";
|
|
3
4
|
import { type Http } from "./http.js";
|
|
4
5
|
export { PRICING_URL };
|
|
@@ -7,11 +8,30 @@ export type PlanTier = "free" | "pro" | "pro_plus";
|
|
|
7
8
|
export declare const UPGRADE_MESSAGE: string;
|
|
8
9
|
export declare const PLAN_CACHE_TTL_MS: number;
|
|
9
10
|
export declare function isPaidTier(tier: string | null | undefined): tier is "pro" | "pro_plus";
|
|
11
|
+
/** Bound on cached users; past it, expired entries are dropped before adding one. */
|
|
12
|
+
export declare const PLAN_CACHE_MAX_USERS = 1000;
|
|
13
|
+
/**
|
|
14
|
+
* Tier lookups keyed by user id. A PlanGate owns one by default; the remote
|
|
15
|
+
* server builds a gate per request and passes one long-lived cache to all of
|
|
16
|
+
* them, so the cache outlives the request without sharing anything else.
|
|
17
|
+
*/
|
|
18
|
+
export declare class PlanTierCache {
|
|
19
|
+
private readonly entries;
|
|
20
|
+
readonly inflight: Map<string, Promise<PlanTier>>;
|
|
21
|
+
get(userId: string, now: number, ttlMs: number): PlanTier | null;
|
|
22
|
+
set(userId: string, tier: PlanTier, now: number, ttlMs: number): void;
|
|
23
|
+
get size(): number;
|
|
24
|
+
clear(): void;
|
|
25
|
+
}
|
|
10
26
|
export interface PlanGateOptions {
|
|
11
27
|
http: Http;
|
|
12
28
|
auth: AuthProvider;
|
|
13
29
|
now?: () => number;
|
|
14
30
|
ttlMs?: number;
|
|
31
|
+
/** Shared across gates (one per request on the remote server). */
|
|
32
|
+
cache?: PlanTierCache;
|
|
33
|
+
/** Wording of the no-user-id error. Defaults to the stdio wording. */
|
|
34
|
+
hints?: Pick<ModeHints, "tokenNoUser">;
|
|
15
35
|
}
|
|
16
36
|
/**
|
|
17
37
|
* The CLI's client-side Pro gate: reads customers.plan_tier under RLS and
|
|
@@ -23,8 +43,8 @@ export declare class PlanGate {
|
|
|
23
43
|
private readonly auth;
|
|
24
44
|
private readonly now;
|
|
25
45
|
private readonly ttlMs;
|
|
26
|
-
private cache;
|
|
27
|
-
private
|
|
46
|
+
private readonly cache;
|
|
47
|
+
private readonly hints;
|
|
28
48
|
constructor(options: PlanGateOptions);
|
|
29
49
|
/** The signed-in user's id, read from the access token's `sub`. */
|
|
30
50
|
currentUserId(): Promise<string>;
|
package/dist/client/tier.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { currentUserId } from "./auth-provider.js";
|
|
1
2
|
import { MicropageError, PRICING_URL } from "./errors.js";
|
|
2
3
|
import { eq } from "./http.js";
|
|
3
|
-
import { decodeJwtClaims } from "./jwt.js";
|
|
4
4
|
export { PRICING_URL };
|
|
5
5
|
/** Same wording as the CLI (cli/src/plan.js), addressed to the model. */
|
|
6
6
|
export const UPGRADE_MESSAGE = "The micropage MCP server, like the micropage CLI, is available on paid plans only. " +
|
|
@@ -9,6 +9,43 @@ export const PLAN_CACHE_TTL_MS = 5 * 60 * 1000;
|
|
|
9
9
|
export function isPaidTier(tier) {
|
|
10
10
|
return tier === "pro" || tier === "pro_plus";
|
|
11
11
|
}
|
|
12
|
+
/** Bound on cached users; past it, expired entries are dropped before adding one. */
|
|
13
|
+
export const PLAN_CACHE_MAX_USERS = 1000;
|
|
14
|
+
/**
|
|
15
|
+
* Tier lookups keyed by user id. A PlanGate owns one by default; the remote
|
|
16
|
+
* server builds a gate per request and passes one long-lived cache to all of
|
|
17
|
+
* them, so the cache outlives the request without sharing anything else.
|
|
18
|
+
*/
|
|
19
|
+
export class PlanTierCache {
|
|
20
|
+
entries = new Map();
|
|
21
|
+
inflight = new Map();
|
|
22
|
+
get(userId, now, ttlMs) {
|
|
23
|
+
const hit = this.entries.get(userId);
|
|
24
|
+
return hit && now - hit.at < ttlMs ? hit.tier : null;
|
|
25
|
+
}
|
|
26
|
+
set(userId, tier, now, ttlMs) {
|
|
27
|
+
if (this.entries.size >= PLAN_CACHE_MAX_USERS && !this.entries.has(userId)) {
|
|
28
|
+
for (const [id, entry] of this.entries) {
|
|
29
|
+
if (now - entry.at >= ttlMs)
|
|
30
|
+
this.entries.delete(id);
|
|
31
|
+
}
|
|
32
|
+
// Still full of live entries: drop the oldest insertion.
|
|
33
|
+
if (this.entries.size >= PLAN_CACHE_MAX_USERS) {
|
|
34
|
+
const oldest = this.entries.keys().next();
|
|
35
|
+
if (!oldest.done)
|
|
36
|
+
this.entries.delete(oldest.value);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
this.entries.delete(userId);
|
|
40
|
+
this.entries.set(userId, { tier, at: now });
|
|
41
|
+
}
|
|
42
|
+
get size() {
|
|
43
|
+
return this.entries.size;
|
|
44
|
+
}
|
|
45
|
+
clear() {
|
|
46
|
+
this.entries.clear();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
12
49
|
/**
|
|
13
50
|
* The CLI's client-side Pro gate: reads customers.plan_tier under RLS and
|
|
14
51
|
* caches it for 5 minutes per user. A product gate, not a security boundary;
|
|
@@ -19,21 +56,19 @@ export class PlanGate {
|
|
|
19
56
|
auth;
|
|
20
57
|
now;
|
|
21
58
|
ttlMs;
|
|
22
|
-
cache
|
|
23
|
-
|
|
59
|
+
cache;
|
|
60
|
+
hints;
|
|
24
61
|
constructor(options) {
|
|
25
62
|
this.http = options.http;
|
|
26
63
|
this.auth = options.auth;
|
|
27
64
|
this.now = options.now ?? Date.now;
|
|
28
65
|
this.ttlMs = options.ttlMs ?? PLAN_CACHE_TTL_MS;
|
|
66
|
+
this.cache = options.cache ?? new PlanTierCache();
|
|
67
|
+
this.hints = options.hints;
|
|
29
68
|
}
|
|
30
69
|
/** The signed-in user's id, read from the access token's `sub`. */
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
if (typeof sub !== "string" || !sub) {
|
|
34
|
-
throw new MicropageError("SESSION_EXPIRED", "The micropage access token has no user id. Run `micropage login` in a terminal, then retry.");
|
|
35
|
-
}
|
|
36
|
-
return sub;
|
|
70
|
+
currentUserId() {
|
|
71
|
+
return currentUserId(this.auth, this.hints);
|
|
37
72
|
}
|
|
38
73
|
/**
|
|
39
74
|
* Missing customer row means free, as in the CLI. A failed lookup is not
|
|
@@ -41,21 +76,25 @@ export class PlanGate {
|
|
|
41
76
|
*/
|
|
42
77
|
async getPlanTier() {
|
|
43
78
|
const userId = await this.currentUserId();
|
|
44
|
-
const hit = this.cache;
|
|
45
|
-
if (hit
|
|
46
|
-
return hit
|
|
47
|
-
this.inflight
|
|
79
|
+
const hit = this.cache.get(userId, this.now(), this.ttlMs);
|
|
80
|
+
if (hit)
|
|
81
|
+
return hit;
|
|
82
|
+
const pending = this.cache.inflight.get(userId);
|
|
83
|
+
if (pending)
|
|
84
|
+
return pending;
|
|
85
|
+
const lookup = (async () => {
|
|
48
86
|
const row = await this.http.selectOne("customers", {
|
|
49
87
|
select: "plan_tier",
|
|
50
88
|
filters: { user_id: eq(userId) },
|
|
51
89
|
});
|
|
52
90
|
const tier = isPaidTier(row?.plan_tier) ? row.plan_tier : "free";
|
|
53
|
-
this.cache
|
|
91
|
+
this.cache.set(userId, tier, this.now(), this.ttlMs);
|
|
54
92
|
return tier;
|
|
55
93
|
})().finally(() => {
|
|
56
|
-
this.inflight
|
|
94
|
+
this.cache.inflight.delete(userId);
|
|
57
95
|
});
|
|
58
|
-
|
|
96
|
+
this.cache.inflight.set(userId, lookup);
|
|
97
|
+
return lookup;
|
|
59
98
|
}
|
|
60
99
|
/**
|
|
61
100
|
* Throws PLAN_REQUIRED unless the account is pro or pro_plus. Deploy-token
|
|
@@ -72,7 +111,7 @@ export class PlanGate {
|
|
|
72
111
|
throw new MicropageError("PLAN_REQUIRED", UPGRADE_MESSAGE);
|
|
73
112
|
}
|
|
74
113
|
clearCache() {
|
|
75
|
-
this.cache
|
|
114
|
+
this.cache.clear();
|
|
76
115
|
}
|
|
77
116
|
}
|
|
78
117
|
//# sourceMappingURL=tier.js.map
|
package/dist/client/tier.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tier.js","sourceRoot":"","sources":["../../src/client/tier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"tier.js","sourceRoot":"","sources":["../../src/client/tier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAqB,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,EAAE,EAAa,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,CAAC;AAIvB,yEAAyE;AACzE,MAAM,CAAC,MAAM,eAAe,GAC1B,qFAAqF;IACrF,uEAAuE,WAAW,eAAe,CAAC;AAEpG,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAE/C,MAAM,UAAU,UAAU,CAAC,IAA+B;IACxD,OAAO,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,UAAU,CAAC;AAC/C,CAAC;AAED,qFAAqF;AACrF,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAEzC;;;;GAIG;AACH,MAAM,OAAO,aAAa;IACP,OAAO,GAAG,IAAI,GAAG,EAA0C,CAAC;IACpE,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;IAEzD,GAAG,CAAC,MAAc,EAAE,GAAW,EAAE,KAAa;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,OAAO,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACvD,CAAC;IAED,GAAG,CAAC,MAAc,EAAE,IAAc,EAAE,GAAW,EAAE,KAAa;QAC5D,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,oBAAoB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACvC,IAAI,GAAG,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK;oBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACvD,CAAC;YACD,yDAAyD;YACzD,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,oBAAoB,EAAE,CAAC;gBAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;gBAC1C,IAAI,CAAC,MAAM,CAAC,IAAI;oBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF;AAaD;;;;GAIG;AACH,MAAM,OAAO,QAAQ;IACF,IAAI,CAAO;IACX,IAAI,CAAe;IACnB,GAAG,CAAe;IAClB,KAAK,CAAS;IACd,KAAK,CAAgB;IACrB,KAAK,CAA6C;IAEnE,YAAY,OAAwB;QAClC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;QACnC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,iBAAiB,CAAC;QAChD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,aAAa,EAAE,CAAC;QAClD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED,mEAAmE;IACnE,aAAa;QACX,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;QAEpB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,MAAM,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAA+B,WAAW,EAAE;gBAC/E,MAAM,EAAE,WAAW;gBACnB,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE;aACjC,CAAC,CAAC;YACH,MAAM,IAAI,GAAa,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;YAC3E,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YAChB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,eAAe;QACnB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc;YAAE,OAAO;QAC9C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,cAAc,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;IACpF,CAAC;IAED,UAAU;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF"}
|
package/dist/context.d.ts
CHANGED
|
@@ -1,28 +1,64 @@
|
|
|
1
1
|
import type { ClientCapabilities, ProtocolEra, ServerContext } from "@modelcontextprotocol/server";
|
|
2
|
+
import type { HostDenylist, HostLookup, PathLoader } from "./client/assets.js";
|
|
2
3
|
import type { AuthProvider } from "./client/auth-provider.js";
|
|
3
4
|
import type { MicropageConfig } from "./client/config.js";
|
|
4
|
-
import type { Http } from "./client/http.js";
|
|
5
|
+
import type { FetchLike, Http } from "./client/http.js";
|
|
5
6
|
import type { PlanGate } from "./client/tier.js";
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
import type { ConfirmationTokens } from "./guards.js";
|
|
8
|
+
import type { ModeHints } from "./hints.js";
|
|
9
|
+
/**
|
|
10
|
+
* What the user allowed this connection to do. Each defaults off. Stdio reads
|
|
11
|
+
* them from env switches the user sets in their MCP config; the remote server
|
|
12
|
+
* reads the per-connection row the user set on the consent page.
|
|
13
|
+
*/
|
|
14
|
+
export interface Permissions {
|
|
8
15
|
/** MICROPAGE_MCP_ALLOW_SEND: publish_post may email the subscriber list. */
|
|
9
16
|
allowSend: boolean;
|
|
10
17
|
/** MICROPAGE_MCP_ALLOW_DELETE: delete_project is registered at all. */
|
|
11
18
|
allowDelete: boolean;
|
|
12
19
|
/** MICROPAGE_MCP_SUBMISSIONS: form submission (PII) tools are registered. */
|
|
13
|
-
|
|
20
|
+
allowSubmissions: boolean;
|
|
14
21
|
}
|
|
15
|
-
/**
|
|
22
|
+
/** Where upload_asset may read bytes from; differs between a local and a hosted server. */
|
|
23
|
+
export interface UploadDeps {
|
|
24
|
+
/** Reads `{path}` sources. Absent on a hosted server, which then does not offer `{path}` at all. */
|
|
25
|
+
pathLoader?: PathLoader;
|
|
26
|
+
/**
|
|
27
|
+
* Resolves `{url}` hostnames so private addresses are refused before the
|
|
28
|
+
* fetch. Null only where the runtime's fetch cannot reach private networks
|
|
29
|
+
* anyway; IP-literal hosts and the denylist are checked either way.
|
|
30
|
+
*/
|
|
31
|
+
lookupHost: HostLookup | null;
|
|
32
|
+
/** Hostnames `{url}` must never fetch (our own infrastructure on a hosted server). */
|
|
33
|
+
deniedHosts?: HostDenylist;
|
|
34
|
+
/** fetch for `{url}` sources; never the micropage-authenticated client. Defaults to global fetch. */
|
|
35
|
+
fetchExternal?: FetchLike;
|
|
36
|
+
/** Largest asset upload_asset accepts, in bytes; also what its description states. Defaults to MAX_ASSET_BYTES. */
|
|
37
|
+
maxBytes?: number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Dependencies for serving one user. Stdio builds them once per process;
|
|
41
|
+
* the remote server builds them per request (with long-lived pieces such as
|
|
42
|
+
* the plan-tier cache and the token key passed in).
|
|
43
|
+
*/
|
|
16
44
|
export interface ServerDeps {
|
|
17
45
|
config: MicropageConfig;
|
|
18
46
|
auth: AuthProvider;
|
|
19
47
|
http: Http;
|
|
20
|
-
/** Paid-plan gate with its 5-minute plan_tier cache; call through gateTool() in tools. */
|
|
48
|
+
/** Paid-plan gate with its 5-minute per-user plan_tier cache; call through gateTool() in tools. */
|
|
21
49
|
tier: PlanGate;
|
|
22
|
-
|
|
50
|
+
permissions: Permissions;
|
|
51
|
+
/** Signs preview_post_send tokens; its key decides which servers accept them. */
|
|
52
|
+
confirmationTokens: ConfirmationTokens;
|
|
53
|
+
uploads: UploadDeps;
|
|
54
|
+
/** Wording that names how the user changes a setting or fixes a login. Defaults to the stdio wording. */
|
|
55
|
+
hints?: ModeHints;
|
|
56
|
+
/** Called with each error a tool handler throws, before the SDK turns it into an isError result (logging). */
|
|
57
|
+
onToolError?: (tool: string, error: unknown) => void;
|
|
23
58
|
}
|
|
24
59
|
/** What every register* function receives: the deps plus per-instance protocol facts. */
|
|
25
60
|
export interface ToolContext extends ServerDeps {
|
|
61
|
+
hints: ModeHints;
|
|
26
62
|
/** Protocol era this server instance serves (fixed per instance by the factory). */
|
|
27
63
|
era: ProtocolEra;
|
|
28
64
|
/** The calling client's declared capabilities for this request, era-correct. */
|