@sweny-ai/providers 1.1.5 → 1.3.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/catalog.d.ts.map +1 -1
- package/dist/catalog.js +249 -0
- package/dist/catalog.js.map +1 -1
- package/dist/factories.d.ts +3 -1
- package/dist/factories.d.ts.map +1 -1
- package/dist/factories.js +35 -2
- package/dist/factories.js.map +1 -1
- package/dist/incident/opsgenie.d.ts +1 -1
- package/dist/observability/axiom.d.ts +12 -0
- package/dist/observability/axiom.d.ts.map +1 -0
- package/dist/observability/axiom.js +179 -0
- package/dist/observability/axiom.js.map +1 -0
- package/dist/observability/betterstack.d.ts +15 -0
- package/dist/observability/betterstack.d.ts.map +1 -0
- package/dist/observability/betterstack.js +168 -0
- package/dist/observability/betterstack.js.map +1 -0
- package/dist/observability/fly.d.ts +15 -0
- package/dist/observability/fly.d.ts.map +1 -0
- package/dist/observability/fly.js +192 -0
- package/dist/observability/fly.js.map +1 -0
- package/dist/observability/heroku.d.ts +11 -0
- package/dist/observability/heroku.d.ts.map +1 -0
- package/dist/observability/heroku.js +171 -0
- package/dist/observability/heroku.js.map +1 -0
- package/dist/observability/honeycomb.d.ts +11 -0
- package/dist/observability/honeycomb.d.ts.map +1 -0
- package/dist/observability/honeycomb.js +184 -0
- package/dist/observability/honeycomb.js.map +1 -0
- package/dist/observability/index.d.ts +10 -0
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +10 -0
- package/dist/observability/index.js.map +1 -1
- package/dist/observability/netlify.d.ts +15 -0
- package/dist/observability/netlify.d.ts.map +1 -0
- package/dist/observability/netlify.js +159 -0
- package/dist/observability/netlify.js.map +1 -0
- package/dist/observability/newrelic.d.ts +1 -1
- package/dist/observability/opsgenie.d.ts +14 -0
- package/dist/observability/opsgenie.d.ts.map +1 -0
- package/dist/observability/opsgenie.js +144 -0
- package/dist/observability/opsgenie.js.map +1 -0
- package/dist/observability/render.d.ts +15 -0
- package/dist/observability/render.d.ts.map +1 -0
- package/dist/observability/render.js +133 -0
- package/dist/observability/render.js.map +1 -0
- package/dist/observability/supabase.d.ts +15 -0
- package/dist/observability/supabase.d.ts.map +1 -0
- package/dist/observability/supabase.js +192 -0
- package/dist/observability/supabase.js.map +1 -0
- package/dist/observability/vercel.d.ts +16 -0
- package/dist/observability/vercel.d.ts.map +1 -0
- package/dist/observability/vercel.js +163 -0
- package/dist/observability/vercel.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { consoleLogger } from "../logger.js";
|
|
3
|
+
import { ProviderApiError } from "../errors.js";
|
|
4
|
+
export const renderConfigSchema = z.object({
|
|
5
|
+
apiKey: z.string().min(1, "Render API key is required"),
|
|
6
|
+
serviceId: z.string().min(1, "Render service ID is required"),
|
|
7
|
+
logger: z.custom().optional(),
|
|
8
|
+
});
|
|
9
|
+
export const renderProviderConfigSchema = {
|
|
10
|
+
role: "observability",
|
|
11
|
+
name: "Render",
|
|
12
|
+
fields: [
|
|
13
|
+
{ key: "apiKey", envVar: "RENDER_API_KEY", description: "Render API key" },
|
|
14
|
+
{ key: "serviceId", envVar: "RENDER_SERVICE_ID", description: "Render service ID" },
|
|
15
|
+
],
|
|
16
|
+
};
|
|
17
|
+
export function render(config) {
|
|
18
|
+
const parsed = renderConfigSchema.parse(config);
|
|
19
|
+
const provider = new RenderProvider(parsed);
|
|
20
|
+
return Object.assign(provider, { configSchema: renderProviderConfigSchema });
|
|
21
|
+
}
|
|
22
|
+
function timeRangeToIso(range) {
|
|
23
|
+
const match = /^(\d+)(h|d|w)$/.exec(range);
|
|
24
|
+
if (!match)
|
|
25
|
+
return new Date(Date.now() - 3_600_000).toISOString();
|
|
26
|
+
const [, n, unit] = match;
|
|
27
|
+
const ms = { h: 3_600_000, d: 86_400_000, w: 604_800_000 }[unit];
|
|
28
|
+
return new Date(Date.now() - parseInt(n, 10) * ms).toISOString();
|
|
29
|
+
}
|
|
30
|
+
function inferLevel(message) {
|
|
31
|
+
const lower = message.toLowerCase();
|
|
32
|
+
if (/\b(fatal|error|exception|panic|failed)\b/.test(lower))
|
|
33
|
+
return "error";
|
|
34
|
+
if (/\b(warn|warning)\b/.test(lower))
|
|
35
|
+
return "warning";
|
|
36
|
+
return "info";
|
|
37
|
+
}
|
|
38
|
+
class RenderProvider {
|
|
39
|
+
apiKey;
|
|
40
|
+
serviceId;
|
|
41
|
+
log;
|
|
42
|
+
constructor(config) {
|
|
43
|
+
this.apiKey = config.apiKey;
|
|
44
|
+
this.serviceId = config.serviceId;
|
|
45
|
+
this.log = config.logger ?? consoleLogger;
|
|
46
|
+
}
|
|
47
|
+
async request(path) {
|
|
48
|
+
const url = `https://api.render.com${path}`;
|
|
49
|
+
const response = await fetch(url, {
|
|
50
|
+
headers: { Authorization: `Bearer ${this.apiKey}`, Accept: "application/json" },
|
|
51
|
+
});
|
|
52
|
+
if (!response.ok) {
|
|
53
|
+
const body = await response.text().catch(() => "");
|
|
54
|
+
throw new ProviderApiError("Render", response.status, response.statusText, body);
|
|
55
|
+
}
|
|
56
|
+
return (await response.json());
|
|
57
|
+
}
|
|
58
|
+
async verifyAccess() {
|
|
59
|
+
this.log.info(`Verifying Render access (service: ${this.serviceId})`);
|
|
60
|
+
await this.request(`/v1/services/${encodeURIComponent(this.serviceId)}`);
|
|
61
|
+
this.log.info("Render API access verified");
|
|
62
|
+
}
|
|
63
|
+
async queryLogs(opts) {
|
|
64
|
+
this.log.info(`Querying Render logs (severity: ${opts.severity}, range: ${opts.timeRange})`);
|
|
65
|
+
const startTime = timeRangeToIso(opts.timeRange);
|
|
66
|
+
const endTime = new Date().toISOString();
|
|
67
|
+
const result = await this.request(`/v1/services/${encodeURIComponent(this.serviceId)}/logs?startTime=${encodeURIComponent(startTime)}&endTime=${encodeURIComponent(endTime)}&limit=200&direction=backward`);
|
|
68
|
+
let logs = (result.logs ?? []).map((log) => ({
|
|
69
|
+
timestamp: log.timestamp,
|
|
70
|
+
service: log.instance?.serviceId ?? this.serviceId,
|
|
71
|
+
level: inferLevel(log.message),
|
|
72
|
+
message: log.message,
|
|
73
|
+
attributes: log.instance ? { instanceId: log.instance.id } : {},
|
|
74
|
+
}));
|
|
75
|
+
// Post-filter by severity
|
|
76
|
+
if (opts.severity === "error")
|
|
77
|
+
logs = logs.filter((l) => l.level === "error");
|
|
78
|
+
else if (opts.severity === "warning")
|
|
79
|
+
logs = logs.filter((l) => l.level === "warning");
|
|
80
|
+
// Post-filter by service
|
|
81
|
+
if (opts.serviceFilter !== "*")
|
|
82
|
+
logs = logs.filter((l) => l.service.includes(opts.serviceFilter));
|
|
83
|
+
const resultLogs = logs.slice(0, 200);
|
|
84
|
+
this.log.info(`Found ${resultLogs.length} Render log entries`);
|
|
85
|
+
return resultLogs;
|
|
86
|
+
}
|
|
87
|
+
async aggregate(opts) {
|
|
88
|
+
this.log.info(`Aggregating Render errors (range: ${opts.timeRange})`);
|
|
89
|
+
const startTime = timeRangeToIso(opts.timeRange);
|
|
90
|
+
const result = await this.request(`/v1/services/${encodeURIComponent(this.serviceId)}/logs?startTime=${encodeURIComponent(startTime)}&limit=200&direction=backward`);
|
|
91
|
+
let errorLogs = (result.logs ?? []).filter((l) => inferLevel(l.message) === "error");
|
|
92
|
+
// Post-filter by service
|
|
93
|
+
if (opts.serviceFilter !== "*") {
|
|
94
|
+
errorLogs = errorLogs.filter((l) => (l.instance?.serviceId ?? this.serviceId).includes(opts.serviceFilter));
|
|
95
|
+
}
|
|
96
|
+
if (errorLogs.length === 0)
|
|
97
|
+
return [];
|
|
98
|
+
return [{ service: this.serviceId, count: errorLogs.length }];
|
|
99
|
+
}
|
|
100
|
+
getAgentEnv() {
|
|
101
|
+
return { RENDER_API_KEY: this.apiKey, RENDER_SERVICE_ID: this.serviceId };
|
|
102
|
+
}
|
|
103
|
+
getPromptInstructions() {
|
|
104
|
+
return `### Render Logs API
|
|
105
|
+
- \`RENDER_API_KEY\` - API key (use in Authorization: Bearer header)
|
|
106
|
+
- \`RENDER_SERVICE_ID\` - Service ID (${this.serviceId})
|
|
107
|
+
|
|
108
|
+
**DO NOT make up data** - only use real data from APIs. If no data, report that honestly.
|
|
109
|
+
|
|
110
|
+
You have DIRECT ACCESS to Render's API to query runtime logs from web services and workers.
|
|
111
|
+
|
|
112
|
+
**Note**: Render logs API does not return a severity field — infer level from message content.
|
|
113
|
+
|
|
114
|
+
#### Example: Verify access (get service details)
|
|
115
|
+
\`\`\`bash
|
|
116
|
+
curl -s "https://api.render.com/v1/services/\${RENDER_SERVICE_ID}" \\
|
|
117
|
+
-H "Authorization: Bearer \${RENDER_API_KEY}" \\
|
|
118
|
+
-H "Accept: application/json"
|
|
119
|
+
\`\`\`
|
|
120
|
+
|
|
121
|
+
#### Example: Query recent logs (last 1h)
|
|
122
|
+
\`\`\`bash
|
|
123
|
+
SINCE=$(date -u -v-1H +"%Y-%m-%dT%H:%M:%SZ" 2>/dev/null || date -u --date="1 hour ago" +"%Y-%m-%dT%H:%M:%SZ")
|
|
124
|
+
curl -s "https://api.render.com/v1/services/\${RENDER_SERVICE_ID}/logs?startTime=\${SINCE}&limit=200&direction=backward" \\
|
|
125
|
+
-H "Authorization: Bearer \${RENDER_API_KEY}" \\
|
|
126
|
+
-H "Accept: application/json"
|
|
127
|
+
\`\`\`
|
|
128
|
+
|
|
129
|
+
Response shape: \`{ "logs": [{ "id": "...", "timestamp": "...", "message": "...", "instance": { "id": "...", "serviceId": "..." } }] }\`
|
|
130
|
+
Severity is inferred: "error"/"exception"/"fatal" → error, "warn"/"warning" → warning, else info.`;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/observability/render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Logger } from "../logger.js";
|
|
3
|
+
import type { ObservabilityProvider } from "./types.js";
|
|
4
|
+
import type { ProviderConfigSchema } from "../config-schema.js";
|
|
5
|
+
export declare const supabaseConfigSchema: z.ZodObject<{
|
|
6
|
+
managementApiKey: z.ZodString;
|
|
7
|
+
projectRef: z.ZodString;
|
|
8
|
+
logger: z.ZodOptional<z.ZodCustom<Logger, Logger>>;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
export type SupabaseConfig = z.infer<typeof supabaseConfigSchema>;
|
|
11
|
+
export declare const supabaseProviderConfigSchema: ProviderConfigSchema;
|
|
12
|
+
export declare function supabase(config: SupabaseConfig): ObservabilityProvider & {
|
|
13
|
+
configSchema: ProviderConfigSchema;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=supabase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/observability/supabase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,KAAK,EAAE,qBAAqB,EAA8C,MAAM,YAAY,CAAC;AACpG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,eAAO,MAAM,oBAAoB;;;;iBAI/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,4BAA4B,EAAE,oBAO1C,CAAC;AAEF,wBAAgB,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,qBAAqB,GAAG;IAAE,YAAY,EAAE,oBAAoB,CAAA;CAAE,CAI/G"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { consoleLogger } from "../logger.js";
|
|
3
|
+
import { ProviderApiError } from "../errors.js";
|
|
4
|
+
export const supabaseConfigSchema = z.object({
|
|
5
|
+
managementApiKey: z.string().min(1, "Supabase management API key is required"),
|
|
6
|
+
projectRef: z.string().min(1, "Supabase project ref is required"),
|
|
7
|
+
logger: z.custom().optional(),
|
|
8
|
+
});
|
|
9
|
+
export const supabaseProviderConfigSchema = {
|
|
10
|
+
role: "observability",
|
|
11
|
+
name: "Supabase",
|
|
12
|
+
fields: [
|
|
13
|
+
{ key: "managementApiKey", envVar: "SUPABASE_MANAGEMENT_KEY", description: "Supabase management API key" },
|
|
14
|
+
{ key: "projectRef", envVar: "SUPABASE_PROJECT_REF", description: "Supabase project reference ID" },
|
|
15
|
+
],
|
|
16
|
+
};
|
|
17
|
+
export function supabase(config) {
|
|
18
|
+
const parsed = supabaseConfigSchema.parse(config);
|
|
19
|
+
const provider = new SupabaseProvider(parsed);
|
|
20
|
+
return Object.assign(provider, { configSchema: supabaseProviderConfigSchema });
|
|
21
|
+
}
|
|
22
|
+
function timeRangeToIso(range) {
|
|
23
|
+
const match = /^(\d+)(h|d|w)$/.exec(range);
|
|
24
|
+
if (!match)
|
|
25
|
+
return new Date(Date.now() - 3_600_000).toISOString();
|
|
26
|
+
const [, n, unit] = match;
|
|
27
|
+
const ms = { h: 3_600_000, d: 86_400_000, w: 604_800_000 }[unit];
|
|
28
|
+
return new Date(Date.now() - parseInt(n, 10) * ms).toISOString();
|
|
29
|
+
}
|
|
30
|
+
function sourceTables(serviceFilter) {
|
|
31
|
+
if (serviceFilter === "*")
|
|
32
|
+
return ["postgres_logs", "edge_logs", "api_logs", "auth_logs"];
|
|
33
|
+
const map = {
|
|
34
|
+
postgres: "postgres_logs",
|
|
35
|
+
edge: "edge_logs",
|
|
36
|
+
api: "api_logs",
|
|
37
|
+
auth: "auth_logs",
|
|
38
|
+
storage: "storage_logs",
|
|
39
|
+
realtime: "realtime_logs",
|
|
40
|
+
};
|
|
41
|
+
return [map[serviceFilter] ?? "postgres_logs"];
|
|
42
|
+
}
|
|
43
|
+
function severityClause(severity) {
|
|
44
|
+
if (severity === "error") {
|
|
45
|
+
return "AND (LOWER(event_message) LIKE '%error%' OR LOWER(event_message) LIKE '%exception%' OR LOWER(event_message) LIKE '%fatal%')";
|
|
46
|
+
}
|
|
47
|
+
if (severity === "warning" || severity === "warn") {
|
|
48
|
+
return "AND LOWER(event_message) LIKE '%warn%'";
|
|
49
|
+
}
|
|
50
|
+
return "";
|
|
51
|
+
}
|
|
52
|
+
function tableToService(table) {
|
|
53
|
+
return table.replace("_logs", "");
|
|
54
|
+
}
|
|
55
|
+
function inferLevel(message) {
|
|
56
|
+
const lower = message.toLowerCase();
|
|
57
|
+
if (/\b(fatal|error|exception|panic)\b/.test(lower))
|
|
58
|
+
return "error";
|
|
59
|
+
if (/\b(warn|warning)\b/.test(lower))
|
|
60
|
+
return "warning";
|
|
61
|
+
return "info";
|
|
62
|
+
}
|
|
63
|
+
class SupabaseProvider {
|
|
64
|
+
managementApiKey;
|
|
65
|
+
projectRef;
|
|
66
|
+
log;
|
|
67
|
+
constructor(config) {
|
|
68
|
+
this.managementApiKey = config.managementApiKey;
|
|
69
|
+
this.projectRef = config.projectRef;
|
|
70
|
+
this.log = config.logger ?? consoleLogger;
|
|
71
|
+
}
|
|
72
|
+
async request(path, body) {
|
|
73
|
+
const url = `https://api.supabase.com${path}`;
|
|
74
|
+
const response = await fetch(url, {
|
|
75
|
+
method: body ? "POST" : "GET",
|
|
76
|
+
headers: {
|
|
77
|
+
Authorization: `Bearer ${this.managementApiKey}`,
|
|
78
|
+
...(body ? { "Content-Type": "application/json" } : {}),
|
|
79
|
+
},
|
|
80
|
+
...(body ? { body: JSON.stringify(body) } : {}),
|
|
81
|
+
});
|
|
82
|
+
if (!response.ok) {
|
|
83
|
+
const text = await response.text().catch(() => "");
|
|
84
|
+
throw new ProviderApiError("Supabase", response.status, response.statusText, text);
|
|
85
|
+
}
|
|
86
|
+
return (await response.json());
|
|
87
|
+
}
|
|
88
|
+
async verifyAccess() {
|
|
89
|
+
this.log.info(`Verifying Supabase access (project: ${this.projectRef})`);
|
|
90
|
+
await this.request(`/v1/projects/${this.projectRef}`);
|
|
91
|
+
this.log.info("Supabase API access verified");
|
|
92
|
+
}
|
|
93
|
+
async queryTable(table, sinceIso, extraClause) {
|
|
94
|
+
const sql = [
|
|
95
|
+
`SELECT timestamp, event_message, metadata`,
|
|
96
|
+
`FROM ${table}`,
|
|
97
|
+
`WHERE timestamp > '${sinceIso}'`,
|
|
98
|
+
extraClause,
|
|
99
|
+
`ORDER BY timestamp DESC`,
|
|
100
|
+
`LIMIT 100`,
|
|
101
|
+
]
|
|
102
|
+
.filter(Boolean)
|
|
103
|
+
.join(" ");
|
|
104
|
+
const result = await this.request(`/v1/projects/${this.projectRef}/analytics/endpoints/logs.all`, { sql });
|
|
105
|
+
return result.result ?? [];
|
|
106
|
+
}
|
|
107
|
+
async queryLogs(opts) {
|
|
108
|
+
this.log.info(`Querying Supabase logs (severity: ${opts.severity}, range: ${opts.timeRange})`);
|
|
109
|
+
const sinceIso = timeRangeToIso(opts.timeRange);
|
|
110
|
+
const tables = sourceTables(opts.serviceFilter);
|
|
111
|
+
const extraClause = severityClause(opts.severity);
|
|
112
|
+
const all = [];
|
|
113
|
+
for (const table of tables) {
|
|
114
|
+
const rows = await this.queryTable(table, sinceIso, extraClause);
|
|
115
|
+
for (const row of rows) {
|
|
116
|
+
all.push({
|
|
117
|
+
timestamp: row.timestamp,
|
|
118
|
+
service: tableToService(table),
|
|
119
|
+
level: inferLevel(row.event_message),
|
|
120
|
+
message: row.event_message,
|
|
121
|
+
attributes: row.metadata ?? {},
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
all.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
|
|
126
|
+
const result = all.slice(0, 200);
|
|
127
|
+
this.log.info(`Found ${result.length} Supabase log entries`);
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
async aggregate(opts) {
|
|
131
|
+
this.log.info(`Aggregating Supabase errors (range: ${opts.timeRange})`);
|
|
132
|
+
const sinceIso = timeRangeToIso(opts.timeRange);
|
|
133
|
+
const tables = sourceTables(opts.serviceFilter);
|
|
134
|
+
const errorClause = severityClause("error");
|
|
135
|
+
const results = [];
|
|
136
|
+
for (const table of tables) {
|
|
137
|
+
const rows = await this.queryTable(table, sinceIso, errorClause);
|
|
138
|
+
if (rows.length > 0) {
|
|
139
|
+
results.push({ service: tableToService(table), count: rows.length });
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
results.sort((a, b) => b.count - a.count);
|
|
143
|
+
this.log.info(`Aggregated ${results.length} service groups`);
|
|
144
|
+
return results;
|
|
145
|
+
}
|
|
146
|
+
getAgentEnv() {
|
|
147
|
+
return {
|
|
148
|
+
SUPABASE_MANAGEMENT_KEY: this.managementApiKey,
|
|
149
|
+
SUPABASE_PROJECT_REF: this.projectRef,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
getPromptInstructions() {
|
|
153
|
+
return `### Supabase Logs API
|
|
154
|
+
- \`SUPABASE_MANAGEMENT_KEY\` - Management API key (use in Authorization: Bearer header)
|
|
155
|
+
- \`SUPABASE_PROJECT_REF\` - Project reference ID (${this.projectRef})
|
|
156
|
+
|
|
157
|
+
**DO NOT make up data** - only use real data from APIs. If no data, report that honestly.
|
|
158
|
+
|
|
159
|
+
You have DIRECT ACCESS to Supabase's Management API to query project logs via SQL.
|
|
160
|
+
|
|
161
|
+
Available log tables: \`postgres_logs\`, \`edge_logs\`, \`api_logs\`, \`auth_logs\`, \`storage_logs\`, \`realtime_logs\`
|
|
162
|
+
|
|
163
|
+
All tables have: \`timestamp\` (ISO 8601 string), \`event_message\` (string), \`metadata\` (JSON object).
|
|
164
|
+
Use ISO 8601 timestamps in WHERE clauses — e.g., \`'2024-01-01T00:00:00.000Z'\`.
|
|
165
|
+
To get "last 1 hour": compute \`new Date(Date.now() - 3600000).toISOString()\` and substitute below.
|
|
166
|
+
|
|
167
|
+
#### Example: Verify access / get project info
|
|
168
|
+
\`\`\`bash
|
|
169
|
+
curl -s "https://api.supabase.com/v1/projects/\${SUPABASE_PROJECT_REF}" \\
|
|
170
|
+
-H "Authorization: Bearer \${SUPABASE_MANAGEMENT_KEY}"
|
|
171
|
+
\`\`\`
|
|
172
|
+
|
|
173
|
+
#### Example: Query recent postgres errors (last 1h)
|
|
174
|
+
\`\`\`bash
|
|
175
|
+
SINCE=$(date -u -v-1H +"%Y-%m-%dT%H:%M:%S.000Z" 2>/dev/null || date -u --date="1 hour ago" +"%Y-%m-%dT%H:%M:%S.000Z")
|
|
176
|
+
curl -s -X POST "https://api.supabase.com/v1/projects/\${SUPABASE_PROJECT_REF}/analytics/endpoints/logs.all" \\
|
|
177
|
+
-H "Authorization: Bearer \${SUPABASE_MANAGEMENT_KEY}" \\
|
|
178
|
+
-H "Content-Type: application/json" \\
|
|
179
|
+
-d "{\"sql\": \"SELECT timestamp, event_message, metadata FROM postgres_logs WHERE timestamp > '$SINCE' AND (LOWER(event_message) LIKE '%error%' OR LOWER(event_message) LIKE '%fatal%') ORDER BY timestamp DESC LIMIT 100\"}"
|
|
180
|
+
\`\`\`
|
|
181
|
+
|
|
182
|
+
#### Example: Query recent edge function logs (last 1h)
|
|
183
|
+
\`\`\`bash
|
|
184
|
+
SINCE=$(date -u -v-1H +"%Y-%m-%dT%H:%M:%S.000Z" 2>/dev/null || date -u --date="1 hour ago" +"%Y-%m-%dT%H:%M:%S.000Z")
|
|
185
|
+
curl -s -X POST "https://api.supabase.com/v1/projects/\${SUPABASE_PROJECT_REF}/analytics/endpoints/logs.all" \\
|
|
186
|
+
-H "Authorization: Bearer \${SUPABASE_MANAGEMENT_KEY}" \\
|
|
187
|
+
-H "Content-Type: application/json" \\
|
|
188
|
+
-d "{\"sql\": \"SELECT timestamp, event_message, metadata FROM edge_logs WHERE timestamp > '$SINCE' ORDER BY timestamp DESC LIMIT 100\"}"
|
|
189
|
+
\`\`\``;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=supabase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../src/observability/supabase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Logger } from "../logger.js";
|
|
3
|
+
import type { ObservabilityProvider } from "./types.js";
|
|
4
|
+
import type { ProviderConfigSchema } from "../config-schema.js";
|
|
5
|
+
export declare const vercelConfigSchema: z.ZodObject<{
|
|
6
|
+
token: z.ZodString;
|
|
7
|
+
projectId: z.ZodString;
|
|
8
|
+
teamId: z.ZodOptional<z.ZodString>;
|
|
9
|
+
logger: z.ZodOptional<z.ZodCustom<Logger, Logger>>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
export type VercelConfig = z.infer<typeof vercelConfigSchema>;
|
|
12
|
+
export declare const vercelProviderConfigSchema: ProviderConfigSchema;
|
|
13
|
+
export declare function vercel(config: VercelConfig): ObservabilityProvider & {
|
|
14
|
+
configSchema: ProviderConfigSchema;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=vercel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vercel.d.ts","sourceRoot":"","sources":["../../src/observability/vercel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,KAAK,EAAE,qBAAqB,EAA8C,MAAM,YAAY,CAAC;AACpG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,eAAO,MAAM,kBAAkB;;;;;iBAK7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,0BAA0B,EAAE,oBAQxC,CAAC;AAEF,wBAAgB,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,qBAAqB,GAAG;IAAE,YAAY,EAAE,oBAAoB,CAAA;CAAE,CAI3G"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { consoleLogger } from "../logger.js";
|
|
3
|
+
import { ProviderApiError } from "../errors.js";
|
|
4
|
+
export const vercelConfigSchema = z.object({
|
|
5
|
+
token: z.string().min(1, "Vercel token is required"),
|
|
6
|
+
projectId: z.string().min(1, "Vercel project ID is required"),
|
|
7
|
+
teamId: z.string().optional(),
|
|
8
|
+
logger: z.custom().optional(),
|
|
9
|
+
});
|
|
10
|
+
export const vercelProviderConfigSchema = {
|
|
11
|
+
role: "observability",
|
|
12
|
+
name: "Vercel",
|
|
13
|
+
fields: [
|
|
14
|
+
{ key: "token", envVar: "VERCEL_TOKEN", description: "Vercel personal access token" },
|
|
15
|
+
{ key: "projectId", envVar: "VERCEL_PROJECT_ID", description: "Vercel project ID" },
|
|
16
|
+
{ key: "teamId", envVar: "VERCEL_TEAM_ID", description: "Vercel team ID (optional)", required: false },
|
|
17
|
+
],
|
|
18
|
+
};
|
|
19
|
+
export function vercel(config) {
|
|
20
|
+
const parsed = vercelConfigSchema.parse(config);
|
|
21
|
+
const provider = new VercelProvider(parsed);
|
|
22
|
+
return Object.assign(provider, { configSchema: vercelProviderConfigSchema });
|
|
23
|
+
}
|
|
24
|
+
function timeRangeToMs(range) {
|
|
25
|
+
const match = /^(\d+)(h|d|w)$/.exec(range);
|
|
26
|
+
if (!match)
|
|
27
|
+
return Date.now() - 3_600_000;
|
|
28
|
+
const [, n, unit] = match;
|
|
29
|
+
const ms = { h: 3_600_000, d: 86_400_000, w: 604_800_000 }[unit];
|
|
30
|
+
return Date.now() - parseInt(n, 10) * ms;
|
|
31
|
+
}
|
|
32
|
+
class VercelProvider {
|
|
33
|
+
token;
|
|
34
|
+
projectId;
|
|
35
|
+
teamId;
|
|
36
|
+
log;
|
|
37
|
+
constructor(config) {
|
|
38
|
+
this.token = config.token;
|
|
39
|
+
this.projectId = config.projectId;
|
|
40
|
+
this.teamId = config.teamId;
|
|
41
|
+
this.log = config.logger ?? consoleLogger;
|
|
42
|
+
}
|
|
43
|
+
teamParam() {
|
|
44
|
+
return this.teamId ? `&teamId=${encodeURIComponent(this.teamId)}` : "";
|
|
45
|
+
}
|
|
46
|
+
async get(path) {
|
|
47
|
+
const url = `https://api.vercel.com${path}`;
|
|
48
|
+
const response = await fetch(url, {
|
|
49
|
+
headers: { Authorization: `Bearer ${this.token}` },
|
|
50
|
+
});
|
|
51
|
+
if (!response.ok) {
|
|
52
|
+
const body = await response.text().catch(() => "");
|
|
53
|
+
throw new ProviderApiError("Vercel", response.status, response.statusText, body);
|
|
54
|
+
}
|
|
55
|
+
return (await response.json());
|
|
56
|
+
}
|
|
57
|
+
async verifyAccess() {
|
|
58
|
+
this.log.info(`Verifying Vercel access (project: ${this.projectId})`);
|
|
59
|
+
await this.get(`/v9/projects/${encodeURIComponent(this.projectId)}${this.teamId ? `?teamId=${encodeURIComponent(this.teamId)}` : ""}`);
|
|
60
|
+
this.log.info("Vercel API access verified");
|
|
61
|
+
}
|
|
62
|
+
async listDeployments() {
|
|
63
|
+
const result = await this.get(`/v6/deployments?projectId=${encodeURIComponent(this.projectId)}&limit=5&state=READY${this.teamParam()}`);
|
|
64
|
+
return result.deployments ?? [];
|
|
65
|
+
}
|
|
66
|
+
async getDeploymentEvents(deploymentId, sinceMs) {
|
|
67
|
+
const result = await this.get(`/v3/deployments/${encodeURIComponent(deploymentId)}/events?direction=backward&limit=200&since=${sinceMs}${this.teamParam()}`);
|
|
68
|
+
return Array.isArray(result) ? result : [];
|
|
69
|
+
}
|
|
70
|
+
async queryLogs(opts) {
|
|
71
|
+
this.log.info(`Querying Vercel logs (severity: ${opts.severity}, range: ${opts.timeRange})`);
|
|
72
|
+
const sinceMs = timeRangeToMs(opts.timeRange);
|
|
73
|
+
const deployments = await this.listDeployments();
|
|
74
|
+
const entries = [];
|
|
75
|
+
for (const deployment of deployments) {
|
|
76
|
+
if (opts.serviceFilter !== "*" && !deployment.name.includes(opts.serviceFilter)) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const events = await this.getDeploymentEvents(deployment.uid, sinceMs);
|
|
80
|
+
for (const event of events) {
|
|
81
|
+
if (event.type !== "stdout" && event.type !== "stderr")
|
|
82
|
+
continue;
|
|
83
|
+
if (opts.severity === "error" && event.type !== "stderr")
|
|
84
|
+
continue;
|
|
85
|
+
entries.push({
|
|
86
|
+
timestamp: new Date(event.created).toISOString(),
|
|
87
|
+
service: deployment.name,
|
|
88
|
+
level: event.type === "stderr" ? "error" : "info",
|
|
89
|
+
message: event.payload?.text ?? "",
|
|
90
|
+
attributes: { deploymentId: deployment.uid, eventType: event.type },
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
entries.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
|
|
95
|
+
const result = entries.slice(0, 200);
|
|
96
|
+
this.log.info(`Found ${result.length} Vercel log entries`);
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
async aggregate(opts) {
|
|
100
|
+
this.log.info(`Aggregating Vercel errors (range: ${opts.timeRange})`);
|
|
101
|
+
const sinceMs = timeRangeToMs(opts.timeRange);
|
|
102
|
+
const deployments = await this.listDeployments();
|
|
103
|
+
const counts = new Map();
|
|
104
|
+
for (const deployment of deployments) {
|
|
105
|
+
if (opts.serviceFilter !== "*" && !deployment.name.includes(opts.serviceFilter)) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const events = await this.getDeploymentEvents(deployment.uid, sinceMs);
|
|
109
|
+
const errorCount = events.filter((e) => e.type === "stderr").length;
|
|
110
|
+
if (errorCount > 0) {
|
|
111
|
+
counts.set(deployment.name, (counts.get(deployment.name) ?? 0) + errorCount);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const results = Array.from(counts.entries())
|
|
115
|
+
.map(([service, count]) => ({ service, count }))
|
|
116
|
+
.sort((a, b) => b.count - a.count);
|
|
117
|
+
this.log.info(`Aggregated ${results.length} service groups`);
|
|
118
|
+
return results;
|
|
119
|
+
}
|
|
120
|
+
getAgentEnv() {
|
|
121
|
+
const env = {
|
|
122
|
+
VERCEL_TOKEN: this.token,
|
|
123
|
+
VERCEL_PROJECT_ID: this.projectId,
|
|
124
|
+
};
|
|
125
|
+
if (this.teamId)
|
|
126
|
+
env.VERCEL_TEAM_ID = this.teamId;
|
|
127
|
+
return env;
|
|
128
|
+
}
|
|
129
|
+
getPromptInstructions() {
|
|
130
|
+
const teamParam = this.teamId ? "?teamId=${VERCEL_TEAM_ID}" : "";
|
|
131
|
+
const teamSuffix = this.teamId ? "&teamId=${VERCEL_TEAM_ID}" : "";
|
|
132
|
+
return `### Vercel Runtime Logs API
|
|
133
|
+
- \`VERCEL_TOKEN\` - Personal access token (use in Authorization: Bearer header)
|
|
134
|
+
- \`VERCEL_PROJECT_ID\` - Project ID (${this.projectId})
|
|
135
|
+
${this.teamId ? `- \`VERCEL_TEAM_ID\` - Team ID (${this.teamId})\n` : ""}
|
|
136
|
+
**DO NOT make up data** - only use real data from APIs. If no data, report that honestly.
|
|
137
|
+
|
|
138
|
+
You have DIRECT ACCESS to Vercel's API via curl commands to investigate serverless function logs.
|
|
139
|
+
|
|
140
|
+
#### Example: Get project info (verify access)
|
|
141
|
+
\`\`\`bash
|
|
142
|
+
curl -s "https://api.vercel.com/v9/projects/\${VERCEL_PROJECT_ID}${teamParam}" \\
|
|
143
|
+
-H "Authorization: Bearer \${VERCEL_TOKEN}"
|
|
144
|
+
\`\`\`
|
|
145
|
+
|
|
146
|
+
#### Example: List recent deployments
|
|
147
|
+
\`\`\`bash
|
|
148
|
+
curl -s "https://api.vercel.com/v6/deployments?projectId=\${VERCEL_PROJECT_ID}&limit=5&state=READY${teamSuffix}" \\
|
|
149
|
+
-H "Authorization: Bearer \${VERCEL_TOKEN}"
|
|
150
|
+
\`\`\`
|
|
151
|
+
|
|
152
|
+
#### Example: Get runtime logs for a deployment
|
|
153
|
+
\`\`\`bash
|
|
154
|
+
# Replace DEPLOYMENT_ID with a uid from the deployments list above
|
|
155
|
+
curl -s "https://api.vercel.com/v3/deployments/DEPLOYMENT_ID/events?direction=backward&limit=200${teamSuffix}" \\
|
|
156
|
+
-H "Authorization: Bearer \${VERCEL_TOKEN}"
|
|
157
|
+
\`\`\`
|
|
158
|
+
|
|
159
|
+
Event types: \`stdout\` = info logs, \`stderr\` = error logs, \`command\`/\`exit\` = lifecycle events.
|
|
160
|
+
Filter for errors: look for \`"type": "stderr"\` entries.`;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=vercel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vercel.js","sourceRoot":"","sources":["../../src/observability/vercel.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED