@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,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execute one registry action.
|
|
3
|
+
*
|
|
4
|
+
* The registry says what exists and what it costs; this says how to perform it.
|
|
5
|
+
* They are separate so `registry.ts` stays isomorphic — an app, or a web UI,
|
|
6
|
+
* can list what the factory can do without pulling twelve Node clients into
|
|
7
|
+
* its bundle.
|
|
8
|
+
*
|
|
9
|
+
* Credentials are resolved here and handed to the client, never read from the
|
|
10
|
+
* environment inside one. That is what lets a worker run two apps at once.
|
|
11
|
+
*/
|
|
12
|
+
import { findAction } from "../registry.js";
|
|
13
|
+
import { github } from "./services/github.js";
|
|
14
|
+
import { vercel } from "./services/vercel.js";
|
|
15
|
+
import { neon } from "./services/neon.js";
|
|
16
|
+
import { cloudflare } from "./services/cloudflare.js";
|
|
17
|
+
import { bunny } from "./services/bunny.js";
|
|
18
|
+
import { resend } from "./services/resend.js";
|
|
19
|
+
import { agentmail } from "./services/agentmail.js";
|
|
20
|
+
import { elevenlabs } from "./services/elevenlabs.js";
|
|
21
|
+
import { aiGateway } from "./services/ai-gateway.js";
|
|
22
|
+
import { togetherai } from "./services/togetherai.js";
|
|
23
|
+
import { fireworks } from "./services/fireworks.js";
|
|
24
|
+
import { firecrawl } from "./services/firecrawl.js";
|
|
25
|
+
import { db } from "./services/db.js";
|
|
26
|
+
import { folderFor } from "./syncenv.js";
|
|
27
|
+
/** Which env var each service's factory key is stored under. */
|
|
28
|
+
export const KEY_FOR = {
|
|
29
|
+
github: "GH_TOKEN",
|
|
30
|
+
vercel: "VERCEL_TOKEN",
|
|
31
|
+
neon: "NEON_API_KEY",
|
|
32
|
+
cloudflare: "CLOUDFLARE_API_TOKEN",
|
|
33
|
+
resend: "RESEND_API_KEY",
|
|
34
|
+
agentmail: "AGENTMAIL_API_KEY",
|
|
35
|
+
bunny: "BUNNY_API_KEY",
|
|
36
|
+
elevenlabs: "ELEVENLABS_API_KEY",
|
|
37
|
+
"ai-gateway": "AI_GATEWAY_API_KEY",
|
|
38
|
+
togetherai: "TOGETHER_API_KEY",
|
|
39
|
+
fireworks: "FIREWORKS_API_KEY",
|
|
40
|
+
firecrawl: "FIRECRAWL_API_KEY",
|
|
41
|
+
};
|
|
42
|
+
/** Every client, built from a token. */
|
|
43
|
+
const CLIENTS = {
|
|
44
|
+
github, vercel, neon, cloudflare, bunny, resend,
|
|
45
|
+
agentmail, elevenlabs, "ai-gateway": aiGateway,
|
|
46
|
+
togetherai, fireworks, firecrawl,
|
|
47
|
+
};
|
|
48
|
+
/** A write aimed at production without the separate opt-in. */
|
|
49
|
+
export class ProductionWriteError extends Error {
|
|
50
|
+
action;
|
|
51
|
+
constructor(action) {
|
|
52
|
+
super(`${action.service} ${action.action} would change production data. ` +
|
|
53
|
+
`That needs its own opt-in, not only --confirm.`);
|
|
54
|
+
this.name = "ProductionWriteError";
|
|
55
|
+
this.action = action;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export class GateError extends Error {
|
|
59
|
+
action;
|
|
60
|
+
constructor(action) {
|
|
61
|
+
super(action.gate === "danger"
|
|
62
|
+
? `${action.service} ${action.action} is destructive and needs an explicit confirmation. ` +
|
|
63
|
+
`It ${action.summary.toLowerCase()}.`
|
|
64
|
+
: `${action.service} ${action.action} changes something and needs confirmation.`);
|
|
65
|
+
this.name = "GateError";
|
|
66
|
+
this.action = action;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export class UnknownActionError extends Error {
|
|
70
|
+
constructor(service, action) {
|
|
71
|
+
super(`No action "${action}" on ${service}`);
|
|
72
|
+
this.name = "UnknownActionError";
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Build a client for an `app`-tier action: the app's own database, reached by
|
|
77
|
+
* its connection string rather than by any factory key.
|
|
78
|
+
*/
|
|
79
|
+
async function appClientFor(service, ctx) {
|
|
80
|
+
if (service !== "neon")
|
|
81
|
+
throw new Error(`No app-tier client for service "${service}"`);
|
|
82
|
+
if (!ctx.app) {
|
|
83
|
+
throw new Error("This action reads one app's data, so it needs an app and an environment.");
|
|
84
|
+
}
|
|
85
|
+
const ref = `${folderFor(ctx.app.name, ctx.app.environment)}DATABASE_URL`;
|
|
86
|
+
return db(await ctx.secrets.get(ref));
|
|
87
|
+
}
|
|
88
|
+
/** Build a service's client with its credential resolved from the store. */
|
|
89
|
+
async function clientFor(service, ctx) {
|
|
90
|
+
const envVar = KEY_FOR[service];
|
|
91
|
+
if (!envVar)
|
|
92
|
+
throw new Error(`No credential mapping for service "${service}"`);
|
|
93
|
+
const token = await ctx.secrets.get(ctx.reference(envVar));
|
|
94
|
+
const make = CLIENTS[service];
|
|
95
|
+
if (!make)
|
|
96
|
+
throw new Error(`No client for service "${service}"`);
|
|
97
|
+
return make(token);
|
|
98
|
+
}
|
|
99
|
+
const PERFORM = {
|
|
100
|
+
"github list-repos": (c) => c.listRepos(),
|
|
101
|
+
"github list-public-repos": (c) => c.listPublicRepos(),
|
|
102
|
+
"github create-repo": (c, a) => c.createRepo(a[0], { org: a[1] }),
|
|
103
|
+
"github delete-repo": (c, a) => c.deleteRepo(a[0], { confirmed: true }),
|
|
104
|
+
"github create-branch": (c, a) => c.createBranch(a[0], a[1], a[2] ?? "main"),
|
|
105
|
+
"vercel list-projects": (c) => c.projects(),
|
|
106
|
+
"vercel list-deployments": (c, a) => c.deployments(a[0]),
|
|
107
|
+
"vercel list-env-keys": (c, a) => c.envVars(a[0]),
|
|
108
|
+
"vercel create-project": (c, a) => c.createProject(a[0], { repo: a[1] }),
|
|
109
|
+
"vercel set-env-var": (c, a) => c.setEnv(a[0], a[1], a[2], { target: a[3] ?? "production" }),
|
|
110
|
+
"neon list-projects": (c) => c.projects(),
|
|
111
|
+
"neon list-branches": (c, a) => c.branches(a[0]),
|
|
112
|
+
"neon create-project": (c, a) => c.createProject(a[0]),
|
|
113
|
+
"neon create-branch": (c, a) => c.createBranch(a[0], a[1], a[2]),
|
|
114
|
+
"neon reset-branch": (c, a) => c.resetFromParent(a[0], a[1], { confirmed: true }),
|
|
115
|
+
"resend create-domain": (c, a) => c.createDomain(a[0]),
|
|
116
|
+
"resend verify-domain": (c, a) => c.verifyDomain(a[0]),
|
|
117
|
+
"resend create-sending-key": (c, a) => c.createSendingKey(a[0], a[1]),
|
|
118
|
+
"cloudflare set-dns-record": (c, a) => c.setDnsRecord(a[0], { type: a[1], name: a[2], content: a[3], ...(a[4] ? { priority: Number(a[4]) } : {}) }),
|
|
119
|
+
"vercel list-domains": async (c, a) => c.projectDomains((await c.findProject(a[0]))?.id, await c.teamId()),
|
|
120
|
+
"vercel add-domain": async (c, a) => c.addDomain((await c.findProject(a[0]))?.id, a[1], await c.teamId()),
|
|
121
|
+
"vercel create-deployment": async (c, a) => c.deploy(a[0], { repo: a[1], ref: a[2] ?? "production", target: a[3] ?? "production", teamId: await c.teamId() }),
|
|
122
|
+
"vercel promote-deployment": async (c, a) => c.promote((await c.findProject(a[0]))?.id, a[1], await c.teamId()),
|
|
123
|
+
"neon delete-branch": (c, a) => c.deleteBranch(a[0], a[1], { confirmed: true }),
|
|
124
|
+
"neon list-tables": (c) => c.tables(),
|
|
125
|
+
"neon list-columns": (c, a) => c.columns(a[0]),
|
|
126
|
+
"neon run-query": (c, a) => c.query(a[0]),
|
|
127
|
+
"neon run-write": (c, a) => c.write(a[0]),
|
|
128
|
+
"cloudflare list-zones": (c) => c.zones(),
|
|
129
|
+
"cloudflare list-dns-records": (c, a) => c.dnsRecords(a[0]),
|
|
130
|
+
"resend list-domains": (c) => c.domains(),
|
|
131
|
+
"resend list-keys": (c) => c.apiKeys(),
|
|
132
|
+
"agentmail list-inboxes": (c) => c.inboxes(),
|
|
133
|
+
"agentmail list-domains": (c) => c.domains(),
|
|
134
|
+
"bunny list-zones": (c) => c.storageZones(),
|
|
135
|
+
"bunny list-app-zones": (c, a) => c.zonesForApp(a[0]),
|
|
136
|
+
"elevenlabs list-voices": (c) => c.voices(),
|
|
137
|
+
"elevenlabs list-models": (c) => c.models(),
|
|
138
|
+
"ai-gateway list-models": (c) => c.models(),
|
|
139
|
+
"ai-gateway get-credits": (c) => c.credits(),
|
|
140
|
+
"togetherai list-models": (c) => c.models(),
|
|
141
|
+
"fireworks list-models": (c) => c.models(),
|
|
142
|
+
"firecrawl get-credits": (c) => c.credits(),
|
|
143
|
+
"firecrawl scrape-url": (c, a) => c.scrape(a[0]),
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* Run an action, refusing anything gated that has not been confirmed.
|
|
147
|
+
*
|
|
148
|
+
* This is the *interface* guard — it lets a caller ask before failing. The
|
|
149
|
+
* guarantee is separate and lives in the clients, which refuse without an
|
|
150
|
+
* explicit flag whatever this decides.
|
|
151
|
+
*/
|
|
152
|
+
export async function runAction(service, action, args, ctx) {
|
|
153
|
+
const declared = findAction(service, action);
|
|
154
|
+
if (!declared)
|
|
155
|
+
throw new UnknownActionError(service, action);
|
|
156
|
+
if (declared.gate !== "none" && !ctx.confirmed)
|
|
157
|
+
throw new GateError(declared);
|
|
158
|
+
const perform = PERFORM[`${service} ${action}`];
|
|
159
|
+
if (!perform)
|
|
160
|
+
throw new Error(`"${service} ${action}" is declared but not wired to a client`);
|
|
161
|
+
// The registry promises production needs a separate opt-in. Enforced here
|
|
162
|
+
// rather than in the CLI, so the API cannot reach live data more easily than
|
|
163
|
+
// a terminal can.
|
|
164
|
+
if (declared.tier === "app" && declared.gate !== "none" &&
|
|
165
|
+
ctx.app?.environment === "production" && !ctx.productionWrite) {
|
|
166
|
+
throw new ProductionWriteError(declared);
|
|
167
|
+
}
|
|
168
|
+
// The tier decides which credential the action gets, which is the whole
|
|
169
|
+
// point of declaring it: `admin` acts as the factory, `app` acts inside one
|
|
170
|
+
// app's data and can reach nothing else.
|
|
171
|
+
const client = declared.tier === "app"
|
|
172
|
+
? await appClientFor(service, ctx)
|
|
173
|
+
: await clientFor(service, ctx);
|
|
174
|
+
return perform(client, args);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* What every key enables, in parallel.
|
|
178
|
+
*
|
|
179
|
+
* The evidence tier is the honest part: most providers will not say what a key
|
|
180
|
+
* may do, and rendering "it authenticated" the same as "these are its declared
|
|
181
|
+
* scopes" implies an assurance nobody obtained.
|
|
182
|
+
*/
|
|
183
|
+
export async function accessAll(ctx) {
|
|
184
|
+
return Promise.all(Object.keys(CLIENTS).map(async (service) => {
|
|
185
|
+
try {
|
|
186
|
+
const c = await clientFor(service, ctx);
|
|
187
|
+
const access = c.access;
|
|
188
|
+
if (!access)
|
|
189
|
+
throw new Error(`${service} has no access probe`);
|
|
190
|
+
return (await access());
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
return {
|
|
194
|
+
service, ok: false, evidence: "reachability", can: [], notes: [],
|
|
195
|
+
error: err instanceof Error ? err.message.slice(0, 120) : String(err),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
}));
|
|
199
|
+
}
|
|
200
|
+
/** Every service's health, in parallel. */
|
|
201
|
+
export async function statusAll(ctx) {
|
|
202
|
+
return Promise.all(Object.keys(CLIENTS).map(async (service) => {
|
|
203
|
+
try {
|
|
204
|
+
const c = await clientFor(service, ctx);
|
|
205
|
+
const status = c.status;
|
|
206
|
+
if (!status)
|
|
207
|
+
throw new Error(`${service} has no status probe`);
|
|
208
|
+
return (await status());
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
return {
|
|
212
|
+
service, ok: false, detail: "unreachable",
|
|
213
|
+
error: err instanceof Error ? err.message.slice(0, 120) : String(err),
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
}));
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/admin/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infisical as a SecretStore.
|
|
3
|
+
*
|
|
4
|
+
* References look like:
|
|
5
|
+
* infisical://heychunky-main/main//GH_TOKEN
|
|
6
|
+
* infisical://heychunky-apps/production/codelambs/DATABASE_URL
|
|
7
|
+
* └─ project ──┘ └─ env ──┘ └ folder ┘ └── key ──┘
|
|
8
|
+
*
|
|
9
|
+
* The folder segment may be empty (two slashes) for secrets at the root of an
|
|
10
|
+
* environment, which is how the factory project is laid out — one environment,
|
|
11
|
+
* no folders.
|
|
12
|
+
*
|
|
13
|
+
* Written against `fetch` rather than @infisical/sdk on purpose: the Core ships
|
|
14
|
+
* to other people, and a secrets library should not drag a dependency tree
|
|
15
|
+
* behind it. The API surface used here is three endpoints.
|
|
16
|
+
*/
|
|
17
|
+
import type { SecretStore } from "../../secrets/store.ts";
|
|
18
|
+
export interface InfisicalRef {
|
|
19
|
+
project: string;
|
|
20
|
+
environment: string;
|
|
21
|
+
/** Folder path without leading slash. Empty string means the root. */
|
|
22
|
+
folder: string;
|
|
23
|
+
key: string;
|
|
24
|
+
}
|
|
25
|
+
export declare class InfisicalError extends Error {
|
|
26
|
+
readonly status: number | undefined;
|
|
27
|
+
constructor(message: string, status?: number);
|
|
28
|
+
}
|
|
29
|
+
/** Parse `infisical://project/environment/folder/KEY`. */
|
|
30
|
+
export declare function parseInfisicalRef(raw: string): InfisicalRef;
|
|
31
|
+
export interface InfisicalCredentials {
|
|
32
|
+
clientId: string;
|
|
33
|
+
clientSecret: string;
|
|
34
|
+
/** Override for self-hosted instances. */
|
|
35
|
+
host?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* A SecretStore backed by Infisical.
|
|
39
|
+
*
|
|
40
|
+
* Authenticates lazily on first use and reuses the access token for the
|
|
41
|
+
* lifetime of the process — one login per run rather than one per secret.
|
|
42
|
+
* Project slugs are resolved to ids once and cached for the same reason.
|
|
43
|
+
*/
|
|
44
|
+
export declare function infisicalStore(creds: InfisicalCredentials): SecretStore;
|
|
45
|
+
//# sourceMappingURL=infisical.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infisical.d.ts","sourceRoot":"","sources":["../../../src/admin/secrets/infisical.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAI1D,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;gBAExB,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAK7C;AAED,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAO3D;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,oBAAoB,GAAG,WAAW,CAmLvE"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
const DEFAULT_HOST = "https://app.infisical.com";
|
|
2
|
+
export class InfisicalError extends Error {
|
|
3
|
+
status;
|
|
4
|
+
constructor(message, status) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "InfisicalError";
|
|
7
|
+
this.status = status;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/** Parse `infisical://project/environment/folder/KEY`. */
|
|
11
|
+
export function parseInfisicalRef(raw) {
|
|
12
|
+
const m = /^infisical:\/\/([^/]+)\/([^/]+)\/(.*)\/([^/]+)$/.exec(raw.trim());
|
|
13
|
+
if (!m)
|
|
14
|
+
throw new InfisicalError(`Not an infisical:// reference: ${raw}`);
|
|
15
|
+
const [, project, environment, folder, key] = m;
|
|
16
|
+
return { project, environment, folder, key };
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A SecretStore backed by Infisical.
|
|
20
|
+
*
|
|
21
|
+
* Authenticates lazily on first use and reuses the access token for the
|
|
22
|
+
* lifetime of the process — one login per run rather than one per secret.
|
|
23
|
+
* Project slugs are resolved to ids once and cached for the same reason.
|
|
24
|
+
*/
|
|
25
|
+
export function infisicalStore(creds) {
|
|
26
|
+
const host = creds.host ?? DEFAULT_HOST;
|
|
27
|
+
let token;
|
|
28
|
+
const projectIds = new Map();
|
|
29
|
+
async function login() {
|
|
30
|
+
const res = await fetch(`${host}/api/v1/auth/universal-auth/login`, {
|
|
31
|
+
method: "POST",
|
|
32
|
+
headers: { "content-type": "application/json" },
|
|
33
|
+
body: JSON.stringify({
|
|
34
|
+
clientId: creds.clientId,
|
|
35
|
+
clientSecret: creds.clientSecret,
|
|
36
|
+
}),
|
|
37
|
+
});
|
|
38
|
+
if (!res.ok) {
|
|
39
|
+
throw new InfisicalError(`Infisical login failed (${res.status}). Check the client id and secret ` +
|
|
40
|
+
`for this identity, and that it has not been locked out.`, res.status);
|
|
41
|
+
}
|
|
42
|
+
const body = (await res.json());
|
|
43
|
+
if (!body.accessToken)
|
|
44
|
+
throw new InfisicalError("Login returned no access token");
|
|
45
|
+
return body.accessToken;
|
|
46
|
+
}
|
|
47
|
+
async function auth() {
|
|
48
|
+
token ??= login();
|
|
49
|
+
return token;
|
|
50
|
+
}
|
|
51
|
+
async function api(path, init = {}) {
|
|
52
|
+
const method = init.method ?? "GET";
|
|
53
|
+
const res = await fetch(`${host}${path}`, {
|
|
54
|
+
method,
|
|
55
|
+
headers: {
|
|
56
|
+
authorization: `Bearer ${await auth()}`,
|
|
57
|
+
...(init.body ? { "content-type": "application/json" } : {}),
|
|
58
|
+
},
|
|
59
|
+
...(init.body ? { body: JSON.stringify(init.body) } : {}),
|
|
60
|
+
});
|
|
61
|
+
if (!res.ok) {
|
|
62
|
+
const text = await res.text().catch(() => "");
|
|
63
|
+
throw new InfisicalError(`${method} ${path} → ${res.status}${text ? `: ${text.slice(0, 200)}` : ""}`, res.status);
|
|
64
|
+
}
|
|
65
|
+
return (await res.json());
|
|
66
|
+
}
|
|
67
|
+
/** Project slug → id. Cached: the id never changes for a given slug. */
|
|
68
|
+
async function projectId(slug) {
|
|
69
|
+
let hit = projectIds.get(slug);
|
|
70
|
+
if (!hit) {
|
|
71
|
+
hit = (async () => {
|
|
72
|
+
const body = await api("/api/v1/workspace");
|
|
73
|
+
const found = (body.workspaces ?? []).find((w) => w.slug === slug || w.name === slug);
|
|
74
|
+
if (!found) {
|
|
75
|
+
const names = (body.workspaces ?? []).map((w) => w.slug).join(", ");
|
|
76
|
+
throw new InfisicalError(`No Infisical project "${slug}" visible to this identity. ` +
|
|
77
|
+
`It can see: ${names || "none"}. Check the identity is added to the project.`);
|
|
78
|
+
}
|
|
79
|
+
return found.id;
|
|
80
|
+
})();
|
|
81
|
+
projectIds.set(slug, hit);
|
|
82
|
+
}
|
|
83
|
+
return hit;
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
owns(ref) {
|
|
87
|
+
return ref.trimStart().startsWith("infisical://");
|
|
88
|
+
},
|
|
89
|
+
async get(ref) {
|
|
90
|
+
const { project, environment, folder, key } = parseInfisicalRef(ref);
|
|
91
|
+
const id = await projectId(project);
|
|
92
|
+
const path = folder ? `/${folder}` : "/";
|
|
93
|
+
const query = new URLSearchParams({
|
|
94
|
+
workspaceId: id,
|
|
95
|
+
environment,
|
|
96
|
+
secretPath: path,
|
|
97
|
+
});
|
|
98
|
+
const body = await api(`/api/v3/secrets/raw/${encodeURIComponent(key)}?${query}`);
|
|
99
|
+
const value = body.secret?.secretValue;
|
|
100
|
+
if (value === undefined) {
|
|
101
|
+
throw new InfisicalError(`No secret "${key}" at ${project}/${environment}${path}`);
|
|
102
|
+
}
|
|
103
|
+
return value;
|
|
104
|
+
},
|
|
105
|
+
/**
|
|
106
|
+
* Every secret in one folder.
|
|
107
|
+
*
|
|
108
|
+
* The prefix names the folder, so it ends where a key would begin:
|
|
109
|
+
* `infisical://heychunky-apps/production/carmelcity/`. Asking for a value
|
|
110
|
+
* instead is a caller error rather than an empty result.
|
|
111
|
+
*/
|
|
112
|
+
async list(prefix) {
|
|
113
|
+
const trimmed = prefix.trimStart();
|
|
114
|
+
if (!trimmed.endsWith("/")) {
|
|
115
|
+
throw new InfisicalError(`Not a folder reference: ${prefix} — it must end with "/"`);
|
|
116
|
+
}
|
|
117
|
+
const { project, environment, folder } = parseInfisicalRef(`${trimmed}_`);
|
|
118
|
+
const id = await projectId(project);
|
|
119
|
+
const query = new URLSearchParams({
|
|
120
|
+
workspaceId: id,
|
|
121
|
+
environment,
|
|
122
|
+
secretPath: folder ? `/${folder}` : "/",
|
|
123
|
+
});
|
|
124
|
+
// A folder holding nothing does not exist, as far as Infisical is
|
|
125
|
+
// concerned — it is created by the first secret put in it. An app that
|
|
126
|
+
// has no values for an environment is an ordinary state, not an error,
|
|
127
|
+
// so an absent folder lists as empty rather than throwing.
|
|
128
|
+
let body;
|
|
129
|
+
try {
|
|
130
|
+
body = await api(`/api/v3/secrets/raw?${query}`);
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
if (err instanceof InfisicalError && err.status === 404)
|
|
134
|
+
return {};
|
|
135
|
+
throw err;
|
|
136
|
+
}
|
|
137
|
+
const out = {};
|
|
138
|
+
for (const s of body.secrets ?? [])
|
|
139
|
+
out[s.secretKey] = s.secretValue;
|
|
140
|
+
return out;
|
|
141
|
+
},
|
|
142
|
+
/**
|
|
143
|
+
* Write one value.
|
|
144
|
+
*
|
|
145
|
+
* The folder is made first. Infisical has no folder until a secret is put
|
|
146
|
+
* in one, so writing to an app's environment for the first time would
|
|
147
|
+
* otherwise fail on a path the caller has every reason to think exists.
|
|
148
|
+
*
|
|
149
|
+
* Create, then update on conflict: Infisical distinguishes the two and a
|
|
150
|
+
* caller should not have to. Idempotent either way, which is what a
|
|
151
|
+
* provisioning run that died halfway needs.
|
|
152
|
+
*/
|
|
153
|
+
async set(ref, value) {
|
|
154
|
+
const { project, environment, folder, key } = parseInfisicalRef(ref);
|
|
155
|
+
const workspaceId = await projectId(project);
|
|
156
|
+
const secretPath = folder ? `/${folder}` : "/";
|
|
157
|
+
if (folder) {
|
|
158
|
+
try {
|
|
159
|
+
await api("/api/v1/folders", {
|
|
160
|
+
method: "POST",
|
|
161
|
+
body: { workspaceId, environment, path: "/", name: folder },
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
// Already there is the ordinary case on every write after the first.
|
|
166
|
+
if (!(err instanceof InfisicalError) || err.status !== 400)
|
|
167
|
+
throw err;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const body = { workspaceId, environment, secretPath, secretValue: value };
|
|
171
|
+
try {
|
|
172
|
+
await api(`/api/v3/secrets/raw/${encodeURIComponent(key)}`, { method: "POST", body });
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
if (!(err instanceof InfisicalError) || err.status !== 400)
|
|
176
|
+
throw err;
|
|
177
|
+
await api(`/api/v3/secrets/raw/${encodeURIComponent(key)}`, { method: "PATCH", body });
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=infisical.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infisical.js","sourceRoot":"","sources":["../../../src/admin/secrets/infisical.ts"],"names":[],"mappings":"AAkBA,MAAM,YAAY,GAAG,2BAA2B,CAAC;AAUjD,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,MAAM,CAAqB;IAEpC,YAAY,OAAe,EAAE,MAAe;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,0DAA0D;AAC1D,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,CAAC,GAAG,iDAAiD,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7E,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,cAAc,CAAC,kCAAkC,GAAG,EAAE,CAAC,CAAC;IAC1E,MAAM,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAE7C,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC/C,CAAC;AASD;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,KAA2B;IACxD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,YAAY,CAAC;IACxC,IAAI,KAAkC,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEtD,KAAK,UAAU,KAAK;QAClB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,mCAAmC,EAAE;YAClE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,YAAY,EAAE,KAAK,CAAC,YAAY;aACjC,CAAC;SACH,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,cAAc,CACtB,2BAA2B,GAAG,CAAC,MAAM,oCAAoC;gBACvE,yDAAyD,EAC3D,GAAG,CAAC,MAAM,CACX,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA6B,CAAC;QAC5D,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,cAAc,CAAC,gCAAgC,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,KAAK,UAAU,IAAI;QACjB,KAAK,KAAK,KAAK,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,UAAU,GAAG,CAChB,IAAY,EACZ,OAA8D,EAAE;QAEhE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;QACpC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE;YACxC,MAAM;YACN,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,MAAM,IAAI,EAAE,EAAE;gBACvC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7D;YACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1D,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,cAAc,CACtB,GAAG,MAAM,IAAI,IAAI,MAAM,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAC3E,GAAG,CAAC,MAAM,CACX,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAC;IACjC,CAAC;IAED,wEAAwE;IACxE,KAAK,UAAU,SAAS,CAAC,IAAY;QACnC,IAAI,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE;gBAChB,MAAM,IAAI,GAAG,MAAM,GAAG,CACpB,mBAAmB,CACpB,CAAC;gBACF,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAC1C,CAAC;gBACF,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACpE,MAAM,IAAI,cAAc,CACtB,yBAAyB,IAAI,8BAA8B;wBACzD,eAAe,KAAK,IAAI,MAAM,+CAA+C,CAChF,CAAC;gBACJ,CAAC;gBACD,OAAO,KAAK,CAAC,EAAE,CAAC;YAClB,CAAC,CAAC,EAAE,CAAC;YACL,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO;QACL,IAAI,CAAC,GAAW;YACd,OAAO,GAAG,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QACpD,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAW;YACnB,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;YACrE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YACzC,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC;gBAChC,WAAW,EAAE,EAAE;gBACf,WAAW;gBACX,UAAU,EAAE,IAAI;aACjB,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,GAAG,CACpB,uBAAuB,kBAAkB,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,CAC1D,CAAC;YACF,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;YACvC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,IAAI,cAAc,CACtB,cAAc,GAAG,QAAQ,OAAO,IAAI,WAAW,GAAG,IAAI,EAAE,CACzD,CAAC;YACJ,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD;;;;;;WAMG;QACH,KAAK,CAAC,IAAI,CAAC,MAAc;YACvB,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,cAAc,CACtB,2BAA2B,MAAM,yBAAyB,CAC3D,CAAC;YACJ,CAAC;YACD,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;YAC1E,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC;gBAChC,WAAW,EAAE,EAAE;gBACf,WAAW;gBACX,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG;aACxC,CAAC,CAAC;YACH,kEAAkE;YAClE,uEAAuE;YACvE,uEAAuE;YACvE,2DAA2D;YAC3D,IAAI,IAAgE,CAAC;YACrE,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,GAAG,CACd,uBAAuB,KAAK,EAAE,CAC/B,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,cAAc,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;oBAAE,OAAO,EAAE,CAAC;gBACnE,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,MAAM,GAAG,GAA2B,EAAE,CAAC;YACvC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE;gBAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC;YACrE,OAAO,GAAG,CAAC;QACb,CAAC;QAED;;;;;;;;;;WAUG;QACH,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa;YAClC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;YACrE,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;YAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YAE/C,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC;oBACH,MAAM,GAAG,CAAC,iBAAiB,EAAE;wBAC3B,MAAM,EAAE,MAAM;wBACd,IAAI,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE;qBAC5D,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,qEAAqE;oBACrE,IAAI,CAAC,CAAC,GAAG,YAAY,cAAc,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;wBAAE,MAAM,GAAG,CAAC;gBACxE,CAAC;YACH,CAAC;YAED,MAAM,IAAI,GAAG,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;YAC1E,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,uBAAuB,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACxF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,CAAC,GAAG,YAAY,cAAc,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;oBAAE,MAAM,GAAG,CAAC;gBACtE,MAAM,GAAG,CAAC,uBAAuB,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ServiceAccess, type ServiceStatus } from "../../services/types.ts";
|
|
2
|
+
export interface Inbox {
|
|
3
|
+
inbox_id: string;
|
|
4
|
+
email: string;
|
|
5
|
+
display_name?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function agentmail(token: string): {
|
|
8
|
+
inboxes: () => Promise<Inbox[]>;
|
|
9
|
+
domains: () => Promise<{
|
|
10
|
+
domain: string;
|
|
11
|
+
status: string;
|
|
12
|
+
}[]>;
|
|
13
|
+
status(): Promise<ServiceStatus>;
|
|
14
|
+
access(): Promise<ServiceAccess>;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=agentmail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentmail.d.ts","sourceRoot":"","sources":["../../../src/admin/services/agentmail.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsB,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAErG,MAAM,WAAW,KAAK;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE;AAEjF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM;;;gBAM2B,MAAM;gBAAU,MAAM;;cAKpE,OAAO,CAAC,aAAa,CAAC;cAQtB,OAAO,CAAC,aAAa,CAAC;EAmBzC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentMail — agent inboxes. API base is /v0, not /v1.
|
|
3
|
+
*/
|
|
4
|
+
import { request } from "../../http/request.js";
|
|
5
|
+
import { probe, probeAccess } from "../../services/types.js";
|
|
6
|
+
export function agentmail(token) {
|
|
7
|
+
const creds = { token };
|
|
8
|
+
// v0, not v1 — /v1/inboxes is a 404.
|
|
9
|
+
const BASE = "https://api.agentmail.to/v0";
|
|
10
|
+
const inboxes = async () => (await request(`${BASE}/inboxes`, { credentials: creds })).inboxes;
|
|
11
|
+
const domains = async () => (await request(`${BASE}/domains`, { credentials: creds })).domains;
|
|
12
|
+
return {
|
|
13
|
+
inboxes,
|
|
14
|
+
domains,
|
|
15
|
+
async status() {
|
|
16
|
+
return probe("agentmail", async () => {
|
|
17
|
+
const [b, d] = await Promise.all([inboxes(), domains()]);
|
|
18
|
+
const unverified = d.filter((x) => x.status !== "VERIFIED").length;
|
|
19
|
+
return `${b.length} inbox${b.length === 1 ? "" : "es"}, ${d.length} domain${d.length === 1 ? "" : "s"}` +
|
|
20
|
+
(unverified ? ` ⚠️ ${unverified} unverified` : "");
|
|
21
|
+
});
|
|
22
|
+
},
|
|
23
|
+
async access() {
|
|
24
|
+
return probeAccess("agentmail", async () => {
|
|
25
|
+
const [b, d] = await Promise.all([inboxes(), domains()]);
|
|
26
|
+
const verified = d.filter((x) => x.status === "VERIFIED");
|
|
27
|
+
return {
|
|
28
|
+
evidence: "identity",
|
|
29
|
+
can: [
|
|
30
|
+
`read and manage ${b.length} inboxes: ${b.map((x) => x.email).join(", ")}`,
|
|
31
|
+
`send from ${verified.length} verified domains: ${verified.map((x) => x.domain).join(", ")}`,
|
|
32
|
+
"create domains and inboxes, and read every thread on them",
|
|
33
|
+
],
|
|
34
|
+
notes: [
|
|
35
|
+
"keys can be scoped to a single inbox with granular permissions — this one is organisation-wide",
|
|
36
|
+
"an unverified domain fails at send time, not at creation time",
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=agentmail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentmail.js","sourceRoot":"","sources":["../../../src/admin/services/agentmail.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAoB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,WAAW,EAA0C,MAAM,yBAAyB,CAAC;AAIrG,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,MAAM,KAAK,GAAgB,EAAE,KAAK,EAAE,CAAC;IACrC,qCAAqC;IACrC,MAAM,IAAI,GAAG,6BAA6B,CAAC;IAE3C,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,OAAO,CAAuB,GAAG,IAAI,UAAU,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IACrH,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,OAAO,CAAoD,GAAG,IAAI,UAAU,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAElJ,OAAO;QACL,OAAO;QACP,OAAO;QACP,KAAK,CAAC,MAAM;YACV,OAAO,KAAK,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;gBACnC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;gBACzD,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;gBACnE,OAAO,GAAG,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE;oBACrG,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,UAAU,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvD,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,MAAM;YACV,OAAO,WAAW,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;gBACzC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;gBACzD,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;gBAC1D,OAAO;oBACL,QAAQ,EAAE,UAAmB;oBAC7B,GAAG,EAAE;wBACH,mBAAmB,CAAC,CAAC,MAAM,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;wBAC1E,aAAa,QAAQ,CAAC,MAAM,sBAAsB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;wBAC5F,2DAA2D;qBAC5D;oBACD,KAAK,EAAE;wBACL,gGAAgG;wBAChG,+DAA+D;qBAChE;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 declare function aiGateway(token: string): {
|
|
3
|
+
credits: () => Promise<{
|
|
4
|
+
balance: string;
|
|
5
|
+
total_used: string;
|
|
6
|
+
}>;
|
|
7
|
+
models: () => Promise<{
|
|
8
|
+
id: string;
|
|
9
|
+
}[]>;
|
|
10
|
+
status(): Promise<ServiceStatus>;
|
|
11
|
+
access(): Promise<ServiceAccess>;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=ai-gateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-gateway.d.ts","sourceRoot":"","sources":["../../../src/admin/services/ai-gateway.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsB,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAErG,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM;;iBAII,MAAM;oBAAc,MAAM;;;YACX,MAAM;;cAK5C,OAAO,CAAC,aAAa,CAAC;cAMtB,OAAO,CAAC,aAAa,CAAC;EAWzC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vercel AI Gateway — model routing across providers. Metered by balance.
|
|
3
|
+
*/
|
|
4
|
+
import { request } from "../../http/request.js";
|
|
5
|
+
import { probe, probeAccess } from "../../services/types.js";
|
|
6
|
+
export function aiGateway(token) {
|
|
7
|
+
const creds = { token };
|
|
8
|
+
const BASE = "https://ai-gateway.vercel.sh/v1";
|
|
9
|
+
const credits = () => request(`${BASE}/credits`, { credentials: creds });
|
|
10
|
+
const models = async () => (await request(`${BASE}/models`, { credentials: creds })).data;
|
|
11
|
+
return {
|
|
12
|
+
credits,
|
|
13
|
+
models,
|
|
14
|
+
async status() {
|
|
15
|
+
return probe("ai-gateway", async () => {
|
|
16
|
+
const [c, m] = await Promise.all([credits(), models()]);
|
|
17
|
+
return `$${c.balance} balance, $${c.total_used} used · ${m.length} models`;
|
|
18
|
+
});
|
|
19
|
+
},
|
|
20
|
+
async access() {
|
|
21
|
+
return probeAccess("ai-gateway", async () => {
|
|
22
|
+
const [c, m] = await Promise.all([credits(), models()]);
|
|
23
|
+
return {
|
|
24
|
+
evidence: "identity",
|
|
25
|
+
can: [`route inference to ${m.length} models`, `spend the $${c.balance} remaining balance`],
|
|
26
|
+
notes: ["account-wide key; no per-app or per-model scoping", `$${c.total_used} used so far`],
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=ai-gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-gateway.js","sourceRoot":"","sources":["../../../src/admin/services/ai-gateway.ts"],"names":[],"mappings":"AAAA;;GAEG;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,MAAM,IAAI,GAAG,iCAAiC,CAAC;IAE/C,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,OAAO,CAA0C,GAAG,IAAI,UAAU,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAClH,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,OAAO,CAA6B,GAAG,IAAI,SAAS,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAEtH,OAAO;QACL,OAAO;QACP,MAAM;QACN,KAAK,CAAC,MAAM;YACV,OAAO,KAAK,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;gBACpC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;gBACxD,OAAO,IAAI,CAAC,CAAC,OAAO,cAAc,CAAC,CAAC,UAAU,WAAW,CAAC,CAAC,MAAM,SAAS,CAAC;YAC7E,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,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;gBACxD,OAAO;oBACL,QAAQ,EAAE,UAAU;oBACpB,GAAG,EAAE,CAAC,sBAAsB,CAAC,CAAC,MAAM,SAAS,EAAE,cAAc,CAAC,CAAC,OAAO,oBAAoB,CAAC;oBAC3F,KAAK,EAAE,CAAC,mDAAmD,EAAE,IAAI,CAAC,CAAC,UAAU,cAAc,CAAC;iBAC7F,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ServiceAccess, type ServiceStatus } from "../../services/types.ts";
|
|
2
|
+
export interface StorageZone {
|
|
3
|
+
Id: number;
|
|
4
|
+
Name: string;
|
|
5
|
+
Region: string;
|
|
6
|
+
StorageUsed: number;
|
|
7
|
+
FilesStored?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function bunny(token: string): {
|
|
10
|
+
storageZones: () => Promise<StorageZone[]>;
|
|
11
|
+
/** Zones for one app, by the `<app>` / `<app>-private` convention. */
|
|
12
|
+
zonesForApp(app: string): Promise<StorageZone[]>;
|
|
13
|
+
status(): Promise<ServiceStatus>;
|
|
14
|
+
access(): Promise<ServiceAccess>;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=bunny.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bunny.d.ts","sourceRoot":"","sources":["../../../src/admin/services/bunny.ts"],"names":[],"mappings":"AAcA,OAAO,EAAsB,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAIrG,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM;wBAGF,OAAO,CAAC,WAAW,EAAE,CAAC;IAenD,sEAAsE;qBAC/C,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;cAKtC,OAAO,CAAC,aAAa,CAAC;cAQtB,OAAO,CAAC,aAAa,CAAC;EAczC"}
|