paytaca-cli 0.7.0 → 0.8.1
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 +72 -6
- package/dist/ai/autoRefill.d.ts +58 -0
- package/dist/ai/autoRefill.d.ts.map +1 -1
- package/dist/ai/autoRefill.js +193 -2
- package/dist/ai/autoRefill.js.map +1 -1
- package/dist/ai/config.d.ts +1 -0
- package/dist/ai/config.d.ts.map +1 -1
- package/dist/ai/config.js +1 -0
- package/dist/ai/config.js.map +1 -1
- package/dist/ai/credits.d.ts.map +1 -1
- package/dist/ai/credits.js +20 -11
- package/dist/ai/credits.js.map +1 -1
- package/dist/ai/images.d.ts +128 -0
- package/dist/ai/images.d.ts.map +1 -0
- package/dist/ai/images.js +399 -0
- package/dist/ai/images.js.map +1 -0
- package/dist/commands/ai.d.ts.map +1 -1
- package/dist/commands/ai.js +283 -7
- package/dist/commands/ai.js.map +1 -1
- package/dist/commands/update.d.ts +32 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +200 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/wallet.js +1 -1
- package/dist/commands/wallet.js.map +1 -1
- package/dist/commands/web.d.ts +3 -0
- package/dist/commands/web.d.ts.map +1 -0
- package/dist/commands/web.js +71 -0
- package/dist/commands/web.js.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +29 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts +2 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +288 -9
- package/dist/mcp/tools.js.map +1 -1
- package/dist/wallet/cauldron/swap.d.ts +15 -0
- package/dist/wallet/cauldron/swap.d.ts.map +1 -1
- package/dist/wallet/cauldron/swap.js +31 -0
- package/dist/wallet/cauldron/swap.js.map +1 -1
- package/dist/wallet/index.d.ts +16 -1
- package/dist/wallet/index.d.ts.map +1 -1
- package/dist/wallet/index.js +74 -8
- package/dist/wallet/index.js.map +1 -1
- package/dist/web/assets.d.ts +3 -0
- package/dist/web/assets.d.ts.map +1 -0
- package/dist/web/assets.js +3 -0
- package/dist/web/assets.js.map +1 -0
- package/dist/web/page.d.ts +2 -0
- package/dist/web/page.d.ts.map +1 -0
- package/dist/web/page.js +638 -0
- package/dist/web/page.js.map +1 -0
- package/dist/web/server.d.ts +79 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +665 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paytaca image generation client + orchestration.
|
|
3
|
+
*
|
|
4
|
+
* Flow: mint a wallet-derived OAuth token, create an order (returns a
|
|
5
|
+
* CashScript contract address + sats price), pay BCH on-chain, confirm the
|
|
6
|
+
* payment (backend verifies the tx via Watchtower), poll until the image is
|
|
7
|
+
* ready, save it under ~/.paytaca/images, and release the one-shot cache.
|
|
8
|
+
*/
|
|
9
|
+
export declare const IMAGE_DIR: string;
|
|
10
|
+
export interface ImageModel {
|
|
11
|
+
id: string;
|
|
12
|
+
display_name?: string;
|
|
13
|
+
pricing_unit?: string;
|
|
14
|
+
cost_per_unit_usd?: number;
|
|
15
|
+
supported_parameters?: string[];
|
|
16
|
+
}
|
|
17
|
+
/** A created, unpaid image order (the "quote" shown before spending). */
|
|
18
|
+
export interface ImageOrderQuote {
|
|
19
|
+
orderId: string;
|
|
20
|
+
prompt: string;
|
|
21
|
+
model?: string;
|
|
22
|
+
pricingUnit?: string;
|
|
23
|
+
contractAddress: string;
|
|
24
|
+
amountSats: number;
|
|
25
|
+
amountUsd?: number;
|
|
26
|
+
estimatedCostUsd?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface ImageOrderStatus {
|
|
29
|
+
id?: string;
|
|
30
|
+
status?: string;
|
|
31
|
+
image?: string | null;
|
|
32
|
+
media_type?: string;
|
|
33
|
+
error?: string;
|
|
34
|
+
settlement_txid?: string;
|
|
35
|
+
note?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface ImageHistoryEntry {
|
|
38
|
+
id: string;
|
|
39
|
+
prompt?: string;
|
|
40
|
+
model?: string;
|
|
41
|
+
model_display_name?: string;
|
|
42
|
+
status?: string;
|
|
43
|
+
price_usd?: number;
|
|
44
|
+
price_sats?: number;
|
|
45
|
+
estimated_cost_usd?: number;
|
|
46
|
+
actual_cost_usd?: number;
|
|
47
|
+
prompt_tokens?: number;
|
|
48
|
+
created_at?: string;
|
|
49
|
+
completed_at?: string;
|
|
50
|
+
filepath?: string;
|
|
51
|
+
}
|
|
52
|
+
export interface ImageHistoryResult {
|
|
53
|
+
count?: number;
|
|
54
|
+
page?: number;
|
|
55
|
+
page_size?: number;
|
|
56
|
+
data?: ImageHistoryEntry[];
|
|
57
|
+
}
|
|
58
|
+
export interface ListImageModelsOptions {
|
|
59
|
+
backendUrl?: string;
|
|
60
|
+
pricingUnit?: string;
|
|
61
|
+
search?: string;
|
|
62
|
+
ordering?: string;
|
|
63
|
+
}
|
|
64
|
+
export interface HistoryOptions {
|
|
65
|
+
backendUrl?: string;
|
|
66
|
+
page?: number;
|
|
67
|
+
pageSize?: number;
|
|
68
|
+
}
|
|
69
|
+
export interface CreateImageOrderOptions {
|
|
70
|
+
prompt: string;
|
|
71
|
+
model?: string;
|
|
72
|
+
aspectRatio?: string;
|
|
73
|
+
quality?: string;
|
|
74
|
+
resolution?: string;
|
|
75
|
+
isChipnet?: boolean;
|
|
76
|
+
backendUrl?: string;
|
|
77
|
+
}
|
|
78
|
+
export interface FulfillImageOrderOptions {
|
|
79
|
+
isChipnet?: boolean;
|
|
80
|
+
backendUrl?: string;
|
|
81
|
+
confirmAttempts?: number;
|
|
82
|
+
confirmSpacingMs?: number;
|
|
83
|
+
pollIntervalMs?: number;
|
|
84
|
+
pollTimeoutMs?: number;
|
|
85
|
+
}
|
|
86
|
+
export type GenerateImageOptions = CreateImageOrderOptions & FulfillImageOrderOptions;
|
|
87
|
+
export interface GenerateImageResult {
|
|
88
|
+
success: boolean;
|
|
89
|
+
paid: boolean;
|
|
90
|
+
orderId?: string;
|
|
91
|
+
model?: string;
|
|
92
|
+
amountSats?: number;
|
|
93
|
+
amountUsd?: number;
|
|
94
|
+
estimatedCostUsd?: number;
|
|
95
|
+
txid?: string;
|
|
96
|
+
status?: string;
|
|
97
|
+
path?: string;
|
|
98
|
+
mediaType?: string;
|
|
99
|
+
base64?: string;
|
|
100
|
+
error?: string;
|
|
101
|
+
}
|
|
102
|
+
export declare const MEDIA_TYPE_EXTENSIONS: Record<string, string>;
|
|
103
|
+
export declare function listImageModels(opts?: ListImageModelsOptions): Promise<ImageModel[]>;
|
|
104
|
+
export declare function getImageHistory(opts?: HistoryOptions): Promise<ImageHistoryResult>;
|
|
105
|
+
/** Create an image order (no funds move). Returns the quote to pay. */
|
|
106
|
+
export declare function createImageOrder(opts: CreateImageOrderOptions): Promise<ImageOrderQuote>;
|
|
107
|
+
/**
|
|
108
|
+
* Pay an existing image order, wait for the image, and save it.
|
|
109
|
+
* Returns a buy_plan-style result: `paid` indicates funds moved.
|
|
110
|
+
*/
|
|
111
|
+
export declare function fulfillImageOrder(quote: ImageOrderQuote, opts?: FulfillImageOrderOptions): Promise<GenerateImageResult>;
|
|
112
|
+
/** End-to-end: create the order, then pay and deliver it. */
|
|
113
|
+
export declare function generateImage(opts: GenerateImageOptions): Promise<GenerateImageResult>;
|
|
114
|
+
/** True when the tool should return a "processing" status instead of an error. */
|
|
115
|
+
export declare function isStillProcessing(result: GenerateImageResult): boolean;
|
|
116
|
+
export interface PollStatusOptions {
|
|
117
|
+
isChipnet?: boolean;
|
|
118
|
+
backendUrl?: string;
|
|
119
|
+
pollIntervalMs?: number;
|
|
120
|
+
pollTimeoutMs?: number;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Poll an existing image order by ID until the image is ready or the
|
|
124
|
+
* deadline is reached. Mints a fresh OAuth token and saves the image
|
|
125
|
+
* to ~/.paytaca/images when generation is complete.
|
|
126
|
+
*/
|
|
127
|
+
export declare function getImageOrderStatus(orderId: string, opts?: PollStatusOptions): Promise<GenerateImageResult>;
|
|
128
|
+
//# sourceMappingURL=images.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../src/ai/images.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paytaca image generation client + orchestration.
|
|
3
|
+
*
|
|
4
|
+
* Flow: mint a wallet-derived OAuth token, create an order (returns a
|
|
5
|
+
* CashScript contract address + sats price), pay BCH on-chain, confirm the
|
|
6
|
+
* payment (backend verifies the tx via Watchtower), poll until the image is
|
|
7
|
+
* ready, save it under ~/.paytaca/images, and release the one-shot cache.
|
|
8
|
+
*/
|
|
9
|
+
import { mkdirSync, writeFileSync, chmodSync } from 'node:fs';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import { requireWallet } from '../core/context.js';
|
|
12
|
+
import { isValidBchAddress } from '../core/wallet.js';
|
|
13
|
+
import { createAuthMaterial, registerOAuthUser, createAccessToken, } from './oauth.js';
|
|
14
|
+
import { AiApiError } from './client.js';
|
|
15
|
+
import { resolveBackendUrl, apiUrl, PAYTACA_DIR } from './config.js';
|
|
16
|
+
export const IMAGE_DIR = path.join(PAYTACA_DIR, 'images');
|
|
17
|
+
const REQUEST_TIMEOUT_MS = 30000;
|
|
18
|
+
const DEFAULT_CONFIRM_ATTEMPTS = 5;
|
|
19
|
+
const DEFAULT_CONFIRM_SPACING_MS = 4000;
|
|
20
|
+
const DEFAULT_POLL_INTERVAL_MS = 3000;
|
|
21
|
+
const DEFAULT_POLL_TIMEOUT_MS = 180000;
|
|
22
|
+
const ALLOWED_MEDIA_TYPES = new Set([
|
|
23
|
+
'image/png',
|
|
24
|
+
'image/jpeg',
|
|
25
|
+
'image/webp',
|
|
26
|
+
'image/gif',
|
|
27
|
+
]);
|
|
28
|
+
export const MEDIA_TYPE_EXTENSIONS = {
|
|
29
|
+
'image/png': 'png',
|
|
30
|
+
'image/jpeg': 'jpg',
|
|
31
|
+
'image/webp': 'webp',
|
|
32
|
+
'image/gif': 'gif',
|
|
33
|
+
};
|
|
34
|
+
function sleep(ms) {
|
|
35
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
36
|
+
}
|
|
37
|
+
async function parseResponse(response, label) {
|
|
38
|
+
const text = await response.text();
|
|
39
|
+
let body = null;
|
|
40
|
+
if (text) {
|
|
41
|
+
try {
|
|
42
|
+
body = JSON.parse(text);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
body = text;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
const message = (body && typeof body === 'object' && (body.error || body.detail)) ||
|
|
50
|
+
(typeof body === 'string' && body) ||
|
|
51
|
+
response.statusText;
|
|
52
|
+
throw new AiApiError(`${label} failed (${response.status} ${response.statusText}): ${message}`, response.status, body);
|
|
53
|
+
}
|
|
54
|
+
return body;
|
|
55
|
+
}
|
|
56
|
+
async function authedRequest(baseUrl, apiPath, token, init = { method: 'GET' }) {
|
|
57
|
+
let response;
|
|
58
|
+
try {
|
|
59
|
+
response = await fetch(apiUrl(baseUrl, apiPath), {
|
|
60
|
+
method: init.method,
|
|
61
|
+
headers: {
|
|
62
|
+
Authorization: `Bearer ${token}`,
|
|
63
|
+
...(init.body !== undefined
|
|
64
|
+
? { 'Content-Type': 'application/json' }
|
|
65
|
+
: {}),
|
|
66
|
+
},
|
|
67
|
+
...(init.body !== undefined
|
|
68
|
+
? { body: JSON.stringify(init.body) }
|
|
69
|
+
: {}),
|
|
70
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
throw new AiApiError(`Backend unreachable: ${err?.message || err}`);
|
|
75
|
+
}
|
|
76
|
+
return parseResponse(response, `${init.method} ${apiPath}`);
|
|
77
|
+
}
|
|
78
|
+
async function mintAccessToken(ctx, backendUrl) {
|
|
79
|
+
const material = createAuthMaterial(ctx.mnemonic, ctx.walletHash);
|
|
80
|
+
await registerOAuthUser(material, { backendUrl });
|
|
81
|
+
return createAccessToken(material, { backendUrl });
|
|
82
|
+
}
|
|
83
|
+
export async function listImageModels(opts = {}) {
|
|
84
|
+
const base = resolveBackendUrl(opts.backendUrl);
|
|
85
|
+
const url = new URL(apiUrl(base, '/v1/image-models'));
|
|
86
|
+
if (opts.pricingUnit)
|
|
87
|
+
url.searchParams.set('pricing_unit', opts.pricingUnit);
|
|
88
|
+
if (opts.search)
|
|
89
|
+
url.searchParams.set('search', opts.search);
|
|
90
|
+
if (opts.ordering)
|
|
91
|
+
url.searchParams.set('ordering', opts.ordering);
|
|
92
|
+
let response;
|
|
93
|
+
try {
|
|
94
|
+
response = await fetch(url.toString(), {
|
|
95
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
throw new AiApiError(`Backend unreachable: ${err?.message || err}`);
|
|
100
|
+
}
|
|
101
|
+
const body = await parseResponse(response, 'GET /v1/image-models');
|
|
102
|
+
return Array.isArray(body?.data) ? body.data : [];
|
|
103
|
+
}
|
|
104
|
+
export async function getImageHistory(opts = {}) {
|
|
105
|
+
const ctx = requireWallet();
|
|
106
|
+
const token = await mintAccessToken(ctx, opts.backendUrl);
|
|
107
|
+
const base = resolveBackendUrl(opts.backendUrl);
|
|
108
|
+
const url = new URL(apiUrl(base, '/v1/images/history'));
|
|
109
|
+
if (opts.page)
|
|
110
|
+
url.searchParams.set('page', String(opts.page));
|
|
111
|
+
if (opts.pageSize)
|
|
112
|
+
url.searchParams.set('page_size', String(opts.pageSize));
|
|
113
|
+
return authedRequest(base, url.pathname + url.search, token);
|
|
114
|
+
}
|
|
115
|
+
/** Create an image order (no funds move). Returns the quote to pay. */
|
|
116
|
+
export async function createImageOrder(opts) {
|
|
117
|
+
const prompt = String(opts.prompt || '').trim();
|
|
118
|
+
if (!prompt)
|
|
119
|
+
throw new Error('Missing prompt.');
|
|
120
|
+
const isChipnet = Boolean(opts.isChipnet);
|
|
121
|
+
const baseUrl = resolveBackendUrl(opts.backendUrl);
|
|
122
|
+
const ctx = requireWallet(isChipnet);
|
|
123
|
+
const token = await mintAccessToken(ctx, baseUrl);
|
|
124
|
+
const addresses = ctx.bch.getAddressSetAt(0);
|
|
125
|
+
const body = {
|
|
126
|
+
prompt,
|
|
127
|
+
refund_address: addresses.receiving,
|
|
128
|
+
};
|
|
129
|
+
if (opts.model)
|
|
130
|
+
body.model = opts.model;
|
|
131
|
+
if (opts.aspectRatio)
|
|
132
|
+
body.aspect_ratio = opts.aspectRatio;
|
|
133
|
+
if (opts.quality)
|
|
134
|
+
body.quality = opts.quality;
|
|
135
|
+
if (opts.resolution)
|
|
136
|
+
body.resolution = opts.resolution;
|
|
137
|
+
const order = await authedRequest(baseUrl, '/v1/images', token, {
|
|
138
|
+
method: 'POST',
|
|
139
|
+
body,
|
|
140
|
+
});
|
|
141
|
+
const amountSats = Number(order?.amount_sats) || 0;
|
|
142
|
+
if (!order?.id || !order?.contract_address || amountSats <= 0) {
|
|
143
|
+
throw new AiApiError('Malformed image order response.', 200, order);
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
orderId: String(order.id),
|
|
147
|
+
prompt,
|
|
148
|
+
model: order.model,
|
|
149
|
+
pricingUnit: order.pricing_unit,
|
|
150
|
+
contractAddress: String(order.contract_address),
|
|
151
|
+
amountSats,
|
|
152
|
+
amountUsd: order.amount_usd,
|
|
153
|
+
estimatedCostUsd: order.estimated_cost_usd,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
async function confirmPaymentWithRetry(baseUrl, token, orderId, txid, attempts, spacingMs) {
|
|
157
|
+
let lastError = null;
|
|
158
|
+
for (let i = 0; i < attempts; i++) {
|
|
159
|
+
try {
|
|
160
|
+
await authedRequest(baseUrl, `/v1/images/${encodeURIComponent(orderId)}/confirm-payment`, token, { method: 'POST', body: { txid } });
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
if (!(err instanceof AiApiError))
|
|
165
|
+
throw err;
|
|
166
|
+
if (err.status === 400 && /already/i.test(err.message))
|
|
167
|
+
return;
|
|
168
|
+
if (err.status && err.status >= 400 && err.status < 500)
|
|
169
|
+
throw err;
|
|
170
|
+
lastError = err;
|
|
171
|
+
if (i < attempts - 1)
|
|
172
|
+
await sleep(spacingMs);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
throw lastError ?? new Error('Payment confirmation failed.');
|
|
176
|
+
}
|
|
177
|
+
async function pollOrderStatus(baseUrl, token, orderId, intervalMs, timeoutMs) {
|
|
178
|
+
const deadline = Date.now() + timeoutMs;
|
|
179
|
+
for (;;) {
|
|
180
|
+
const status = (await authedRequest(baseUrl, `/v1/images/${encodeURIComponent(orderId)}/status`, token));
|
|
181
|
+
if (status.status === 'failed') {
|
|
182
|
+
throw new Error(`Image generation failed${status.error ? `: ${status.error}` : '.'}`);
|
|
183
|
+
}
|
|
184
|
+
if (status.status === 'refunded') {
|
|
185
|
+
throw new Error(`The order was refunded${status.settlement_txid
|
|
186
|
+
? ` (settlement txid ${status.settlement_txid})`
|
|
187
|
+
: ''}.`);
|
|
188
|
+
}
|
|
189
|
+
if ((status.status === 'generation_complete' ||
|
|
190
|
+
status.status === 'completed') &&
|
|
191
|
+
status.image) {
|
|
192
|
+
return status;
|
|
193
|
+
}
|
|
194
|
+
if (Date.now() >= deadline) {
|
|
195
|
+
throw new Error(`Timed out waiting for image generation (order ${orderId} is "${status.status ?? 'unknown'}").`);
|
|
196
|
+
}
|
|
197
|
+
await sleep(intervalMs);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function saveImage(orderId, mediaType, base64) {
|
|
201
|
+
if (!ALLOWED_MEDIA_TYPES.has(mediaType)) {
|
|
202
|
+
throw new Error(`Backend returned an unsupported media type: ${mediaType}`);
|
|
203
|
+
}
|
|
204
|
+
if (typeof base64 !== 'string' || base64.length === 0) {
|
|
205
|
+
throw new Error('Backend returned an empty image payload.');
|
|
206
|
+
}
|
|
207
|
+
if (!/^[A-Za-z0-9+/=\r\n]+$/.test(base64)) {
|
|
208
|
+
throw new Error('Backend returned an image payload that is not valid base64.');
|
|
209
|
+
}
|
|
210
|
+
mkdirSync(IMAGE_DIR, { recursive: true });
|
|
211
|
+
const ext = MEDIA_TYPE_EXTENSIONS[mediaType];
|
|
212
|
+
const safeId = orderId.replace(/[^a-zA-Z0-9_-]/g, '');
|
|
213
|
+
const filePath = path.join(IMAGE_DIR, `${safeId}.${ext}`);
|
|
214
|
+
writeFileSync(filePath, Buffer.from(base64, 'base64'));
|
|
215
|
+
chmodSync(filePath, 0o600);
|
|
216
|
+
return filePath;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Pay an existing image order, wait for the image, and save it.
|
|
220
|
+
* Returns a buy_plan-style result: `paid` indicates funds moved.
|
|
221
|
+
*/
|
|
222
|
+
export async function fulfillImageOrder(quote, opts = {}) {
|
|
223
|
+
const isChipnet = Boolean(opts.isChipnet);
|
|
224
|
+
const baseUrl = resolveBackendUrl(opts.backendUrl);
|
|
225
|
+
const base = {
|
|
226
|
+
success: false,
|
|
227
|
+
paid: false,
|
|
228
|
+
orderId: quote.orderId,
|
|
229
|
+
model: quote.model,
|
|
230
|
+
amountSats: quote.amountSats,
|
|
231
|
+
amountUsd: quote.amountUsd,
|
|
232
|
+
estimatedCostUsd: quote.estimatedCostUsd,
|
|
233
|
+
};
|
|
234
|
+
let ctx;
|
|
235
|
+
let token;
|
|
236
|
+
try {
|
|
237
|
+
ctx = requireWallet(isChipnet);
|
|
238
|
+
token = await mintAccessToken(ctx, baseUrl);
|
|
239
|
+
}
|
|
240
|
+
catch (err) {
|
|
241
|
+
return { ...base, error: err?.message || String(err) };
|
|
242
|
+
}
|
|
243
|
+
if (!isValidBchAddress(quote.contractAddress, isChipnet)) {
|
|
244
|
+
return { ...base, error: 'Backend returned an invalid payment address.' };
|
|
245
|
+
}
|
|
246
|
+
try {
|
|
247
|
+
const balance = await ctx.bch.getBalance();
|
|
248
|
+
const availableSats = Math.round(balance.spendable * 1e8);
|
|
249
|
+
if (availableSats < quote.amountSats) {
|
|
250
|
+
return {
|
|
251
|
+
...base,
|
|
252
|
+
error: `Insufficient balance: ${(availableSats / 1e8).toFixed(8)} BCH available but the image order costs ${(quote.amountSats / 1e8).toFixed(8)} BCH.`,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
// Balance check is best-effort; the payment flow will surface real errors.
|
|
258
|
+
}
|
|
259
|
+
let txid;
|
|
260
|
+
try {
|
|
261
|
+
const changeAddress = ctx.bch.getAddressSetAt(0).change;
|
|
262
|
+
const sendResult = await ctx.bch.sendBch(quote.amountSats / 1e8, quote.contractAddress, changeAddress);
|
|
263
|
+
if (!sendResult.success || !sendResult.txid) {
|
|
264
|
+
return {
|
|
265
|
+
...base,
|
|
266
|
+
error: sendResult.error || 'Transaction broadcast failed.',
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
txid = sendResult.txid;
|
|
270
|
+
}
|
|
271
|
+
catch (err) {
|
|
272
|
+
return { ...base, error: err?.message || String(err) };
|
|
273
|
+
}
|
|
274
|
+
const paid = { ...base, paid: true, txid };
|
|
275
|
+
try {
|
|
276
|
+
await confirmPaymentWithRetry(baseUrl, token, quote.orderId, txid, opts.confirmAttempts ?? DEFAULT_CONFIRM_ATTEMPTS, opts.confirmSpacingMs ?? DEFAULT_CONFIRM_SPACING_MS);
|
|
277
|
+
}
|
|
278
|
+
catch (err) {
|
|
279
|
+
return {
|
|
280
|
+
...paid,
|
|
281
|
+
error: `Payment was broadcast (txid ${txid}) but the backend could not confirm it yet: ${err?.message || err}. The order remains pending — retry in a moment or check the order history.`,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
let status;
|
|
285
|
+
try {
|
|
286
|
+
status = await pollOrderStatus(baseUrl, token, quote.orderId, opts.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS, opts.pollTimeoutMs ?? DEFAULT_POLL_TIMEOUT_MS);
|
|
287
|
+
}
|
|
288
|
+
catch (err) {
|
|
289
|
+
return {
|
|
290
|
+
...paid,
|
|
291
|
+
error: `${err?.message || err} Payment already made (txid ${txid}); order ${quote.orderId}.`,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
let filePath;
|
|
295
|
+
try {
|
|
296
|
+
filePath = saveImage(quote.orderId, status.media_type ?? '', status.image ?? '');
|
|
297
|
+
}
|
|
298
|
+
catch (err) {
|
|
299
|
+
return {
|
|
300
|
+
...paid,
|
|
301
|
+
status: status.status,
|
|
302
|
+
mediaType: status.media_type,
|
|
303
|
+
base64: status.image ?? undefined,
|
|
304
|
+
error: `${err?.message || err} The image was generated but could not be saved.`,
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
// Release the backend's one-shot cache; best-effort.
|
|
308
|
+
try {
|
|
309
|
+
await authedRequest(baseUrl, `/v1/images/${encodeURIComponent(quote.orderId)}/confirm`, token, { method: 'POST' });
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
// Non-critical — the image is already delivered and saved.
|
|
313
|
+
}
|
|
314
|
+
return {
|
|
315
|
+
...paid,
|
|
316
|
+
success: true,
|
|
317
|
+
status: status.status,
|
|
318
|
+
path: filePath,
|
|
319
|
+
mediaType: status.media_type,
|
|
320
|
+
base64: status.image ?? undefined,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
/** End-to-end: create the order, then pay and deliver it. */
|
|
324
|
+
export async function generateImage(opts) {
|
|
325
|
+
let quote;
|
|
326
|
+
try {
|
|
327
|
+
quote = await createImageOrder(opts);
|
|
328
|
+
}
|
|
329
|
+
catch (err) {
|
|
330
|
+
return { success: false, paid: false, error: err?.message || String(err) };
|
|
331
|
+
}
|
|
332
|
+
return fulfillImageOrder(quote, opts);
|
|
333
|
+
}
|
|
334
|
+
/** True when the tool should return a "processing" status instead of an error. */
|
|
335
|
+
export function isStillProcessing(result) {
|
|
336
|
+
return (!result.success &&
|
|
337
|
+
result.paid &&
|
|
338
|
+
!!result.orderId &&
|
|
339
|
+
!!result.error &&
|
|
340
|
+
/timed out/i.test(result.error));
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Poll an existing image order by ID until the image is ready or the
|
|
344
|
+
* deadline is reached. Mints a fresh OAuth token and saves the image
|
|
345
|
+
* to ~/.paytaca/images when generation is complete.
|
|
346
|
+
*/
|
|
347
|
+
export async function getImageOrderStatus(orderId, opts = {}) {
|
|
348
|
+
const isChipnet = Boolean(opts.isChipnet);
|
|
349
|
+
const baseUrl = resolveBackendUrl(opts.backendUrl);
|
|
350
|
+
const base = {
|
|
351
|
+
success: false,
|
|
352
|
+
paid: true,
|
|
353
|
+
orderId,
|
|
354
|
+
};
|
|
355
|
+
let ctx;
|
|
356
|
+
let token;
|
|
357
|
+
try {
|
|
358
|
+
ctx = requireWallet(isChipnet);
|
|
359
|
+
token = await mintAccessToken(ctx, baseUrl);
|
|
360
|
+
}
|
|
361
|
+
catch (err) {
|
|
362
|
+
return { ...base, error: err?.message || String(err) };
|
|
363
|
+
}
|
|
364
|
+
let status;
|
|
365
|
+
try {
|
|
366
|
+
status = await pollOrderStatus(baseUrl, token, orderId, opts.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS, opts.pollTimeoutMs ?? DEFAULT_POLL_TIMEOUT_MS);
|
|
367
|
+
}
|
|
368
|
+
catch (err) {
|
|
369
|
+
return { ...base, error: err?.message || String(err) };
|
|
370
|
+
}
|
|
371
|
+
let filePath;
|
|
372
|
+
try {
|
|
373
|
+
filePath = saveImage(orderId, status.media_type ?? '', status.image ?? '');
|
|
374
|
+
}
|
|
375
|
+
catch (err) {
|
|
376
|
+
return {
|
|
377
|
+
...base,
|
|
378
|
+
status: status.status,
|
|
379
|
+
mediaType: status.media_type,
|
|
380
|
+
base64: status.image ?? undefined,
|
|
381
|
+
error: `${err?.message || err} The image was generated but could not be saved.`,
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
try {
|
|
385
|
+
await authedRequest(baseUrl, `/v1/images/${encodeURIComponent(orderId)}/confirm`, token, { method: 'POST' });
|
|
386
|
+
}
|
|
387
|
+
catch {
|
|
388
|
+
// Non-critical.
|
|
389
|
+
}
|
|
390
|
+
return {
|
|
391
|
+
...base,
|
|
392
|
+
success: true,
|
|
393
|
+
status: status.status,
|
|
394
|
+
path: filePath,
|
|
395
|
+
mediaType: status.media_type,
|
|
396
|
+
base64: status.image ?? undefined,
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
//# sourceMappingURL=images.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/ai/images.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/commands/ai.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/commands/ai.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA8JnC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAk1BzD"}
|