@browserlessapi/inferlo 0.4.0 → 0.5.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.
Files changed (96) hide show
  1. package/README.md +15 -3
  2. package/dist/adonisjs.d.ts +33 -0
  3. package/dist/adonisjs.js +30 -0
  4. package/dist/adonisjs.js.map +1 -0
  5. package/dist/ai/index.d.ts +15 -8
  6. package/dist/ai/index.js +39 -13
  7. package/dist/ai/index.js.map +1 -1
  8. package/dist/ai/providers.js +5 -4
  9. package/dist/ai/providers.js.map +1 -1
  10. package/dist/ai/public.d.ts +20 -0
  11. package/dist/ai/public.js +17 -0
  12. package/dist/ai/public.js.map +1 -0
  13. package/dist/ai/tool.d.ts +47 -0
  14. package/dist/ai/tool.js +85 -0
  15. package/dist/ai/tool.js.map +1 -0
  16. package/dist/ai-client.d.ts +3 -0
  17. package/dist/ai-client.js +8 -0
  18. package/dist/ai-client.js.map +1 -0
  19. package/dist/app.d.ts +87 -2
  20. package/dist/app.js +471 -127
  21. package/dist/app.js.map +1 -1
  22. package/dist/cli/main.js +21 -2
  23. package/dist/cli/main.js.map +1 -1
  24. package/dist/config.d.ts +16 -0
  25. package/dist/config.js +101 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/db/table.d.ts +31 -0
  28. package/dist/db/table.js +140 -1
  29. package/dist/db/table.js.map +1 -1
  30. package/dist/deprecation.d.ts +23 -0
  31. package/dist/deprecation.js +70 -0
  32. package/dist/deprecation.js.map +1 -0
  33. package/dist/describe.d.ts +27 -5
  34. package/dist/describe.js +14 -2
  35. package/dist/describe.js.map +1 -1
  36. package/dist/elysia.d.ts +49 -0
  37. package/dist/elysia.js +10 -0
  38. package/dist/elysia.js.map +1 -0
  39. package/dist/env.d.ts +2 -0
  40. package/dist/env.js +5 -4
  41. package/dist/env.js.map +1 -1
  42. package/dist/express.d.ts +38 -0
  43. package/dist/express.js +18 -0
  44. package/dist/express.js.map +1 -0
  45. package/dist/fastify.d.ts +44 -0
  46. package/dist/fastify.js +47 -0
  47. package/dist/fastify.js.map +1 -0
  48. package/dist/hono.d.ts +26 -0
  49. package/dist/hono.js +10 -0
  50. package/dist/hono.js.map +1 -0
  51. package/dist/index.d.ts +13 -4
  52. package/dist/index.js +4 -2
  53. package/dist/index.js.map +1 -1
  54. package/dist/jobs.d.ts +4 -0
  55. package/dist/jobs.js +18 -1
  56. package/dist/jobs.js.map +1 -1
  57. package/dist/logging.d.ts +23 -0
  58. package/dist/logging.js +87 -0
  59. package/dist/logging.js.map +1 -0
  60. package/dist/mcp.d.ts +0 -6
  61. package/dist/mcp.js +11 -1
  62. package/dist/mcp.js.map +1 -1
  63. package/dist/metrics.d.ts +48 -0
  64. package/dist/metrics.js +184 -0
  65. package/dist/metrics.js.map +1 -0
  66. package/dist/nestjs.d.ts +43 -0
  67. package/dist/nestjs.js +47 -0
  68. package/dist/nestjs.js.map +1 -0
  69. package/dist/openapi.d.ts +0 -1
  70. package/dist/openapi.js +4 -0
  71. package/dist/openapi.js.map +1 -1
  72. package/dist/redact.d.ts +19 -0
  73. package/dist/redact.js +150 -0
  74. package/dist/redact.js.map +1 -0
  75. package/dist/route.d.ts +18 -0
  76. package/dist/route.js.map +1 -1
  77. package/dist/secure-headers.d.ts +8 -0
  78. package/dist/secure-headers.js +61 -0
  79. package/dist/secure-headers.js.map +1 -0
  80. package/dist/serve.d.ts +53 -1
  81. package/dist/serve.js +157 -61
  82. package/dist/serve.js.map +1 -1
  83. package/dist/trpc.d.ts +57 -0
  84. package/dist/trpc.js +142 -0
  85. package/dist/trpc.js.map +1 -0
  86. package/dist/tsed.d.ts +32 -0
  87. package/dist/tsed.js +13 -0
  88. package/dist/tsed.js.map +1 -0
  89. package/llms.txt +10 -4
  90. package/package.json +57 -3
  91. package/templates/app/AGENTS.md +8 -4
  92. package/templates/app/_env.example +2 -0
  93. package/templates/app/src/app.ts +15 -8
  94. package/templates/app/src/config.ts +17 -0
  95. package/templates/app/src/server.ts +9 -9
  96. package/templates/app/src/routes/health.ts +0 -3
@@ -0,0 +1,48 @@
1
+ export interface MetricsConfig {
2
+ /** Path of the metrics endpoint. Default "/metrics". */
3
+ path?: string;
4
+ /**
5
+ * Require Authorization: Bearer <token> to read metrics (set the same token in the scraper's
6
+ * bearer_token). Without it the endpoint is public, so only leave it out when the endpoint is not
7
+ * reachable from the internet.
8
+ */
9
+ token?: string;
10
+ /** Upper bounds in seconds of the duration histogram buckets. Default 0.005 to 10 seconds. */
11
+ buckets?: readonly number[];
12
+ }
13
+ export interface ResolvedMetrics {
14
+ path: string;
15
+ token: string | undefined;
16
+ buckets: number[];
17
+ }
18
+ /** Default histogram buckets in seconds, the same as the Prometheus client libraries. */
19
+ export declare const DEFAULT_BUCKETS: number[];
20
+ /** Checks createApp({ metrics }) and returns it with defaults, or undefined when metrics are off. */
21
+ export declare function resolveMetrics(option: unknown, taken: {
22
+ path: string | false;
23
+ what: string;
24
+ }[]): ResolvedMetrics | undefined;
25
+ /** True when the request carries Authorization: Bearer <token>, compared in constant time. */
26
+ export declare function hasMetricsToken(req: Request, token: string): boolean;
27
+ export interface AppMetrics {
28
+ /** A request finished: route is the route pattern ("/tickets/:id"), or "unmatched". */
29
+ request(method: string, route: string, status: number, seconds: number): void;
30
+ inFlight(delta: number): void;
31
+ job(name: string, outcome: "done" | "retried" | "failed", seconds: number): void;
32
+ ai(usage: {
33
+ requested: string;
34
+ model: string;
35
+ kind: string;
36
+ inputTokens: number;
37
+ outputTokens: number;
38
+ cost: number;
39
+ durationMs: number;
40
+ }): void;
41
+ /** The Prometheus text exposition of every metric. */
42
+ render(): string;
43
+ }
44
+ export declare function createMetrics(info: {
45
+ app: string;
46
+ version: string;
47
+ inferlo: string;
48
+ }, buckets: readonly number[]): AppMetrics;
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Metrics: request, job and AI counters and histograms in the Prometheus text format.
3
+ *
4
+ * createApp({ metrics: { token: settings.METRICS_TOKEN } })
5
+ *
6
+ * serves GET /metrics for Prometheus, Grafana Agent, the OpenTelemetry Collector, Datadog and others.
7
+ */
8
+ import { InferloError } from "./errors.js";
9
+ /** Default histogram buckets in seconds, the same as the Prometheus client libraries. */
10
+ export const DEFAULT_BUCKETS = [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10];
11
+ /** Methods outside this list are counted as "OTHER", so clients cannot create unlimited series. */
12
+ const METHODS = new Set(["GET", "HEAD", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"]);
13
+ /** Checks createApp({ metrics }) and returns it with defaults, or undefined when metrics are off. */
14
+ export function resolveMetrics(option, taken) {
15
+ if (option === undefined || option === false)
16
+ return undefined;
17
+ const problems = [];
18
+ let path = "/metrics";
19
+ let token;
20
+ let buckets = DEFAULT_BUCKETS;
21
+ if (option !== true) {
22
+ if (!option || typeof option !== "object" || Array.isArray(option))
23
+ problems.push("metrics must be true or an object such as { token: settings.METRICS_TOKEN }");
24
+ else {
25
+ const { path: p, token: tk, buckets: b, ...rest } = option;
26
+ if (p !== undefined) {
27
+ if (typeof p !== "string" || !p.startsWith("/"))
28
+ problems.push(`path must start with "/", got ${JSON.stringify(p)}`);
29
+ else
30
+ path = p;
31
+ }
32
+ // { token: settings.METRICS_TOKEN } with the variable unset must not make the endpoint public.
33
+ if (tk === undefined && "token" in option)
34
+ problems.push("token is undefined (is the variable it comes from set?); leave token out only for a public endpoint");
35
+ else if (tk !== undefined) {
36
+ if (typeof tk !== "string" || tk.length < 16)
37
+ problems.push("token must be a string of at least 16 characters (a random secret from configuration)");
38
+ else
39
+ token = tk;
40
+ }
41
+ if (b !== undefined) {
42
+ const ok = Array.isArray(b) && b.length > 0 && b.every((n, i) => typeof n === "number" && Number.isFinite(n) && n > 0 && (i === 0 || n > b[i - 1]));
43
+ if (!ok)
44
+ problems.push("buckets must be increasing positive numbers of seconds, such as [0.1, 0.5, 1, 5]");
45
+ else
46
+ buckets = [...b];
47
+ }
48
+ for (const key of Object.keys(rest))
49
+ problems.push(`unknown option "${key}"`);
50
+ }
51
+ }
52
+ for (const { path: other, what } of taken)
53
+ if (!problems.length && other && other.replace(/\/+$/, "") === path.replace(/\/+$/, ""))
54
+ problems.push(`path ${path} is also ${what}`);
55
+ if (problems.length) {
56
+ throw new InferloError("IL6020", `Invalid metrics options: ${problems.join("; ")}.`, {
57
+ fix: 'Use createApp({ metrics: true }) or createApp({ metrics: { path: "/metrics", token: settings.METRICS_TOKEN } }).',
58
+ });
59
+ }
60
+ return { path, token, buckets };
61
+ }
62
+ /** True when the request carries Authorization: Bearer <token>, compared in constant time. */
63
+ export function hasMetricsToken(req, token) {
64
+ const header = req.headers.get("authorization") ?? "";
65
+ const match = /^Bearer\s+(.+)$/i.exec(header.trim());
66
+ if (!match)
67
+ return false;
68
+ const a = new TextEncoder().encode(match[1]);
69
+ const b = new TextEncoder().encode(token);
70
+ let diff = a.length ^ b.length;
71
+ for (let i = 0; i < b.length; i++)
72
+ diff |= (a[i] ?? 0) ^ b[i];
73
+ return diff === 0;
74
+ }
75
+ function key(labels) {
76
+ return JSON.stringify(Object.entries(labels));
77
+ }
78
+ function escape(value) {
79
+ return value.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\n/g, "\\n");
80
+ }
81
+ function labelText(labels) {
82
+ const parts = Object.entries(labels).map(([k, v]) => `${k}="${escape(v)}"`);
83
+ return parts.length ? `{${parts.join(",")}}` : "";
84
+ }
85
+ function number(n) {
86
+ if (n === Infinity)
87
+ return "+Inf";
88
+ return String(Math.round(n * 1e9) / 1e9);
89
+ }
90
+ export function createMetrics(info, buckets) {
91
+ const counters = new Map();
92
+ const histograms = new Map();
93
+ let inFlight = 0;
94
+ const add = (name, labels, value) => {
95
+ let series = counters.get(name);
96
+ if (!series)
97
+ counters.set(name, (series = new Map()));
98
+ const k = key(labels);
99
+ const entry = series.get(k);
100
+ if (entry)
101
+ entry.value += value;
102
+ else
103
+ series.set(k, { labels, value });
104
+ };
105
+ const observe = (name, labels, value) => {
106
+ let series = histograms.get(name);
107
+ if (!series)
108
+ histograms.set(name, (series = new Map()));
109
+ const k = key(labels);
110
+ let h = series.get(k);
111
+ if (!h)
112
+ series.set(k, (h = { labels, counts: buckets.map(() => 0), sum: 0, count: 0 }));
113
+ for (let i = 0; i < buckets.length; i++)
114
+ if (value <= buckets[i])
115
+ h.counts[i]++;
116
+ h.sum += value;
117
+ h.count++;
118
+ };
119
+ const help = {
120
+ inferlo_info: ["gauge", "The app's name and version and the Inferlo version (always 1)."],
121
+ inferlo_http_requests_total: ["counter", "HTTP requests by method, route pattern and status."],
122
+ inferlo_http_request_duration_seconds: ["histogram", "Time until the response headers were ready, by method and route pattern."],
123
+ inferlo_http_requests_in_flight: ["gauge", "HTTP requests being handled now."],
124
+ inferlo_job_runs_total: ["counter", "Job attempts run in this process, by job and outcome (done, retried or failed)."],
125
+ inferlo_job_duration_seconds: ["histogram", "Time each job attempt took, by job."],
126
+ inferlo_ai_calls_total: ["counter", "AI calls by requested alias or model, the model that answered, and kind (generate, stream or embed)."],
127
+ inferlo_ai_tokens_total: ["counter", "AI tokens by requested alias or model, the model that answered, and type (input or output)."],
128
+ inferlo_ai_cost_usd_total: ["counter", "AI cost in US dollars from ai.pricing, by requested alias or model and the model that answered."],
129
+ inferlo_ai_call_duration_seconds: ["histogram", "Time each AI call took, by requested alias or model and the model that answered."],
130
+ };
131
+ return {
132
+ request(method, route, status, seconds) {
133
+ const m = method.toUpperCase();
134
+ const labels = { method: METHODS.has(m) ? m : "OTHER", route };
135
+ add("inferlo_http_requests_total", { ...labels, status: String(status) }, 1);
136
+ observe("inferlo_http_request_duration_seconds", labels, seconds);
137
+ },
138
+ inFlight(delta) {
139
+ inFlight += delta;
140
+ },
141
+ job(name, outcome, seconds) {
142
+ add("inferlo_job_runs_total", { job: name, outcome }, 1);
143
+ observe("inferlo_job_duration_seconds", { job: name }, seconds);
144
+ },
145
+ ai(usage) {
146
+ const labels = { requested: usage.requested, model: usage.model };
147
+ add("inferlo_ai_calls_total", { ...labels, kind: usage.kind }, 1);
148
+ add("inferlo_ai_tokens_total", { ...labels, type: "input" }, usage.inputTokens);
149
+ add("inferlo_ai_tokens_total", { ...labels, type: "output" }, usage.outputTokens);
150
+ add("inferlo_ai_cost_usd_total", labels, usage.cost);
151
+ observe("inferlo_ai_call_duration_seconds", labels, usage.durationMs / 1000);
152
+ },
153
+ render() {
154
+ const lines = [];
155
+ const header = (name) => {
156
+ const [type, text] = help[name];
157
+ lines.push(`# HELP ${name} ${text}`, `# TYPE ${name} ${type}`);
158
+ };
159
+ header("inferlo_info");
160
+ lines.push(`inferlo_info${labelText(info)} 1`);
161
+ header("inferlo_http_requests_in_flight");
162
+ lines.push(`inferlo_http_requests_in_flight ${inFlight}`);
163
+ for (const name of Object.keys(help)) {
164
+ const series = counters.get(name);
165
+ if (series) {
166
+ header(name);
167
+ for (const { labels, value } of series.values())
168
+ lines.push(`${name}${labelText(labels)} ${number(value)}`);
169
+ }
170
+ const hist = histograms.get(name);
171
+ if (hist) {
172
+ header(name);
173
+ for (const h of hist.values()) {
174
+ buckets.forEach((le, i) => lines.push(`${name}_bucket${labelText({ ...h.labels, le: number(le) })} ${h.counts[i]}`));
175
+ lines.push(`${name}_bucket${labelText({ ...h.labels, le: "+Inf" })} ${h.count}`);
176
+ lines.push(`${name}_sum${labelText(h.labels)} ${number(h.sum)}`, `${name}_count${labelText(h.labels)} ${h.count}`);
177
+ }
178
+ }
179
+ }
180
+ return lines.join("\n") + "\n";
181
+ },
182
+ };
183
+ }
184
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Inferlo inside NestJS (11 and later), without a runtime dependency on NestJS:
3
+ *
4
+ * import { INFERLO_AI, InferloModule } from "@browserlessapi/inferlo/nestjs";
5
+ *
6
+ * @Module({ imports: [InferloModule.forRoot({ ai })] }) // or forRootAsync({ inject, useFactory })
7
+ * export class AppModule {}
8
+ *
9
+ * @Injectable()
10
+ * export class TicketsService {
11
+ * constructor(@Inject(INFERLO_AI) private readonly ai: AI) {}
12
+ * }
13
+ *
14
+ * A whole Inferlo app mounts with app.use("/api", toNodeHandler(inferloApp)) on the Express platform.
15
+ * This entry point never loads the router, database or jobs code.
16
+ */
17
+ import type { DynamicModule } from "@nestjs/common";
18
+ import type { AI } from "./ai/index.ts";
19
+ /** Injection token for the AI client: constructor(@Inject(INFERLO_AI) private readonly ai: AI) {}. */
20
+ export declare const INFERLO_AI = "INFERLO_AI";
21
+ export interface InferloModuleOptions {
22
+ /** The AI client: createAI(...) from @browserlessapi/inferlo/ai, or an Inferlo app's app.ai. */
23
+ ai: AI;
24
+ /** Make INFERLO_AI injectable in every module without importing InferloModule again. Default true. */
25
+ global?: boolean;
26
+ }
27
+ export interface InferloModuleAsyncOptions {
28
+ /** Modules whose providers useFactory needs, for example ConfigModule. */
29
+ imports?: DynamicModule["imports"];
30
+ /** Providers passed to useFactory, in order, for example [ConfigService]. */
31
+ inject?: unknown[];
32
+ /** Returns the AI client, for example from configuration: (config) => createAI({ ... }). */
33
+ useFactory: (...args: any[]) => AI | Promise<AI>;
34
+ /** Default true, as in forRoot. */
35
+ global?: boolean;
36
+ }
37
+ /** A NestJS module that provides the AI client as INFERLO_AI. Use InferloModule.forRoot({ ai }) in imports. */
38
+ export declare class InferloModule {
39
+ /** Provide an AI client you already have. */
40
+ static forRoot(options: InferloModuleOptions): DynamicModule;
41
+ /** Create the AI client when Nest starts, from other providers (for example ConfigService). */
42
+ static forRootAsync(options: InferloModuleAsyncOptions): DynamicModule;
43
+ }
package/dist/nestjs.js ADDED
@@ -0,0 +1,47 @@
1
+ import { assertAIClient } from "./ai-client.js";
2
+ import { InferloError } from "./errors.js";
3
+ /** Injection token for the AI client: constructor(@Inject(INFERLO_AI) private readonly ai: AI) {}. */
4
+ export const INFERLO_AI = "INFERLO_AI";
5
+ const fix = 'Pass createAI({ providers, models }) from "@browserlessapi/inferlo/ai", or an Inferlo app\'s app.ai: InferloModule.forRoot({ ai }).';
6
+ /** A NestJS module that provides the AI client as INFERLO_AI. Use InferloModule.forRoot({ ai }) in imports. */
7
+ export class InferloModule {
8
+ /** Provide an AI client you already have. */
9
+ static forRoot(options) {
10
+ if (!options || typeof options !== "object")
11
+ throw new InferloError("IL5016", "InferloModule.forRoot() needs options with ai.", { fix });
12
+ assertAIClient(options.ai, fix);
13
+ return {
14
+ module: InferloModule,
15
+ global: options.global ?? true,
16
+ providers: [{ provide: INFERLO_AI, useValue: options.ai }],
17
+ exports: [INFERLO_AI],
18
+ };
19
+ }
20
+ /** Create the AI client when Nest starts, from other providers (for example ConfigService). */
21
+ static forRootAsync(options) {
22
+ if (!options || typeof options.useFactory !== "function") {
23
+ throw new InferloError("IL5016", "InferloModule.forRootAsync() needs a useFactory function.", {
24
+ fix: "Use InferloModule.forRootAsync({ inject: [ConfigService], useFactory: (config) => createAI({ ... }) }).",
25
+ });
26
+ }
27
+ const { useFactory } = options;
28
+ return {
29
+ module: InferloModule,
30
+ global: options.global ?? true,
31
+ imports: options.imports ?? [],
32
+ providers: [
33
+ {
34
+ provide: INFERLO_AI,
35
+ inject: (options.inject ?? []),
36
+ useFactory: async (...args) => {
37
+ const ai = await useFactory(...args);
38
+ assertAIClient(ai, "useFactory must return createAI({ providers, models }) or an Inferlo app's app.ai.");
39
+ return ai;
40
+ },
41
+ },
42
+ ],
43
+ exports: [INFERLO_AI],
44
+ };
45
+ }
46
+ }
47
+ //# sourceMappingURL=nestjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nestjs.js","sourceRoot":"","sources":["../src/nestjs.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,sGAAsG;AACtG,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC;AAoBvC,MAAM,GAAG,GAAG,qIAAqI,CAAC;AAElJ,+GAA+G;AAC/G,MAAM,OAAO,aAAa;IACxB,6CAA6C;IAC7C,MAAM,CAAC,OAAO,CAAC,OAA6B;QAC1C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,MAAM,IAAI,YAAY,CAAC,QAAQ,EAAE,gDAAgD,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACzI,cAAc,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAChC,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;YAC9B,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;YAC1D,OAAO,EAAE,CAAC,UAAU,CAAC;SACtB,CAAC;IACJ,CAAC;IAED,+FAA+F;IAC/F,MAAM,CAAC,YAAY,CAAC,OAAkC;QACpD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;YACzD,MAAM,IAAI,YAAY,CAAC,QAAQ,EAAE,2DAA2D,EAAE;gBAC5F,GAAG,EAAE,yGAAyG;aAC/G,CAAC,CAAC;QACL,CAAC;QACD,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAC/B,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;YAC9B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,UAAU;oBACnB,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAY;oBACzC,UAAU,EAAE,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;wBACvC,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC;wBACrC,cAAc,CAAC,EAAE,EAAE,oFAAoF,CAAC,CAAC;wBACzG,OAAO,EAAE,CAAC;oBACZ,CAAC;iBACF;aACF;YACD,OAAO,EAAE,CAAC,UAAU,CAAC;SACtB,CAAC;IACJ,CAAC;CACF"}
package/dist/openapi.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- /** OpenAPI 3.1 document generated from routes. Served at /openapi.json by default. */
2
1
  import type { App } from "./app.ts";
3
2
  export declare function buildOpenAPI(app: App<any>, options: {
4
3
  description?: string;
package/dist/openapi.js CHANGED
@@ -1,3 +1,5 @@
1
+ /** OpenAPI 3.1 document generated from routes. Served at /openapi.json by default. */
2
+ import { describeDeprecation, resolveDeprecation } from "./deprecation.js";
1
3
  import { toolName } from "./mcp.js";
2
4
  const errorSchema = {
3
5
  type: "object",
@@ -52,6 +54,8 @@ export function buildOpenAPI(app, options) {
52
54
  security: !isPublic && options.auth ? [{ bearerAuth: [] }] : undefined,
53
55
  "x-inferlo-auth": o.auth ?? "user",
54
56
  "x-inferlo-tool": o.tool ? toolName(route) : undefined,
57
+ deprecated: o.deprecated ? true : undefined,
58
+ "x-inferlo-deprecation": typeof o.deprecated === "object" ? describeDeprecation(resolveDeprecation(o.deprecated, `${route.method} ${route.path}`)) : undefined,
55
59
  };
56
60
  for (const key of Object.keys(operation))
57
61
  if (operation[key] === undefined)
@@ -1 +1 @@
1
- {"version":3,"file":"openapi.js","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openapi.js","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export declare const REDACTED = "[redacted]";
2
+ /** Internal: remember the secret values an object holds (a config() result or an AI provider). */
3
+ export declare function holdSecrets<T extends object>(owner: T, values: readonly (string | undefined | null)[]): T;
4
+ export declare function secretsOf(owner: unknown): readonly string[];
5
+ export interface Redactor {
6
+ text(value: string): string;
7
+ value(value: unknown): unknown;
8
+ }
9
+ export declare function createRedactor(secretValues: readonly string[]): Redactor;
10
+ export interface LoggerLike {
11
+ info(message: string, data?: unknown, fields?: Record<string, string | number | boolean | undefined>): void;
12
+ error(message: string, data?: unknown, fields?: Record<string, string | number | boolean | undefined>): void;
13
+ }
14
+ /** A logger that redacts every message, data value and field before passing them on. */
15
+ export declare function redactingLogger(logger: LoggerLike, redactor: Redactor): LoggerLike;
16
+ /** The values of createApp({ redact }): strings, or objects that hold secrets (config() results). */
17
+ export declare function redactValues(option: unknown): string[];
18
+ /** Internal: remember a config() result and its secret values, for createApp({ redact: [settings] }). */
19
+ export declare function holdConfigSecrets<T extends object>(settings: T, values: readonly unknown[]): T;
package/dist/redact.js ADDED
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Secret redaction for everything createApp logs (and the error messages exposeErrors shows): credentials in
3
+ * headers, tokens, API keys, passwords in URLs, the app's AI provider keys and the values passed to
4
+ * createApp({ redact }). Internal: createApp wraps its logger with redactingLogger().
5
+ */
6
+ import { InferloError } from "./errors.js";
7
+ export const REDACTED = "[redacted]";
8
+ /** Secret values of objects that hold them (config() results, AI providers), looked up by createApp. */
9
+ const heldSecrets = new WeakMap();
10
+ /** Internal: remember the secret values an object holds (a config() result or an AI provider). */
11
+ export function holdSecrets(owner, values) {
12
+ const list = values.filter((v) => typeof v === "string" && v.length > 0);
13
+ if (list.length)
14
+ heldSecrets.set(owner, [...(heldSecrets.get(owner) ?? []), ...list]);
15
+ return owner;
16
+ }
17
+ export function secretsOf(owner) {
18
+ return owner && typeof owner === "object" ? (heldSecrets.get(owner) ?? []) : [];
19
+ }
20
+ const SENSITIVE_KEY = /^(authorization|proxy-authorization|cookie|set-cookie|x-api-key|api[-_]?key|apikey|password|passwd|secret|client[-_]?secret|token|access[-_]?token|refresh[-_]?token|id[-_]?token|private[-_]?key|session)$/i;
21
+ const PATTERNS = [
22
+ // Header-like "name: value" or "name=value" pairs, also inside JSON text. Cookies run to the end of the value.
23
+ [/\b(cookie|set-cookie)(["']?\s*[:=]\s*["']?)(?!\[redacted\])[^"'\r\n]+/gi, `$1$2${REDACTED}`],
24
+ [
25
+ /\b(authorization|proxy-authorization|x-api-key|api-key)(["']?\s*[:=]\s*["']?)(?:(Bearer|Basic|Token)\s+)?(?!\[redacted\]|(?:Bearer|Basic|Token)\s)[^\s"',;]+/gi,
26
+ (_match, name, separator, scheme) => `${name}${separator}${scheme ? `${scheme} ` : ""}${REDACTED}`,
27
+ ],
28
+ // Bearer <token> and Basic <credentials> anywhere else
29
+ [/\b(Bearer|Basic)\s+[A-Za-z0-9._~+/=-]{4,}/g, `$1 ${REDACTED}`],
30
+ // Passwords in connection strings and URLs: postgres://user:password@host
31
+ [/\b([a-z][a-z0-9+.-]*:\/\/[^\s:/@]*:)[^\s@/]+@/gi, `$1${REDACTED}@`],
32
+ // Secrets in query strings: ?key=..., &access_token=...
33
+ [/([?&](?:key|api_key|apikey|access_token|token|secret|password|signature|sig)=)[^&\s"'#]+/gi, `$1${REDACTED}`],
34
+ // Well-known API key formats: OpenAI and Anthropic (sk-...), Google (AIza...), GitHub tokens.
35
+ [/\bsk-[A-Za-z0-9_-]{16,}/g, REDACTED],
36
+ [/\bAIza[0-9A-Za-z_-]{30,}/g, REDACTED],
37
+ [/\bgh[pousr]_[A-Za-z0-9]{30,}/g, REDACTED],
38
+ ];
39
+ export function createRedactor(secretValues) {
40
+ // Longest first, so a secret that contains another is replaced whole. Very short values would hide normal text.
41
+ const known = [...new Set(secretValues.filter((v) => v.length >= 6))].sort((a, b) => b.length - a.length);
42
+ const text = (input) => {
43
+ let out = input;
44
+ for (const secret of known)
45
+ if (out.includes(secret))
46
+ out = out.split(secret).join(REDACTED);
47
+ for (const [pattern, replacement] of PATTERNS)
48
+ out = out.replace(pattern, replacement);
49
+ return out;
50
+ };
51
+ const value = (input, depth = 0, seen = new WeakMap()) => {
52
+ if (typeof input === "string")
53
+ return text(input);
54
+ if (!input || typeof input !== "object")
55
+ return input;
56
+ if (seen.has(input))
57
+ return seen.get(input);
58
+ if (depth > 8)
59
+ return input;
60
+ if (input instanceof Error) {
61
+ const copy = Object.create(Object.getPrototypeOf(input));
62
+ seen.set(input, copy);
63
+ Object.defineProperty(copy, "message", { value: text(input.message), writable: true, configurable: true });
64
+ if (input.stack !== undefined)
65
+ Object.defineProperty(copy, "stack", { value: text(input.stack), writable: true, configurable: true });
66
+ if (input.name !== Object.getPrototypeOf(input)?.name)
67
+ Object.defineProperty(copy, "name", { value: input.name, writable: true, configurable: true });
68
+ for (const key of Object.keys(input))
69
+ copy[key] = redactEntry(key, input[key], depth, seen);
70
+ if ("cause" in input)
71
+ Object.defineProperty(copy, "cause", { value: value(input.cause, depth + 1, seen), writable: true, configurable: true });
72
+ return copy;
73
+ }
74
+ if (typeof Headers !== "undefined" && input instanceof Headers) {
75
+ const out = {};
76
+ seen.set(input, out);
77
+ input.forEach((v, k) => (out[k] = redactEntry(k, v, depth, seen)));
78
+ return out;
79
+ }
80
+ if (Array.isArray(input)) {
81
+ const out = [];
82
+ seen.set(input, out);
83
+ for (const item of input)
84
+ out.push(value(item, depth + 1, seen));
85
+ return out;
86
+ }
87
+ const proto = Object.getPrototypeOf(input);
88
+ if (proto !== Object.prototype && proto !== null)
89
+ return input;
90
+ const out = {};
91
+ seen.set(input, out);
92
+ for (const [k, v] of Object.entries(input))
93
+ out[k] = redactEntry(k, v, depth, seen);
94
+ return out;
95
+ };
96
+ const redactEntry = (key, entry, depth, seen) => {
97
+ if (SENSITIVE_KEY.test(key) && entry !== undefined && entry !== null && entry !== "")
98
+ return REDACTED;
99
+ return value(entry, depth + 1, seen);
100
+ };
101
+ return { text, value: (input) => value(input) };
102
+ }
103
+ /** A logger that redacts every message, data value and field before passing them on. */
104
+ export function redactingLogger(logger, redactor) {
105
+ const pass = (level, message, data, fields) => {
106
+ const text = redactor.text(String(message));
107
+ if (fields !== undefined) {
108
+ const clean = {};
109
+ for (const [key, value] of Object.entries(fields))
110
+ clean[key] = typeof value === "string" ? redactor.text(value) : value;
111
+ return logger[level](text, data === undefined ? undefined : redactor.value(data), clean);
112
+ }
113
+ return data === undefined ? logger[level](text) : logger[level](text, redactor.value(data));
114
+ };
115
+ return {
116
+ info: (message, data, fields) => pass("info", message, data, fields),
117
+ error: (message, data, fields) => pass("error", message, data, fields),
118
+ };
119
+ }
120
+ /** The values of createApp({ redact }): strings, or objects that hold secrets (config() results). */
121
+ export function redactValues(option) {
122
+ if (option === undefined)
123
+ return [];
124
+ if (!Array.isArray(option))
125
+ throw invalidRedact(`createApp({ redact }) must be an array, got ${typeof option}.`);
126
+ const out = [];
127
+ option.forEach((item, i) => {
128
+ if (item === undefined || item === null || item === "")
129
+ return; // an unset optional variable
130
+ if (typeof item === "string")
131
+ out.push(item);
132
+ else if (typeof item === "object" && configs.has(item))
133
+ out.push(...secretsOf(item));
134
+ else
135
+ throw invalidRedact(`createApp({ redact }) item ${i} is ${typeof item === "object" ? "an object that is not a config() result" : `a ${typeof item}`}.`);
136
+ });
137
+ return out;
138
+ }
139
+ const configs = new WeakSet();
140
+ /** Internal: remember a config() result and its secret values, for createApp({ redact: [settings] }). */
141
+ export function holdConfigSecrets(settings, values) {
142
+ configs.add(settings);
143
+ return holdSecrets(settings, values.map((v) => (v === undefined || v === null ? undefined : String(v))));
144
+ }
145
+ function invalidRedact(message) {
146
+ return new InferloError("IL6018", message, {
147
+ fix: "Pass the values to hide from logs, or your config() result: createApp({ redact: [settings, process.env.WEBHOOK_SECRET] }).",
148
+ });
149
+ }
150
+ //# sourceMappingURL=redact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.js","sourceRoot":"","sources":["../src/redact.ts"],"names":[],"mappings":"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"}
package/dist/route.d.ts CHANGED
@@ -8,6 +8,7 @@
8
8
  *
9
9
  * Secure by default: routes require a signed-in user unless you set auth: "public".
10
10
  */
11
+ import type { Deprecation } from "./deprecation.ts";
11
12
  import type { AI } from "./ai/index.ts";
12
13
  import type { Db } from "./db/table.ts";
13
14
  import type { Jobs } from "./jobs.ts";
@@ -60,6 +61,16 @@ export interface RouteOptions<B extends AnySchema | undefined, Q extends ObjectS
60
61
  tool?: boolean | ToolOptions;
61
62
  /** Limit requests per user or IP: { max: 10, per: "minute", by: "user" }. More raise IL2005 (HTTP 429). */
62
63
  rateLimit?: RateLimit;
64
+ /**
65
+ * Longest time in milliseconds this route may take (reading the body and running the handler) before it
66
+ * answers 503 IL2007 and ctx.signal is aborted. Overrides createApp({ requestTimeoutMs }); false turns it off.
67
+ */
68
+ timeoutMs?: number | false;
69
+ /**
70
+ * Mark the route deprecated: true, or { since, sunset, link } to also send the Deprecation, Sunset and
71
+ * Link rel="deprecation" headers on every response. Shown in OpenAPI, describe and MCP tool descriptions.
72
+ */
73
+ deprecated?: boolean | Deprecation;
63
74
  }
64
75
  type PathParams<P extends string> = P extends `${string}:${infer Param}/${infer Rest}` ? {
65
76
  [K in Param | keyof PathParams<`/${Rest}`>]: string;
@@ -86,6 +97,13 @@ export interface Context<Body, Query, Params, User> {
86
97
  header(name: string, value: string): void;
87
98
  /** Values shared by middleware for this request. */
88
99
  state: Record<string, unknown>;
100
+ /**
101
+ * Aborted when the request times out (requestTimeoutMs or the route's timeoutMs) or the client disconnects.
102
+ * ctx.ai calls use it automatically; pass it to fetch and other slow work: fetch(url, { signal }).
103
+ */
104
+ signal: AbortSignal;
105
+ /** This request's id: sent back in the X-Request-Id header and added to the request's log entries. */
106
+ requestId: string;
89
107
  /** Run work after the response is sent (logging, webhooks). Errors are logged, not thrown. */
90
108
  waitUntil(promise: Promise<unknown>): void;
91
109
  }
package/dist/route.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../src/route.ts"],"names":[],"mappings":"AA6GA,MAAM,OAAO,YAAY;IACd,MAAM,CAAS;IACf,IAAI,CAAO;IACX,OAAO,CAAwB;IAExC,YAAY,MAAc,EAAE,IAAU,EAAE,OAA8B;QACpE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,qFAAqF;IACrF,MAAM,CACJ,OAQC;QAED,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAuC,EAE5I,CAAC;IACJ,CAAC;CACF;AAED,SAAS,OAAO,CAAC,MAAc;IAC7B,OAAO,CAOL,IAAU,EACV,UAAgD,EAAE,EAClD,EAAE,CAAC,IAAI,YAAY,CAAmB,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC;IACrB,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC;CAC1B,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAK,KAAkB,CAAC,IAAI,KAAK,eAAe,CAAC;AACrG,CAAC"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../src/route.ts"],"names":[],"mappings":"AA+HA,MAAM,OAAO,YAAY;IACd,MAAM,CAAS;IACf,IAAI,CAAO;IACX,OAAO,CAAwB;IAExC,YAAY,MAAc,EAAE,IAAU,EAAE,OAA8B;QACpE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,qFAAqF;IACrF,MAAM,CACJ,OAQC;QAED,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAuC,EAE5I,CAAC;IACJ,CAAC;CACF;AAED,SAAS,OAAO,CAAC,MAAc;IAC7B,OAAO,CAOL,IAAU,EACV,UAAgD,EAAE,EAClD,EAAE,CAAC,IAAI,YAAY,CAAmB,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC;IACrB,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC;CAC1B,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAK,KAAkB,CAAC,IAAI,KAAK,eAAe,CAAC;AACrG,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** Header name to value; false leaves the header out. Names are case-insensitive. */
2
+ export type SecureHeadersConfig = Record<string, string | false>;
3
+ /** Sent on every response by default. Strict-Transport-Security is sent only over HTTPS. */
4
+ export declare const DEFAULT_SECURE_HEADERS: Readonly<Record<string, string>>;
5
+ /** The headers to send (lowercase names), from createApp({ secureHeaders }). */
6
+ export declare function resolveSecureHeaders(option: boolean | SecureHeadersConfig | undefined): [string, string][];
7
+ /** Add the headers the response does not set itself. Strict-Transport-Security only when the request came over HTTPS. */
8
+ export declare function applySecureHeaders(response: Response, headers: [string, string][], https: boolean): Response;