@heychunky/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/admin/apps.d.ts +49 -0
- package/dist/admin/apps.d.ts.map +1 -0
- package/dist/admin/apps.js +97 -0
- package/dist/admin/apps.js.map +1 -0
- package/dist/admin/index.d.ts +26 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +27 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/master.d.ts +9 -0
- package/dist/admin/master.d.ts.map +1 -0
- package/dist/admin/master.js +14 -0
- package/dist/admin/master.js.map +1 -0
- package/dist/admin/provision.d.ts +42 -0
- package/dist/admin/provision.d.ts.map +1 -0
- package/dist/admin/provision.js +157 -0
- package/dist/admin/provision.js.map +1 -0
- package/dist/admin/run.d.ts +89 -0
- package/dist/admin/run.d.ts.map +1 -0
- package/dist/admin/run.js +218 -0
- package/dist/admin/run.js.map +1 -0
- package/dist/admin/secrets/infisical.d.ts +45 -0
- package/dist/admin/secrets/infisical.d.ts.map +1 -0
- package/dist/admin/secrets/infisical.js +182 -0
- package/dist/admin/secrets/infisical.js.map +1 -0
- package/dist/admin/services/agentmail.d.ts +16 -0
- package/dist/admin/services/agentmail.d.ts.map +1 -0
- package/dist/admin/services/agentmail.js +43 -0
- package/dist/admin/services/agentmail.js.map +1 -0
- package/dist/admin/services/ai-gateway.d.ts +13 -0
- package/dist/admin/services/ai-gateway.d.ts.map +1 -0
- package/dist/admin/services/ai-gateway.js +32 -0
- package/dist/admin/services/ai-gateway.js.map +1 -0
- package/dist/admin/services/bunny.d.ts +16 -0
- package/dist/admin/services/bunny.d.ts.map +1 -0
- package/dist/admin/services/bunny.js +59 -0
- package/dist/admin/services/bunny.js.map +1 -0
- package/dist/admin/services/cloudflare.d.ts +42 -0
- package/dist/admin/services/cloudflare.d.ts.map +1 -0
- package/dist/admin/services/cloudflare.js +97 -0
- package/dist/admin/services/cloudflare.js.map +1 -0
- package/dist/admin/services/db.d.ts +16 -0
- package/dist/admin/services/db.d.ts.map +1 -0
- package/dist/admin/services/db.js +81 -0
- package/dist/admin/services/db.js.map +1 -0
- package/dist/admin/services/elevenlabs.d.ts +22 -0
- package/dist/admin/services/elevenlabs.d.ts.map +1 -0
- package/dist/admin/services/elevenlabs.js +45 -0
- package/dist/admin/services/elevenlabs.js.map +1 -0
- package/dist/admin/services/firecrawl.d.ts +13 -0
- package/dist/admin/services/firecrawl.d.ts.map +1 -0
- package/dist/admin/services/firecrawl.js +36 -0
- package/dist/admin/services/firecrawl.js.map +1 -0
- package/dist/admin/services/fireworks.d.ts +9 -0
- package/dist/admin/services/fireworks.d.ts.map +1 -0
- package/dist/admin/services/fireworks.js +31 -0
- package/dist/admin/services/fireworks.js.map +1 -0
- package/dist/admin/services/github.d.ts +26 -0
- package/dist/admin/services/github.d.ts.map +1 -0
- package/dist/admin/services/github.js +164 -0
- package/dist/admin/services/github.js.map +1 -0
- package/dist/admin/services/neon.d.ts +42 -0
- package/dist/admin/services/neon.d.ts.map +1 -0
- package/dist/admin/services/neon.js +157 -0
- package/dist/admin/services/neon.js.map +1 -0
- package/dist/admin/services/resend.d.ts +38 -0
- package/dist/admin/services/resend.d.ts.map +1 -0
- package/dist/admin/services/resend.js +81 -0
- package/dist/admin/services/resend.js.map +1 -0
- package/dist/admin/services/togetherai.d.ts +10 -0
- package/dist/admin/services/togetherai.d.ts.map +1 -0
- package/dist/admin/services/togetherai.js +36 -0
- package/dist/admin/services/togetherai.js.map +1 -0
- package/dist/admin/services/vercel.d.ts +66 -0
- package/dist/admin/services/vercel.d.ts.map +1 -0
- package/dist/admin/services/vercel.js +209 -0
- package/dist/admin/services/vercel.js.map +1 -0
- package/dist/admin/syncenv.d.ts +12 -0
- package/dist/admin/syncenv.d.ts.map +1 -0
- package/dist/admin/syncenv.js +114 -0
- package/dist/admin/syncenv.js.map +1 -0
- package/dist/admin/users.d.ts +27 -0
- package/dist/admin/users.d.ts.map +1 -0
- package/dist/admin/users.js +48 -0
- package/dist/admin/users.js.map +1 -0
- package/dist/config/environments.d.ts +50 -0
- package/dist/config/environments.d.ts.map +1 -0
- package/dist/config/environments.js +62 -0
- package/dist/config/environments.js.map +1 -0
- package/dist/config/names.d.ts +45 -0
- package/dist/config/names.d.ts.map +1 -0
- package/dist/config/names.js +75 -0
- package/dist/config/names.js.map +1 -0
- package/dist/http/errors.d.ts +45 -0
- package/dist/http/errors.d.ts.map +1 -0
- package/dist/http/errors.js +70 -0
- package/dist/http/errors.js.map +1 -0
- package/dist/http/request.d.ts +36 -0
- package/dist/http/request.d.ts.map +1 -0
- package/dist/http/request.js +73 -0
- package/dist/http/request.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/registry.d.ts +66 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +137 -0
- package/dist/registry.js.map +1 -0
- package/dist/secrets/store.d.ts +50 -0
- package/dist/secrets/store.d.ts.map +1 -0
- package/dist/secrets/store.js +71 -0
- package/dist/secrets/store.js.map +1 -0
- package/dist/services/types.d.ts +39 -0
- package/dist/services/types.d.ts.map +1 -0
- package/dist/services/types.js +28 -0
- package/dist/services/types.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bunny.net — storage zones and CDN.
|
|
3
|
+
*
|
|
4
|
+
* Authenticates with an `AccessKey` header, not Bearer.
|
|
5
|
+
*
|
|
6
|
+
* **Fields are picked, never spread.** Bunny returns each storage zone's
|
|
7
|
+
* `Password` and `ReadOnlyPassword`, and each pull zone's `ZoneSecurityKey`
|
|
8
|
+
* and `AWSSigningSecret`, in the same payload as the name and size. Declaring
|
|
9
|
+
* an interface without them strips nothing at runtime — the object still
|
|
10
|
+
* carries them, and printing it puts live credentials on a terminal. That
|
|
11
|
+
* happened once; hence the mapping below.
|
|
12
|
+
*/
|
|
13
|
+
import { request } from "../../http/request.js";
|
|
14
|
+
import { baseName } from "../../config/names.js";
|
|
15
|
+
import { probe, probeAccess } from "../../services/types.js";
|
|
16
|
+
const BASE = "https://api.bunny.net";
|
|
17
|
+
export function bunny(token) {
|
|
18
|
+
const creds = { token, header: "AccessKey" };
|
|
19
|
+
async function storageZones() {
|
|
20
|
+
const res = await request(`${BASE}/storagezone`, { credentials: creds });
|
|
21
|
+
const raw = Array.isArray(res) ? res : (res.Items ?? []);
|
|
22
|
+
return raw.map((z) => ({
|
|
23
|
+
Id: z.Id,
|
|
24
|
+
Name: z.Name,
|
|
25
|
+
Region: z.Region,
|
|
26
|
+
StorageUsed: z.StorageUsed,
|
|
27
|
+
FilesStored: z.FilesStored,
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
storageZones,
|
|
32
|
+
/** Zones for one app, by the `<app>` / `<app>-private` convention. */
|
|
33
|
+
async zonesForApp(app) {
|
|
34
|
+
const base = baseName(app);
|
|
35
|
+
return (await storageZones()).filter((z) => z.Name === base || z.Name.startsWith(`${base}-`));
|
|
36
|
+
},
|
|
37
|
+
async status() {
|
|
38
|
+
return probe("bunny", async () => {
|
|
39
|
+
const z = await storageZones();
|
|
40
|
+
const gb = z.reduce((n, x) => n + (x.StorageUsed ?? 0), 0) / 1e9;
|
|
41
|
+
return `${z.length} storage zones, ${gb.toFixed(2)} GB stored`;
|
|
42
|
+
});
|
|
43
|
+
},
|
|
44
|
+
async access() {
|
|
45
|
+
return probeAccess("bunny", async () => {
|
|
46
|
+
const z = await storageZones();
|
|
47
|
+
return {
|
|
48
|
+
evidence: "reachability",
|
|
49
|
+
can: [`read and manage ${z.length} storage zones`, "create and delete zones, and their stored objects"],
|
|
50
|
+
notes: [
|
|
51
|
+
"account-wide key; Bunny declares nothing about a key's rights",
|
|
52
|
+
"individual storage zones carry their own passwords, so per-app storage is scoped even where management is not",
|
|
53
|
+
],
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=bunny.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bunny.js","sourceRoot":"","sources":["../../../src/admin/services/bunny.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,OAAO,EAAoB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,WAAW,EAA0C,MAAM,yBAAyB,CAAC;AAErG,MAAM,IAAI,GAAG,uBAAuB,CAAC;AAUrC,MAAM,UAAU,KAAK,CAAC,KAAa;IACjC,MAAM,KAAK,GAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAE1D,KAAK,UAAU,YAAY;QACzB,MAAM,GAAG,GAAG,MAAM,OAAO,CACvB,GAAG,IAAI,cAAc,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACzD,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACrB,EAAE,EAAE,CAAC,CAAC,EAAY;YAClB,IAAI,EAAE,CAAC,CAAC,IAAc;YACtB,MAAM,EAAE,CAAC,CAAC,MAAgB;YAC1B,WAAW,EAAE,CAAC,CAAC,WAAqB;YACpC,WAAW,EAAE,CAAC,CAAC,WAAiC;SACjD,CAAC,CAAC,CAAC;IACN,CAAC;IAED,OAAO;QACL,YAAY;QACZ,sEAAsE;QACtE,KAAK,CAAC,WAAW,CAAC,GAAW;YAC3B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC3B,OAAO,CAAC,MAAM,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;QAChG,CAAC;QAED,KAAK,CAAC,MAAM;YACV,OAAO,KAAK,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;gBAC/B,MAAM,CAAC,GAAG,MAAM,YAAY,EAAE,CAAC;gBAC/B,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;gBACjE,OAAO,GAAG,CAAC,CAAC,MAAM,mBAAmB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;YACjE,CAAC,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,MAAM;YACV,OAAO,WAAW,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;gBACrC,MAAM,CAAC,GAAG,MAAM,YAAY,EAAE,CAAC;gBAC/B,OAAO;oBACL,QAAQ,EAAE,cAAuB;oBACjC,GAAG,EAAE,CAAC,mBAAmB,CAAC,CAAC,MAAM,gBAAgB,EAAE,mDAAmD,CAAC;oBACvG,KAAK,EAAE;wBACL,+DAA+D;wBAC/D,+GAA+G;qBAChH;iBACF,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type ServiceAccess, type ServiceStatus } from "../../services/types.ts";
|
|
2
|
+
export interface Zone {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
status: string;
|
|
6
|
+
account: {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export interface DnsRecord {
|
|
12
|
+
id: string;
|
|
13
|
+
type: string;
|
|
14
|
+
name: string;
|
|
15
|
+
content: string;
|
|
16
|
+
proxied: boolean;
|
|
17
|
+
ttl: number;
|
|
18
|
+
}
|
|
19
|
+
export declare function cloudflare(token: string): {
|
|
20
|
+
zones: () => Promise<Zone[]>;
|
|
21
|
+
zone: (name: string) => Promise<Zone>;
|
|
22
|
+
dnsRecords(domain: string): Promise<DnsRecord[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Add one DNS record, replacing a record of the same type and name.
|
|
25
|
+
*
|
|
26
|
+
* Replacing rather than adding is what makes this safe to run twice: a
|
|
27
|
+
* second attempt at a verification record would otherwise leave two
|
|
28
|
+
* conflicting values and the domain would verify intermittently or not at
|
|
29
|
+
* all. TXT records that legitimately coexist — several SPF includes, say —
|
|
30
|
+
* belong in one value, not several records.
|
|
31
|
+
*/
|
|
32
|
+
setDnsRecord(domain: string, record: {
|
|
33
|
+
type: string;
|
|
34
|
+
name: string;
|
|
35
|
+
content: string;
|
|
36
|
+
ttl?: number;
|
|
37
|
+
priority?: number;
|
|
38
|
+
}): Promise<DnsRecord>;
|
|
39
|
+
status(): Promise<ServiceStatus>;
|
|
40
|
+
access(): Promise<ServiceAccess>;
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=cloudflare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../../src/admin/services/cloudflare.ts"],"names":[],"mappings":"AASA,OAAO,EAAsB,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAIrG,MAAM,WAAW,IAAI;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE;AACzG,MAAM,WAAW,SAAS;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE;AAErH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM;;iBAeZ,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;uBASrB,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAItD;;;;;;;;OAQG;yBAEO,MAAM,UACN;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GACvF,OAAO,CAAC,SAAS,CAAC;cAYL,OAAO,CAAC,aAAa,CAAC;cAQtB,OAAO,CAAC,aAAa,CAAC;EA8BzC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare — DNS, and the registrar.
|
|
3
|
+
*
|
|
4
|
+
* Cloudflare returns HTTP 200 for application-level failures, wrapping every
|
|
5
|
+
* response in `{ success, errors, result }`. A token missing a permission comes
|
|
6
|
+
* back 200 with `success: false`, so a plain fetch reads a permissions error as
|
|
7
|
+
* a zone with no records. Everything here unwraps and throws.
|
|
8
|
+
*/
|
|
9
|
+
import { request } from "../../http/request.js";
|
|
10
|
+
import { probe, probeAccess } from "../../services/types.js";
|
|
11
|
+
const CF = "https://api.cloudflare.com/client/v4";
|
|
12
|
+
export function cloudflare(token) {
|
|
13
|
+
const creds = { token };
|
|
14
|
+
async function cf(path, init = {}) {
|
|
15
|
+
const res = await request(`${CF}${path}`, { credentials: creds, ...init });
|
|
16
|
+
if (!res.success) {
|
|
17
|
+
const why = res.errors?.map((e) => `${e.code} ${e.message}`).join("; ") || "unknown error";
|
|
18
|
+
throw new Error(`Cloudflare ${path}: ${why}`);
|
|
19
|
+
}
|
|
20
|
+
return res.result;
|
|
21
|
+
}
|
|
22
|
+
const zones = () => cf("/zones?per_page=100");
|
|
23
|
+
async function zone(name) {
|
|
24
|
+
const found = await cf(`/zones?name=${encodeURIComponent(name)}`);
|
|
25
|
+
if (!found.length)
|
|
26
|
+
throw new Error(`No Cloudflare zone for "${name}" on this token's account`);
|
|
27
|
+
return found[0];
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
zones,
|
|
31
|
+
zone,
|
|
32
|
+
async dnsRecords(domain) {
|
|
33
|
+
return cf(`/zones/${(await zone(domain)).id}/dns_records?per_page=100`);
|
|
34
|
+
},
|
|
35
|
+
/**
|
|
36
|
+
* Add one DNS record, replacing a record of the same type and name.
|
|
37
|
+
*
|
|
38
|
+
* Replacing rather than adding is what makes this safe to run twice: a
|
|
39
|
+
* second attempt at a verification record would otherwise leave two
|
|
40
|
+
* conflicting values and the domain would verify intermittently or not at
|
|
41
|
+
* all. TXT records that legitimately coexist — several SPF includes, say —
|
|
42
|
+
* belong in one value, not several records.
|
|
43
|
+
*/
|
|
44
|
+
async setDnsRecord(domain, record) {
|
|
45
|
+
const zoneId = (await zone(domain)).id;
|
|
46
|
+
const query = new URLSearchParams({ type: record.type, name: record.name });
|
|
47
|
+
for (const existing of await cf(`/zones/${zoneId}/dns_records?${query}`)) {
|
|
48
|
+
await cf(`/zones/${zoneId}/dns_records/${existing.id}`, { method: "DELETE" });
|
|
49
|
+
}
|
|
50
|
+
return await cf(`/zones/${zoneId}/dns_records`, {
|
|
51
|
+
method: "POST",
|
|
52
|
+
body: { ttl: 1, ...record },
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
async status() {
|
|
56
|
+
return probe("cloudflare", async () => {
|
|
57
|
+
const z = await zones();
|
|
58
|
+
const inactive = z.filter((x) => x.status !== "active").length;
|
|
59
|
+
return `${z.length} zone${z.length === 1 ? "" : "s"}${inactive ? ` ⚠️ ${inactive} not active` : ""}`;
|
|
60
|
+
});
|
|
61
|
+
},
|
|
62
|
+
async access() {
|
|
63
|
+
return probeAccess("cloudflare", async () => {
|
|
64
|
+
const [check, z] = await Promise.all([
|
|
65
|
+
cf("/user/tokens/verify"),
|
|
66
|
+
zones(),
|
|
67
|
+
]);
|
|
68
|
+
// DNS is probed, never assumed: a token with Zone:Edit but no DNS
|
|
69
|
+
// permission lists zones happily and fails on records.
|
|
70
|
+
let dns;
|
|
71
|
+
if (z[0]) {
|
|
72
|
+
try {
|
|
73
|
+
await cf(`/zones/${z[0].id}/dns_records?per_page=1`);
|
|
74
|
+
dns = `read DNS records on those zones (probed ${z[0].name})`;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
dns = undefined;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const accounts = [...new Set(z.map((x) => x.account.name))];
|
|
81
|
+
const notes = [
|
|
82
|
+
`token ${check.id.slice(0, 8)}… is ${check.status}`,
|
|
83
|
+
check.expires_on ? `expires ${check.expires_on.slice(0, 10)}` : "does not expire",
|
|
84
|
+
];
|
|
85
|
+
if (z.length && !dns)
|
|
86
|
+
notes.push("cannot read DNS records — missing Zone:DNS, so every DNS step will fail");
|
|
87
|
+
notes.push("write access is never probed: proving it means writing a record");
|
|
88
|
+
return {
|
|
89
|
+
evidence: "identity",
|
|
90
|
+
can: [`read ${z.length} zones on ${accounts.join(", ") || "no account"}`, ...(dns ? [dns] : [])],
|
|
91
|
+
notes,
|
|
92
|
+
};
|
|
93
|
+
});
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=cloudflare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare.js","sourceRoot":"","sources":["../../../src/admin/services/cloudflare.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface Rows {
|
|
2
|
+
rows: Record<string, unknown>[];
|
|
3
|
+
rowCount: number;
|
|
4
|
+
}
|
|
5
|
+
export interface Column {
|
|
6
|
+
column: string;
|
|
7
|
+
type: string;
|
|
8
|
+
nullable: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function db(connectionString: string): {
|
|
11
|
+
query: (sql: string, params?: unknown[]) => Promise<Rows>;
|
|
12
|
+
write: (sql: string, params?: unknown[]) => Promise<Rows>;
|
|
13
|
+
tables(): Promise<string[]>;
|
|
14
|
+
columns(table: string): Promise<Column[]>;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../src/admin/services/db.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,EAAE,CAAC,gBAAgB,EAAE,MAAM;iBAuCf,MAAM,WAAU,OAAO,EAAE,KAAQ,OAAO,CAAC,IAAI,CAAC;iBAU9C,MAAM,WAAU,OAAO,EAAE,KAAQ,OAAO,CAAC,IAAI,CAAC;cAYtD,OAAO,CAAC,MAAM,EAAE,CAAC;mBAOZ,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;EAelD"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An app's own database, reached by its connection string.
|
|
3
|
+
*
|
|
4
|
+
* Separate from `neon.ts` on purpose. That is the control plane — an API key
|
|
5
|
+
* that can create and delete every project in the organisation. This is the
|
|
6
|
+
* data plane, and the two have different blast radii, which is exactly what the
|
|
7
|
+
* `app` tier on these actions means.
|
|
8
|
+
*
|
|
9
|
+
* Spoken over Neon's HTTP SQL endpoint rather than through a Postgres driver.
|
|
10
|
+
* The Core ships to other people and runs in an edge function as readily as in
|
|
11
|
+
* Node; one query path should not drag a connection pool, TLS handling and a
|
|
12
|
+
* native binding behind it. The same reason `infisical.ts` is written against
|
|
13
|
+
* `fetch`.
|
|
14
|
+
*/
|
|
15
|
+
import { errorFor } from "../../http/errors.js";
|
|
16
|
+
export function db(connectionString) {
|
|
17
|
+
let host;
|
|
18
|
+
try {
|
|
19
|
+
host = new URL(connectionString).hostname;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
throw new Error("Not a connection string — expected postgres://user:password@host/database");
|
|
23
|
+
}
|
|
24
|
+
const endpoint = `https://${host}/sql`;
|
|
25
|
+
async function send(body, headers = {}) {
|
|
26
|
+
const res = await fetch(endpoint, {
|
|
27
|
+
method: "POST",
|
|
28
|
+
headers: {
|
|
29
|
+
"content-type": "application/json",
|
|
30
|
+
"Neon-Connection-String": connectionString,
|
|
31
|
+
...headers,
|
|
32
|
+
},
|
|
33
|
+
body: JSON.stringify(body),
|
|
34
|
+
});
|
|
35
|
+
const parsed = (await res.json());
|
|
36
|
+
if (!res.ok) {
|
|
37
|
+
// Postgres's own message names the column or the constraint; a status
|
|
38
|
+
// code alone sends someone to the wrong place. errorFor classifies it,
|
|
39
|
+
// so a worker knows a syntax error will never succeed on retry.
|
|
40
|
+
throw errorFor(res.status, endpoint, parsed.message ?? JSON.stringify(parsed));
|
|
41
|
+
}
|
|
42
|
+
return parsed;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Read-only SQL.
|
|
46
|
+
*
|
|
47
|
+
* Sent as a batch so Postgres opens a READ ONLY transaction around it, which
|
|
48
|
+
* refuses a write itself. The guarantee is the database's, not this client's
|
|
49
|
+
* — a promise kept by parsing the statement here would be worth very little.
|
|
50
|
+
*/
|
|
51
|
+
async function query(sql, params = []) {
|
|
52
|
+
const body = (await send({ queries: [{ query: sql, params }] }, { "Neon-Batch-Read-Only": "true" }));
|
|
53
|
+
const first = body.results?.[0];
|
|
54
|
+
return { rows: first?.rows ?? [], rowCount: first?.rowCount ?? 0 };
|
|
55
|
+
}
|
|
56
|
+
/** SQL that may change data. Gated in the registry, not here. */
|
|
57
|
+
async function write(sql, params = []) {
|
|
58
|
+
const body = (await send({ query: sql, params }));
|
|
59
|
+
return { rows: body.rows ?? [], rowCount: body.rowCount ?? 0 };
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
query,
|
|
63
|
+
write,
|
|
64
|
+
async tables() {
|
|
65
|
+
const { rows } = await query("select tablename from pg_tables where schemaname = 'public' order by tablename");
|
|
66
|
+
return rows.map((r) => String(r["tablename"]));
|
|
67
|
+
},
|
|
68
|
+
async columns(table) {
|
|
69
|
+
const { rows } = await query(`select column_name, data_type, is_nullable
|
|
70
|
+
from information_schema.columns
|
|
71
|
+
where table_schema = 'public' and table_name = $1
|
|
72
|
+
order by ordinal_position`, [table]);
|
|
73
|
+
return rows.map((r) => ({
|
|
74
|
+
column: String(r["column_name"]),
|
|
75
|
+
type: String(r["data_type"]),
|
|
76
|
+
nullable: r["is_nullable"] === "YES",
|
|
77
|
+
}));
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/admin/services/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type ServiceAccess, type ServiceStatus } from "../../services/types.ts";
|
|
2
|
+
export interface ElevenLabsSubscription {
|
|
3
|
+
tier: string;
|
|
4
|
+
status: string;
|
|
5
|
+
character_count: number;
|
|
6
|
+
character_limit: number;
|
|
7
|
+
next_character_count_reset_unix: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function elevenlabs(token: string): {
|
|
10
|
+
subscription: () => Promise<ElevenLabsSubscription>;
|
|
11
|
+
voices: () => Promise<{
|
|
12
|
+
voice_id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
}[]>;
|
|
15
|
+
models: () => Promise<{
|
|
16
|
+
model_id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
}[]>;
|
|
19
|
+
status(): Promise<ServiceStatus>;
|
|
20
|
+
access(): Promise<ServiceAccess>;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=elevenlabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elevenlabs.d.ts","sourceRoot":"","sources":["../../../src/admin/services/elevenlabs.ts"],"names":[],"mappings":"AAMA,OAAO,EAAsB,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAErG,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,+BAA+B,EAAE,MAAM,CAAC;CACzC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM;;;kBAM0B,MAAM;cAAQ,MAAM;;;kBAKhD,MAAM;cAAQ,MAAM;;cACtC,OAAO,CAAC,aAAa,CAAC;cAQtB,OAAO,CAAC,aAAa,CAAC;EAkBzC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ElevenLabs — voice.
|
|
3
|
+
*
|
|
4
|
+
* Authenticates with `xi-api-key`, not Bearer.
|
|
5
|
+
*/
|
|
6
|
+
import { request } from "../../http/request.js";
|
|
7
|
+
import { probe, probeAccess } from "../../services/types.js";
|
|
8
|
+
export function elevenlabs(token) {
|
|
9
|
+
// Not Bearer — ElevenLabs wants its own header.
|
|
10
|
+
const creds = { token, header: "xi-api-key" };
|
|
11
|
+
const BASE = "https://api.elevenlabs.io/v1";
|
|
12
|
+
const subscription = () => request(`${BASE}/user/subscription`, { credentials: creds });
|
|
13
|
+
const voices = async () => (await request(`${BASE}/voices`, { credentials: creds })).voices;
|
|
14
|
+
return {
|
|
15
|
+
subscription,
|
|
16
|
+
voices,
|
|
17
|
+
models: () => request(`${BASE}/models`, { credentials: creds }),
|
|
18
|
+
async status() {
|
|
19
|
+
return probe("elevenlabs", async () => {
|
|
20
|
+
const s = await subscription();
|
|
21
|
+
const left = s.character_limit - s.character_count;
|
|
22
|
+
const resets = new Date(s.next_character_count_reset_unix * 1000).toISOString().slice(0, 10);
|
|
23
|
+
return `${s.tier} (${s.status}) · ${left.toLocaleString()} of ${s.character_limit.toLocaleString()} characters left, resets ${resets}`;
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
async access() {
|
|
27
|
+
return probeAccess("elevenlabs", async () => {
|
|
28
|
+
const [s, v] = await Promise.all([subscription(), voices()]);
|
|
29
|
+
return {
|
|
30
|
+
evidence: "identity",
|
|
31
|
+
can: [
|
|
32
|
+
`act on the ${s.tier} plan (${s.status}), ${s.character_limit.toLocaleString()} characters per period`,
|
|
33
|
+
`use ${v.length} voices`,
|
|
34
|
+
"create and delete voices, and spend the character quota",
|
|
35
|
+
],
|
|
36
|
+
notes: [
|
|
37
|
+
"account-wide key; ElevenLabs cannot scope one to a voice or project",
|
|
38
|
+
"spending is metered, not gated",
|
|
39
|
+
],
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=elevenlabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elevenlabs.js","sourceRoot":"","sources":["../../../src/admin/services/elevenlabs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAoB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,WAAW,EAA0C,MAAM,yBAAyB,CAAC;AAUrG,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,gDAAgD;IAChD,MAAM,KAAK,GAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAC3D,MAAM,IAAI,GAAG,8BAA8B,CAAC;IAE5C,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,OAAO,CAAyB,GAAG,IAAI,oBAAoB,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAChH,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,OAAO,CAAmD,GAAG,IAAI,SAAS,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAE9I,OAAO;QACL,YAAY;QACZ,MAAM;QACN,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAuC,GAAG,IAAI,SAAS,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;QACrG,KAAK,CAAC,MAAM;YACV,OAAO,KAAK,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;gBACpC,MAAM,CAAC,GAAG,MAAM,YAAY,EAAE,CAAC;gBAC/B,MAAM,IAAI,GAAG,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC;gBACnD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,+BAA+B,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7F,OAAO,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,OAAO,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,eAAe,CAAC,cAAc,EAAE,4BAA4B,MAAM,EAAE,CAAC;YACzI,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,MAAM;YACV,OAAO,WAAW,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;gBAC1C,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;gBAC7D,OAAO;oBACL,QAAQ,EAAE,UAAU;oBACpB,GAAG,EAAE;wBACH,cAAc,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,eAAe,CAAC,cAAc,EAAE,wBAAwB;wBACtG,OAAO,CAAC,CAAC,MAAM,SAAS;wBACxB,yDAAyD;qBAC1D;oBACD,KAAK,EAAE;wBACL,qEAAqE;wBACrE,gCAAgC;qBACjC;iBACF,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type ServiceAccess, type ServiceStatus } from "../../services/types.ts";
|
|
2
|
+
export interface FirecrawlCredits {
|
|
3
|
+
remaining_credits: number;
|
|
4
|
+
plan_credits: number;
|
|
5
|
+
billing_period_end: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function firecrawl(token: string): {
|
|
8
|
+
credits: () => Promise<FirecrawlCredits>;
|
|
9
|
+
scrape(url: string): Promise<unknown>;
|
|
10
|
+
status(): Promise<ServiceStatus>;
|
|
11
|
+
access(): Promise<ServiceAccess>;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=firecrawl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firecrawl.d.ts","sourceRoot":"","sources":["../../../src/admin/services/firecrawl.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsB,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAErG,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM;mBAIX,OAAO,CAAC,gBAAgB,CAAC;gBAO/B,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;cAG3B,OAAO,CAAC,aAAa,CAAC;cAMtB,OAAO,CAAC,aAAa,CAAC;EAWzC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Firecrawl — crawling and scraping. Metered by credits.
|
|
3
|
+
*/
|
|
4
|
+
import { request } from "../../http/request.js";
|
|
5
|
+
import { probe, probeAccess } from "../../services/types.js";
|
|
6
|
+
export function firecrawl(token) {
|
|
7
|
+
const creds = { token };
|
|
8
|
+
const BASE = "https://api.firecrawl.dev/v1";
|
|
9
|
+
async function credits() {
|
|
10
|
+
const { data } = await request(`${BASE}/team/credit-usage`, { credentials: creds });
|
|
11
|
+
return data;
|
|
12
|
+
}
|
|
13
|
+
return {
|
|
14
|
+
credits,
|
|
15
|
+
async scrape(url) {
|
|
16
|
+
return request(`${BASE}/scrape`, { method: "POST", credentials: creds, body: { url } });
|
|
17
|
+
},
|
|
18
|
+
async status() {
|
|
19
|
+
return probe("firecrawl", async () => {
|
|
20
|
+
const c = await credits();
|
|
21
|
+
return `${c.remaining_credits} of ${c.plan_credits} credits, period ends ${c.billing_period_end.slice(0, 10)}`;
|
|
22
|
+
});
|
|
23
|
+
},
|
|
24
|
+
async access() {
|
|
25
|
+
return probeAccess("firecrawl", async () => {
|
|
26
|
+
const c = await credits();
|
|
27
|
+
return {
|
|
28
|
+
evidence: "reachability",
|
|
29
|
+
can: ["crawl and scrape any URL", `spend ${c.remaining_credits} remaining credits`],
|
|
30
|
+
notes: ["account-wide key", "spending is metered, not gated"],
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=firecrawl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firecrawl.js","sourceRoot":"","sources":["../../../src/admin/services/firecrawl.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAoB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,WAAW,EAA0C,MAAM,yBAAyB,CAAC;AAQrG,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,MAAM,KAAK,GAAgB,EAAE,KAAK,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,8BAA8B,CAAC;IAE5C,KAAK,UAAU,OAAO;QACpB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,CAA6B,GAAG,IAAI,oBAAoB,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAChH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,OAAO;QACP,KAAK,CAAC,MAAM,CAAC,GAAW;YACtB,OAAO,OAAO,CAAC,GAAG,IAAI,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,KAAK,CAAC,MAAM;YACV,OAAO,KAAK,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;gBACnC,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;gBAC1B,OAAO,GAAG,CAAC,CAAC,iBAAiB,OAAO,CAAC,CAAC,YAAY,yBAAyB,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACjH,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,MAAM;YACV,OAAO,WAAW,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;gBACzC,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;gBAC1B,OAAO;oBACL,QAAQ,EAAE,cAAc;oBACxB,GAAG,EAAE,CAAC,0BAA0B,EAAE,SAAS,CAAC,CAAC,iBAAiB,oBAAoB,CAAC;oBACnF,KAAK,EAAE,CAAC,kBAAkB,EAAE,gCAAgC,CAAC;iBAC9D,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ServiceAccess, type ServiceStatus } from "../../services/types.ts";
|
|
2
|
+
export declare function fireworks(token: string): {
|
|
3
|
+
models: () => Promise<{
|
|
4
|
+
id: string;
|
|
5
|
+
}[]>;
|
|
6
|
+
status(): Promise<ServiceStatus>;
|
|
7
|
+
access(): Promise<ServiceAccess>;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=fireworks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fireworks.d.ts","sourceRoot":"","sources":["../../../src/admin/services/fireworks.ts"],"names":[],"mappings":"AAOA,OAAO,EAAsB,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAErG,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM;kBAKZ,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;cAOhC,OAAO,CAAC,aAAa,CAAC;cAGtB,OAAO,CAAC,aAAa,CAAC;EAQzC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fireworks AI — inference.
|
|
3
|
+
*
|
|
4
|
+
* Note the `/inference` prefix: api.fireworks.ai/v1/models is a 404, and a 404
|
|
5
|
+
* that yields an empty list reads as "no models" rather than "wrong URL".
|
|
6
|
+
*/
|
|
7
|
+
import { request } from "../../http/request.js";
|
|
8
|
+
import { probe, probeAccess } from "../../services/types.js";
|
|
9
|
+
export function fireworks(token) {
|
|
10
|
+
const creds = { token };
|
|
11
|
+
// Note the /inference prefix — api.fireworks.ai/v1/models is a 404.
|
|
12
|
+
const BASE = "https://api.fireworks.ai/inference/v1";
|
|
13
|
+
async function models() {
|
|
14
|
+
const { data } = await request(`${BASE}/models`, { credentials: creds });
|
|
15
|
+
return data;
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
models,
|
|
19
|
+
async status() {
|
|
20
|
+
return probe("fireworks", async () => `${(await models()).length} models`);
|
|
21
|
+
},
|
|
22
|
+
async access() {
|
|
23
|
+
return probeAccess("fireworks", async () => ({
|
|
24
|
+
evidence: "reachability",
|
|
25
|
+
can: [`run inference against ${(await models()).length} models`],
|
|
26
|
+
notes: ["account-wide key; Fireworks declares nothing about a key's rights"],
|
|
27
|
+
}));
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=fireworks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fireworks.js","sourceRoot":"","sources":["../../../src/admin/services/fireworks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,OAAO,EAAoB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,WAAW,EAA0C,MAAM,yBAAyB,CAAC;AAErG,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,MAAM,KAAK,GAAgB,EAAE,KAAK,EAAE,CAAC;IACrC,oEAAoE;IACpE,MAAM,IAAI,GAAG,uCAAuC,CAAC;IAErD,KAAK,UAAU,MAAM;QACnB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,CAA6B,GAAG,IAAI,SAAS,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QACrG,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,MAAM;QACN,KAAK,CAAC,MAAM;YACV,OAAO,KAAK,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC;QAC7E,CAAC;QACD,KAAK,CAAC,MAAM;YACV,OAAO,WAAW,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC3C,QAAQ,EAAE,cAAc;gBACxB,GAAG,EAAE,CAAC,yBAAyB,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,SAAS,CAAC;gBAChE,KAAK,EAAE,CAAC,mEAAmE,CAAC;aAC7E,CAAC,CAAC,CAAC;QACN,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type ServiceAccess, type ServiceStatus } from "../../services/types.ts";
|
|
2
|
+
export interface Repo {
|
|
3
|
+
name: string;
|
|
4
|
+
full_name: string;
|
|
5
|
+
private: boolean;
|
|
6
|
+
default_branch: string;
|
|
7
|
+
html_url: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function github(token: string): {
|
|
10
|
+
login: () => Promise<string>;
|
|
11
|
+
listRepos: (affiliation?: string) => Promise<Repo[]>;
|
|
12
|
+
listPublicRepos: () => Promise<Repo[]>;
|
|
13
|
+
findRepo: (fullName: string) => Promise<Repo | undefined>;
|
|
14
|
+
findRepoFor: (app: string, org?: string) => Promise<Repo | undefined>;
|
|
15
|
+
createRepo: (name: string, o?: {
|
|
16
|
+
org?: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
}) => Promise<Repo>;
|
|
19
|
+
deleteRepo: (fullName: string, o: {
|
|
20
|
+
confirmed: true;
|
|
21
|
+
}) => Promise<void>;
|
|
22
|
+
createBranch: (fullName: string, branch: string, from: string) => Promise<void>;
|
|
23
|
+
status(): Promise<ServiceStatus>;
|
|
24
|
+
access(): Promise<ServiceAccess>;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=github.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../src/admin/services/github.ts"],"names":[],"mappings":"AAYA,OAAO,EAAsB,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAKrG,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAaD,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM;;yCAImC,OAAO,CAAC,IAAI,EAAE,CAAC;2BAYlD,OAAO,CAAC,IAAI,EAAE,CAAC;yBAaf,MAAM,KAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;uBAqBpC,MAAM,QAAQ,MAAM,KAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;uBAcxE,MAAM,MACT;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,KACxC,OAAO,CAAC,IAAI,CAAC;2BAgBoB,MAAM,KAAK;QAAE,SAAS,EAAE,IAAI,CAAA;KAAE,KAAG,OAAO,CAAC,IAAI,CAAC;6BAK5C,MAAM,UAAU,MAAM,QAAQ,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;cAkBxE,OAAO,CAAC,aAAa,CAAC;cAStB,OAAO,CAAC,aAAa,CAAC;EAgCzC"}
|