@astablebridge/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/dist/auth/credentials.d.ts +19 -0
- package/dist/auth/credentials.d.ts.map +1 -0
- package/dist/auth/credentials.js +154 -0
- package/dist/auth/credentials.js.map +1 -0
- package/dist/cdn/index.d.ts +3 -0
- package/dist/cdn/index.d.ts.map +1 -0
- package/dist/cdn/index.js +47 -0
- package/dist/cdn/index.js.map +1 -0
- package/dist/client/stability.d.ts +17 -0
- package/dist/client/stability.d.ts.map +1 -0
- package/dist/client/stability.js +83 -0
- package/dist/client/stability.js.map +1 -0
- package/dist/config/project.d.ts +16 -0
- package/dist/config/project.d.ts.map +1 -0
- package/dist/config/project.js +126 -0
- package/dist/config/project.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/insert/index.d.ts +10 -0
- package/dist/insert/index.d.ts.map +1 -0
- package/dist/insert/index.js +92 -0
- package/dist/insert/index.js.map +1 -0
- package/dist/onboard/server.d.ts +20 -0
- package/dist/onboard/server.d.ts.map +1 -0
- package/dist/onboard/server.js +278 -0
- package/dist/onboard/server.js.map +1 -0
- package/dist/placement/assets.d.ts +12 -0
- package/dist/placement/assets.d.ts.map +1 -0
- package/dist/placement/assets.js +65 -0
- package/dist/placement/assets.js.map +1 -0
- package/dist/types.d.ts +85 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Preferences } from "../types.js";
|
|
2
|
+
export declare const DEFAULT_PREFERENCES: Preferences;
|
|
3
|
+
export declare function ensureConfigDir(): Promise<void>;
|
|
4
|
+
export declare function getKeyHint(key: string): string;
|
|
5
|
+
export declare function redactSecrets(text: string, key?: string | null): string;
|
|
6
|
+
export declare function getApiKey(): Promise<{
|
|
7
|
+
key: string | null;
|
|
8
|
+
source: "env" | "keychain" | "file" | null;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function setApiKey(apiKey: string, useKeychain?: boolean): Promise<void>;
|
|
11
|
+
export declare function validateKey(apiKey: string): Promise<{
|
|
12
|
+
valid: boolean;
|
|
13
|
+
balance?: number;
|
|
14
|
+
error?: string;
|
|
15
|
+
}>;
|
|
16
|
+
export declare function getBalance(apiKey: string): Promise<number>;
|
|
17
|
+
export declare function getPreferences(): Promise<Preferences | null>;
|
|
18
|
+
export declare function setPreferences(preferences: Partial<Preferences>): Promise<Preferences>;
|
|
19
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/auth/credentials.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,aAAa,CAAC;AAE5D,eAAO,MAAM,mBAAmB,EAAE,WAOjC,CAAC;AAeF,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAMrD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAMvE;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CA+B7G;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BjF;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB/G;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMhE;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAWlE;AAED,wBAAsB,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAO5F"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile, chmod } from "node:fs/promises";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { CONFIG_DIR, CREDENTIALS_FILE, PREFERENCES_FILE, KEYCHAIN_ACCOUNT, KEYCHAIN_SERVICE } from "../types.js";
|
|
4
|
+
export const DEFAULT_PREFERENCES = {
|
|
5
|
+
defaultModel: "core",
|
|
6
|
+
defaultFormat: "webp",
|
|
7
|
+
defaultAspectRatio: "1:1",
|
|
8
|
+
cdnEnabled: false,
|
|
9
|
+
creditBudgetFloor: 0,
|
|
10
|
+
autonomyMode: "plan-then-execute",
|
|
11
|
+
};
|
|
12
|
+
let keytarModule;
|
|
13
|
+
async function getKeytar() {
|
|
14
|
+
if (keytarModule !== undefined)
|
|
15
|
+
return keytarModule;
|
|
16
|
+
try {
|
|
17
|
+
keytarModule = await import("keytar");
|
|
18
|
+
return keytarModule;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
keytarModule = null;
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export async function ensureConfigDir() {
|
|
26
|
+
if (!existsSync(CONFIG_DIR)) {
|
|
27
|
+
await mkdir(CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
await chmod(CONFIG_DIR, 0o700).catch(() => { });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function getKeyHint(key) {
|
|
34
|
+
if (key.length <= 8)
|
|
35
|
+
return "sk-***";
|
|
36
|
+
return `${key.slice(0, 3)}...${key.slice(-3)}`;
|
|
37
|
+
}
|
|
38
|
+
export function redactSecrets(text, key) {
|
|
39
|
+
let result = text;
|
|
40
|
+
if (key) {
|
|
41
|
+
result = result.split(key).join(getKeyHint(key));
|
|
42
|
+
}
|
|
43
|
+
return result.replace(/sk-[A-Za-z0-9_-]{8,}/g, (match) => getKeyHint(match));
|
|
44
|
+
}
|
|
45
|
+
export async function getApiKey() {
|
|
46
|
+
const envKey = process.env.STABILITY_API_KEY?.trim();
|
|
47
|
+
if (envKey) {
|
|
48
|
+
return { key: envKey, source: "env" };
|
|
49
|
+
}
|
|
50
|
+
const keytar = await getKeytar();
|
|
51
|
+
if (keytar) {
|
|
52
|
+
try {
|
|
53
|
+
const keychainKey = await keytar.getPassword(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT);
|
|
54
|
+
if (keychainKey) {
|
|
55
|
+
return { key: keychainKey, source: "keychain" };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// fall through to file
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (existsSync(CREDENTIALS_FILE)) {
|
|
63
|
+
try {
|
|
64
|
+
const raw = await readFile(CREDENTIALS_FILE, "utf8");
|
|
65
|
+
const creds = JSON.parse(raw);
|
|
66
|
+
if (creds.apiKey) {
|
|
67
|
+
return { key: creds.apiKey, source: "file" };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return { key: null, source: null };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return { key: null, source: null };
|
|
75
|
+
}
|
|
76
|
+
export async function setApiKey(apiKey, useKeychain = true) {
|
|
77
|
+
await ensureConfigDir();
|
|
78
|
+
const keytar = await getKeytar();
|
|
79
|
+
if (useKeychain && keytar) {
|
|
80
|
+
try {
|
|
81
|
+
await keytar.setPassword(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT, apiKey);
|
|
82
|
+
if (existsSync(CREDENTIALS_FILE)) {
|
|
83
|
+
const creds = {
|
|
84
|
+
apiKey,
|
|
85
|
+
createdAt: new Date().toISOString(),
|
|
86
|
+
};
|
|
87
|
+
await writeFile(CREDENTIALS_FILE, JSON.stringify(creds, null, 2), "utf8");
|
|
88
|
+
await chmod(CREDENTIALS_FILE, 0o600);
|
|
89
|
+
}
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// fall through to file storage
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const creds = {
|
|
97
|
+
apiKey,
|
|
98
|
+
createdAt: new Date().toISOString(),
|
|
99
|
+
};
|
|
100
|
+
await writeFile(CREDENTIALS_FILE, JSON.stringify(creds, null, 2), "utf8");
|
|
101
|
+
await chmod(CREDENTIALS_FILE, 0o600);
|
|
102
|
+
}
|
|
103
|
+
export async function validateKey(apiKey) {
|
|
104
|
+
try {
|
|
105
|
+
const response = await fetch("https://api.stability.ai/v1/user/balance", {
|
|
106
|
+
headers: {
|
|
107
|
+
Authorization: `Bearer ${apiKey}`,
|
|
108
|
+
Accept: "application/json",
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
if (response.status === 401) {
|
|
112
|
+
return { valid: false, error: "Invalid API key (401 Unauthorized)" };
|
|
113
|
+
}
|
|
114
|
+
if (!response.ok) {
|
|
115
|
+
const text = await response.text();
|
|
116
|
+
return { valid: false, error: `Validation failed (${response.status}): ${redactSecrets(text, apiKey)}` };
|
|
117
|
+
}
|
|
118
|
+
const data = (await response.json());
|
|
119
|
+
return { valid: true, balance: data.credits ?? 0 };
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
123
|
+
return { valid: false, error: redactSecrets(message, apiKey) };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
export async function getBalance(apiKey) {
|
|
127
|
+
const result = await validateKey(apiKey);
|
|
128
|
+
if (!result.valid) {
|
|
129
|
+
throw new Error(result.error ?? "Failed to fetch balance");
|
|
130
|
+
}
|
|
131
|
+
return result.balance ?? 0;
|
|
132
|
+
}
|
|
133
|
+
export async function getPreferences() {
|
|
134
|
+
if (!existsSync(PREFERENCES_FILE)) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
const raw = await readFile(PREFERENCES_FILE, "utf8");
|
|
139
|
+
const parsed = JSON.parse(raw);
|
|
140
|
+
return { ...DEFAULT_PREFERENCES, ...parsed };
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
export async function setPreferences(preferences) {
|
|
147
|
+
await ensureConfigDir();
|
|
148
|
+
const existing = (await getPreferences()) ?? DEFAULT_PREFERENCES;
|
|
149
|
+
const merged = { ...existing, ...preferences };
|
|
150
|
+
await writeFile(PREFERENCES_FILE, JSON.stringify(merged, null, 2) + "\n", "utf8");
|
|
151
|
+
await chmod(PREFERENCES_FILE, 0o600).catch(() => { });
|
|
152
|
+
return merged;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/auth/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cdn/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAY7B"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { put } from "@vercel/blob";
|
|
2
|
+
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
|
|
3
|
+
export async function uploadToCdn(buffer, filename, config, contentType) {
|
|
4
|
+
const provider = config.cdn?.provider ?? "vercel-blob";
|
|
5
|
+
if (provider === "vercel-blob") {
|
|
6
|
+
return uploadToVercelBlob(buffer, filename, contentType, config.cdn?.prefix);
|
|
7
|
+
}
|
|
8
|
+
if (provider === "s3") {
|
|
9
|
+
return uploadToS3(buffer, filename, contentType, config);
|
|
10
|
+
}
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
async function uploadToVercelBlob(buffer, filename, contentType, prefix) {
|
|
14
|
+
const token = process.env.BLOB_READ_WRITE_TOKEN;
|
|
15
|
+
if (!token) {
|
|
16
|
+
throw new Error("BLOB_READ_WRITE_TOKEN is required for Vercel Blob uploads");
|
|
17
|
+
}
|
|
18
|
+
const pathname = prefix ? `${prefix}/${filename}` : filename;
|
|
19
|
+
const blob = await put(pathname, buffer, {
|
|
20
|
+
access: "public",
|
|
21
|
+
contentType,
|
|
22
|
+
token,
|
|
23
|
+
});
|
|
24
|
+
return blob.url;
|
|
25
|
+
}
|
|
26
|
+
async function uploadToS3(buffer, filename, contentType, config) {
|
|
27
|
+
const bucket = config.cdn?.bucket ?? process.env.AWS_S3_BUCKET;
|
|
28
|
+
const region = config.cdn?.region ?? process.env.AWS_REGION ?? "us-east-1";
|
|
29
|
+
if (!bucket) {
|
|
30
|
+
throw new Error("S3 bucket is required (set cdn.bucket in config or AWS_S3_BUCKET env var)");
|
|
31
|
+
}
|
|
32
|
+
const client = new S3Client({ region });
|
|
33
|
+
const key = config.cdn?.prefix ? `${config.cdn.prefix}/${filename}` : filename;
|
|
34
|
+
await client.send(new PutObjectCommand({
|
|
35
|
+
Bucket: bucket,
|
|
36
|
+
Key: key,
|
|
37
|
+
Body: buffer,
|
|
38
|
+
ContentType: contentType,
|
|
39
|
+
ACL: "public-read",
|
|
40
|
+
}));
|
|
41
|
+
const baseUrl = process.env.AWS_S3_PUBLIC_URL;
|
|
42
|
+
if (baseUrl) {
|
|
43
|
+
return `${baseUrl.replace(/\/$/, "")}/${key}`;
|
|
44
|
+
}
|
|
45
|
+
return `https://${bucket}.s3.${region}.amazonaws.com/${key}`;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cdn/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGhE,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAc,EACd,QAAgB,EAChB,MAAqB,EACrB,WAAmB;IAEnB,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,EAAE,QAAQ,IAAI,aAAa,CAAC;IAEvD,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC/B,OAAO,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,MAAc,EACd,QAAgB,EAChB,WAAmB,EACnB,MAAe;IAEf,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAChD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC7D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;QACvC,MAAM,EAAE,QAAQ;QAChB,WAAW;QACX,KAAK;KACN,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,GAAG,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,MAAc,EACd,QAAgB,EAChB,WAAmB,EACnB,MAAqB;IAErB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,WAAW,CAAC;IAE3E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;IAE/E,MAAM,MAAM,CAAC,IAAI,CACf,IAAI,gBAAgB,CAAC;QACnB,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,GAAG;QACR,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,WAAW;QACxB,GAAG,EAAE,aAAa;KACnB,CAAC,CACH,CAAC;IAEF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC9C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;IAChD,CAAC;IAED,OAAO,WAAW,MAAM,OAAO,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { GenerateOptions } from "../types.js";
|
|
2
|
+
export declare class StabilityApiError extends Error {
|
|
3
|
+
readonly status: number;
|
|
4
|
+
readonly code?: string | undefined;
|
|
5
|
+
constructor(message: string, status: number, code?: string | undefined);
|
|
6
|
+
}
|
|
7
|
+
export interface ImageGenerationResult {
|
|
8
|
+
buffer: Buffer;
|
|
9
|
+
format: string;
|
|
10
|
+
contentType: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function generateCore(apiKey: string, options: GenerateOptions): Promise<ImageGenerationResult>;
|
|
13
|
+
export declare function generateUltra(apiKey: string, options: GenerateOptions): Promise<ImageGenerationResult>;
|
|
14
|
+
export declare function generateImageWithModel(apiKey: string, options: GenerateOptions): Promise<ImageGenerationResult & {
|
|
15
|
+
model: string;
|
|
16
|
+
}>;
|
|
17
|
+
//# sourceMappingURL=stability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stability.d.ts","sourceRoot":"","sources":["../../src/client/stability.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,qBAAa,iBAAkB,SAAQ,KAAK;aAGxB,MAAM,EAAE,MAAM;aACd,IAAI,CAAC,EAAE,MAAM;gBAF7B,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,YAAA;CAKhC;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAqFD,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAE3G;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAE5G;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,qBAAqB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAOpD"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { STABILITY_API_BASE } from "../types.js";
|
|
2
|
+
import { redactSecrets } from "../auth/credentials.js";
|
|
3
|
+
export class StabilityApiError extends Error {
|
|
4
|
+
status;
|
|
5
|
+
code;
|
|
6
|
+
constructor(message, status, code) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.status = status;
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.name = "StabilityApiError";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
async function parseImageResponse(response, apiKey, outputFormat) {
|
|
14
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
15
|
+
if (contentType.startsWith("image/")) {
|
|
16
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
17
|
+
return {
|
|
18
|
+
buffer: Buffer.from(arrayBuffer),
|
|
19
|
+
format: outputFormat,
|
|
20
|
+
contentType,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const text = await response.text();
|
|
24
|
+
try {
|
|
25
|
+
const json = JSON.parse(text);
|
|
26
|
+
const base64 = json.image ?? json.artifacts?.[0]?.base64;
|
|
27
|
+
if (base64) {
|
|
28
|
+
return {
|
|
29
|
+
buffer: Buffer.from(base64, "base64"),
|
|
30
|
+
format: outputFormat,
|
|
31
|
+
contentType: `image/${outputFormat}`,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// fall through
|
|
37
|
+
}
|
|
38
|
+
throw new StabilityApiError(redactSecrets(`Unexpected response format: ${text.slice(0, 200)}`, apiKey), response.status);
|
|
39
|
+
}
|
|
40
|
+
async function generateImage(apiKey, endpoint, options) {
|
|
41
|
+
const outputFormat = options.outputFormat ?? "webp";
|
|
42
|
+
const aspectRatio = options.aspectRatio ?? "1:1";
|
|
43
|
+
const form = new FormData();
|
|
44
|
+
form.append("prompt", options.prompt);
|
|
45
|
+
form.append("output_format", outputFormat);
|
|
46
|
+
form.append("aspect_ratio", aspectRatio);
|
|
47
|
+
const response = await fetch(`${STABILITY_API_BASE}${endpoint}`, {
|
|
48
|
+
method: "POST",
|
|
49
|
+
headers: {
|
|
50
|
+
Authorization: `Bearer ${apiKey}`,
|
|
51
|
+
Accept: "image/*",
|
|
52
|
+
},
|
|
53
|
+
body: form,
|
|
54
|
+
});
|
|
55
|
+
if (response.status === 401) {
|
|
56
|
+
throw new StabilityApiError("Invalid API key (401 Unauthorized)", 401, "unauthorized");
|
|
57
|
+
}
|
|
58
|
+
if (response.status === 402) {
|
|
59
|
+
throw new StabilityApiError("Insufficient credits (402 Payment Required)", 402, "payment_required");
|
|
60
|
+
}
|
|
61
|
+
if (response.status === 429) {
|
|
62
|
+
throw new StabilityApiError("Rate limited (429). Wait a moment and retry.", 429, "rate_limited");
|
|
63
|
+
}
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
const text = await response.text();
|
|
66
|
+
throw new StabilityApiError(redactSecrets(`Generation failed (${response.status}): ${text.slice(0, 300)}`, apiKey), response.status);
|
|
67
|
+
}
|
|
68
|
+
return parseImageResponse(response, apiKey, outputFormat);
|
|
69
|
+
}
|
|
70
|
+
export async function generateCore(apiKey, options) {
|
|
71
|
+
return generateImage(apiKey, "/v2beta/stable-image/generate/core", options);
|
|
72
|
+
}
|
|
73
|
+
export async function generateUltra(apiKey, options) {
|
|
74
|
+
return generateImage(apiKey, "/v2beta/stable-image/generate/ultra", options);
|
|
75
|
+
}
|
|
76
|
+
export async function generateImageWithModel(apiKey, options) {
|
|
77
|
+
const model = options.model ?? "core";
|
|
78
|
+
const result = model === "ultra"
|
|
79
|
+
? await generateUltra(apiKey, options)
|
|
80
|
+
: await generateCore(apiKey, options);
|
|
81
|
+
return { ...result, model };
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=stability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stability.js","sourceRoot":"","sources":["../../src/client/stability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ProjectConfig } from "../types.js";
|
|
2
|
+
export declare const CONFIG_FILENAME = "stable-bridge.config.json";
|
|
3
|
+
declare const DEFAULT_CONFIG: ProjectConfig;
|
|
4
|
+
export declare function detectAssetsDir(cwd: string): string;
|
|
5
|
+
export declare function loadProjectConfig(cwd: string): Promise<ProjectConfig>;
|
|
6
|
+
export declare function initProject(cwd: string): Promise<{
|
|
7
|
+
configPath: string;
|
|
8
|
+
assetsDir: string;
|
|
9
|
+
created: boolean;
|
|
10
|
+
}>;
|
|
11
|
+
export declare function slugify(text: string): string;
|
|
12
|
+
export declare function buildFilename(prompt: string, format: string, name?: string): string;
|
|
13
|
+
export declare function toPublicPath(assetsDir: string, filename: string): string;
|
|
14
|
+
export declare function getConfigPath(cwd: string): string;
|
|
15
|
+
export { DEFAULT_CONFIG };
|
|
16
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/config/project.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,eAAe,8BAA8B,CAAC;AAE3D,QAAA,MAAM,cAAc,EAAE,aAWrB,CAAC;AAEF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAkCnD;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAoB3E;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC,CAgCD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM5C;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAInF;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CASxE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { createHash } from "node:crypto";
|
|
5
|
+
import { getPreferences } from "../auth/credentials.js";
|
|
6
|
+
export const CONFIG_FILENAME = "stable-bridge.config.json";
|
|
7
|
+
const DEFAULT_CONFIG = {
|
|
8
|
+
assetsDir: "public/images/generated",
|
|
9
|
+
cdn: {
|
|
10
|
+
provider: "vercel-blob",
|
|
11
|
+
enabled: false,
|
|
12
|
+
},
|
|
13
|
+
defaultModel: "core",
|
|
14
|
+
defaultFormat: "webp",
|
|
15
|
+
defaultAspectRatio: "1:1",
|
|
16
|
+
creditBudgetFloor: 0,
|
|
17
|
+
autonomyMode: "plan-then-execute",
|
|
18
|
+
};
|
|
19
|
+
export function detectAssetsDir(cwd) {
|
|
20
|
+
const pkgPath = join(cwd, "package.json");
|
|
21
|
+
if (existsSync(pkgPath)) {
|
|
22
|
+
try {
|
|
23
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
24
|
+
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
25
|
+
if (deps.next || deps["@next/env"]) {
|
|
26
|
+
return "public/images/generated";
|
|
27
|
+
}
|
|
28
|
+
if (deps.vite || deps["@vitejs/plugin-react"]) {
|
|
29
|
+
return "public/images/generated";
|
|
30
|
+
}
|
|
31
|
+
if (deps["react-scripts"]) {
|
|
32
|
+
return "public/images/generated";
|
|
33
|
+
}
|
|
34
|
+
if (deps.react) {
|
|
35
|
+
return "src/assets/generated";
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// fall through
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (existsSync(join(cwd, "public"))) {
|
|
43
|
+
return "public/images/generated";
|
|
44
|
+
}
|
|
45
|
+
if (existsSync(join(cwd, "src", "assets"))) {
|
|
46
|
+
return "src/assets/generated";
|
|
47
|
+
}
|
|
48
|
+
return "assets/generated";
|
|
49
|
+
}
|
|
50
|
+
export async function loadProjectConfig(cwd) {
|
|
51
|
+
const configPath = join(cwd, CONFIG_FILENAME);
|
|
52
|
+
if (!existsSync(configPath)) {
|
|
53
|
+
return { ...DEFAULT_CONFIG, assetsDir: detectAssetsDir(cwd) };
|
|
54
|
+
}
|
|
55
|
+
const raw = await readFile(configPath, "utf8");
|
|
56
|
+
const parsed = JSON.parse(raw);
|
|
57
|
+
return {
|
|
58
|
+
...DEFAULT_CONFIG,
|
|
59
|
+
assetsDir: detectAssetsDir(cwd),
|
|
60
|
+
...parsed,
|
|
61
|
+
cdn: {
|
|
62
|
+
provider: parsed.cdn?.provider ?? DEFAULT_CONFIG.cdn.provider,
|
|
63
|
+
enabled: parsed.cdn?.enabled ?? DEFAULT_CONFIG.cdn.enabled,
|
|
64
|
+
bucket: parsed.cdn?.bucket,
|
|
65
|
+
region: parsed.cdn?.region,
|
|
66
|
+
prefix: parsed.cdn?.prefix,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export async function initProject(cwd) {
|
|
71
|
+
const configPath = join(cwd, CONFIG_FILENAME);
|
|
72
|
+
const assetsDir = detectAssetsDir(cwd);
|
|
73
|
+
let created = false;
|
|
74
|
+
if (!existsSync(configPath)) {
|
|
75
|
+
const prefs = await getPreferences();
|
|
76
|
+
const config = { ...DEFAULT_CONFIG, assetsDir };
|
|
77
|
+
if (prefs) {
|
|
78
|
+
config.defaultModel = prefs.defaultModel;
|
|
79
|
+
config.defaultFormat = prefs.defaultFormat;
|
|
80
|
+
config.defaultAspectRatio = prefs.defaultAspectRatio;
|
|
81
|
+
config.creditBudgetFloor = prefs.creditBudgetFloor;
|
|
82
|
+
config.autonomyMode = prefs.autonomyMode;
|
|
83
|
+
config.cdn = {
|
|
84
|
+
provider: config.cdn?.provider ?? "vercel-blob",
|
|
85
|
+
enabled: prefs.cdnEnabled,
|
|
86
|
+
bucket: config.cdn?.bucket,
|
|
87
|
+
region: config.cdn?.region,
|
|
88
|
+
prefix: config.cdn?.prefix,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
await writeFile(configPath, JSON.stringify(config, null, 2) + "\n", "utf8");
|
|
92
|
+
created = true;
|
|
93
|
+
}
|
|
94
|
+
const fullAssetsPath = join(cwd, assetsDir);
|
|
95
|
+
if (!existsSync(fullAssetsPath)) {
|
|
96
|
+
await mkdir(fullAssetsPath, { recursive: true });
|
|
97
|
+
}
|
|
98
|
+
return { configPath, assetsDir, created };
|
|
99
|
+
}
|
|
100
|
+
export function slugify(text) {
|
|
101
|
+
return text
|
|
102
|
+
.toLowerCase()
|
|
103
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
104
|
+
.replace(/^-+|-+$/g, "")
|
|
105
|
+
.slice(0, 40) || "image";
|
|
106
|
+
}
|
|
107
|
+
export function buildFilename(prompt, format, name) {
|
|
108
|
+
const hash = createHash("sha256").update(prompt + Date.now()).digest("hex").slice(0, 4);
|
|
109
|
+
const base = name ? slugify(name) : slugify(prompt);
|
|
110
|
+
return `${base}-${hash}.${format}`;
|
|
111
|
+
}
|
|
112
|
+
export function toPublicPath(assetsDir, filename) {
|
|
113
|
+
const normalized = assetsDir.replace(/\\/g, "/");
|
|
114
|
+
if (normalized.startsWith("public/")) {
|
|
115
|
+
return "/" + normalized.slice("public/".length) + "/" + filename;
|
|
116
|
+
}
|
|
117
|
+
if (normalized.startsWith("src/assets/")) {
|
|
118
|
+
return "/" + normalized.slice("src/".length) + "/" + filename;
|
|
119
|
+
}
|
|
120
|
+
return "/" + normalized + "/" + filename;
|
|
121
|
+
}
|
|
122
|
+
export function getConfigPath(cwd) {
|
|
123
|
+
return join(cwd, CONFIG_FILENAME);
|
|
124
|
+
}
|
|
125
|
+
export { DEFAULT_CONFIG };
|
|
126
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/config/project.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { getApiKey, getKeyHint, setApiKey, validateKey, getBalance, getPreferences, setPreferences, DEFAULT_PREFERENCES, redactSecrets, ensureConfigDir } from "./auth/credentials.js";
|
|
2
|
+
import { generateCore, generateUltra, generateImageWithModel, StabilityApiError } from "./client/stability.js";
|
|
3
|
+
import { loadProjectConfig, initProject, detectAssetsDir, buildFilename, toPublicPath, slugify, CONFIG_FILENAME, DEFAULT_CONFIG } from "./config/project.js";
|
|
4
|
+
import { placeInProject, BudgetExceededError, ESTIMATED_COST } from "./placement/assets.js";
|
|
5
|
+
import { uploadToCdn } from "./cdn/index.js";
|
|
6
|
+
import { insertImage, buildSnippet, detectFramework, applySnippet } from "./insert/index.js";
|
|
7
|
+
import { startOnboardServer } from "./onboard/server.js";
|
|
8
|
+
import type { Credentials, Preferences, AutonomyMode, ProjectConfig, GenerateOptions, GenerateResult, InsertOptions, InsertResult, StatusResult, InitResult } from "./types.js";
|
|
9
|
+
export { getApiKey, getKeyHint, setApiKey, validateKey, getBalance, getPreferences, setPreferences, DEFAULT_PREFERENCES, redactSecrets, ensureConfigDir, generateCore, generateUltra, generateImageWithModel, StabilityApiError, loadProjectConfig, initProject, detectAssetsDir, buildFilename, toPublicPath, slugify, CONFIG_FILENAME, DEFAULT_CONFIG, placeInProject, BudgetExceededError, ESTIMATED_COST, uploadToCdn, insertImage, buildSnippet, detectFramework, applySnippet, startOnboardServer, };
|
|
10
|
+
export type { Credentials, Preferences, AutonomyMode, ProjectConfig, GenerateOptions, GenerateResult, InsertOptions, InsertResult, StatusResult, InitResult, };
|
|
11
|
+
export declare function getStatus(): Promise<StatusResult>;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/G,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,aAAa,EACb,YAAY,EACZ,OAAO,EACP,eAAe,EACf,cAAc,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,aAAa,EACb,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,aAAa,EACb,YAAY,EACZ,OAAO,EACP,eAAe,EACf,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,WAAW,EACX,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,kBAAkB,GACnB,CAAC;AAEF,YAAY,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,aAAa,EACb,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,UAAU,GACX,CAAC;AAEF,wBAAsB,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC,CAmCvD"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { getApiKey, getKeyHint, setApiKey, validateKey, getBalance, getPreferences, setPreferences, DEFAULT_PREFERENCES, redactSecrets, ensureConfigDir, } from "./auth/credentials.js";
|
|
2
|
+
import { generateCore, generateUltra, generateImageWithModel, StabilityApiError } from "./client/stability.js";
|
|
3
|
+
import { loadProjectConfig, initProject, detectAssetsDir, buildFilename, toPublicPath, slugify, CONFIG_FILENAME, DEFAULT_CONFIG, } from "./config/project.js";
|
|
4
|
+
import { placeInProject, BudgetExceededError, ESTIMATED_COST } from "./placement/assets.js";
|
|
5
|
+
import { uploadToCdn } from "./cdn/index.js";
|
|
6
|
+
import { insertImage, buildSnippet, detectFramework, applySnippet } from "./insert/index.js";
|
|
7
|
+
import { startOnboardServer } from "./onboard/server.js";
|
|
8
|
+
export { getApiKey, getKeyHint, setApiKey, validateKey, getBalance, getPreferences, setPreferences, DEFAULT_PREFERENCES, redactSecrets, ensureConfigDir, generateCore, generateUltra, generateImageWithModel, StabilityApiError, loadProjectConfig, initProject, detectAssetsDir, buildFilename, toPublicPath, slugify, CONFIG_FILENAME, DEFAULT_CONFIG, placeInProject, BudgetExceededError, ESTIMATED_COST, uploadToCdn, insertImage, buildSnippet, detectFramework, applySnippet, startOnboardServer, };
|
|
9
|
+
export async function getStatus() {
|
|
10
|
+
const { key, source } = await getApiKey();
|
|
11
|
+
const prefs = (await getPreferences()) ?? DEFAULT_PREFERENCES;
|
|
12
|
+
const prefsResult = {
|
|
13
|
+
autonomyMode: prefs.autonomyMode,
|
|
14
|
+
creditBudgetFloor: prefs.creditBudgetFloor,
|
|
15
|
+
defaultModel: prefs.defaultModel,
|
|
16
|
+
defaultFormat: prefs.defaultFormat,
|
|
17
|
+
defaultAspectRatio: prefs.defaultAspectRatio,
|
|
18
|
+
cdnEnabled: prefs.cdnEnabled,
|
|
19
|
+
};
|
|
20
|
+
if (!key) {
|
|
21
|
+
return { configured: false, ...prefsResult };
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const balance = await getBalance(key);
|
|
25
|
+
return {
|
|
26
|
+
configured: true,
|
|
27
|
+
keyHint: getKeyHint(key),
|
|
28
|
+
balance,
|
|
29
|
+
source: source ?? undefined,
|
|
30
|
+
...prefsResult,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
35
|
+
return {
|
|
36
|
+
configured: true,
|
|
37
|
+
keyHint: getKeyHint(key),
|
|
38
|
+
source: source ?? undefined,
|
|
39
|
+
error: redactSecrets(message, key),
|
|
40
|
+
...prefsResult,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/G,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,aAAa,EACb,YAAY,EACZ,OAAO,EACP,eAAe,EACf,cAAc,GACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAczD,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,aAAa,EACb,YAAY,EACZ,OAAO,EACP,eAAe,EACf,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,WAAW,EACX,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,kBAAkB,GACnB,CAAC;AAeF,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAG,CAAC,MAAM,cAAc,EAAE,CAAC,IAAI,mBAAmB,CAAC;IAC9D,MAAM,WAAW,GAAG;QAClB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;QAC1C,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC;IAEF,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO;YACL,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC;YACxB,OAAO;YACP,MAAM,EAAE,MAAM,IAAI,SAAS;YAC3B,GAAG,WAAW;SACf,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACL,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC;YACxB,MAAM,EAAE,MAAM,IAAI,SAAS;YAC3B,KAAK,EAAE,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC;YAClC,GAAG,WAAW;SACf,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { InsertOptions, InsertResult } from "../types.js";
|
|
2
|
+
export type Framework = "nextjs" | "react" | "html" | "markdown" | "css";
|
|
3
|
+
export declare function detectFramework(filePath: string): Framework;
|
|
4
|
+
export declare function buildSnippet(framework: Framework, imagePath: string, alt?: string): string;
|
|
5
|
+
export declare function applySnippet(filePath: string, snippet: string, options: {
|
|
6
|
+
placeholder?: string;
|
|
7
|
+
framework: Framework;
|
|
8
|
+
}): Promise<boolean>;
|
|
9
|
+
export declare function insertImage(cwd: string, apiKey: string, options: InsertOptions): Promise<InsertResult>;
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/insert/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAkB,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/E,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,KAAK,CAAC;AAEzE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAgB3D;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,MAAM,EACjB,GAAG,SAAoB,GACtB,MAAM,CAcR;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,GACtD,OAAO,CAAC,OAAO,CAAC,CAkClB;AAED,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CA4BvB"}
|