paytaca-cli 0.6.1 → 0.7.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 +153 -37
- package/dist/ai/autoRefill.d.ts +27 -0
- package/dist/ai/autoRefill.d.ts.map +1 -0
- package/dist/ai/autoRefill.js +75 -0
- package/dist/ai/autoRefill.js.map +1 -0
- package/dist/ai/client.d.ts +73 -0
- package/dist/ai/client.d.ts.map +1 -0
- package/dist/ai/client.js +90 -0
- package/dist/ai/client.js.map +1 -0
- package/dist/ai/config.d.ts +7 -0
- package/dist/ai/config.d.ts.map +1 -0
- package/dist/ai/config.js +16 -0
- package/dist/ai/config.js.map +1 -0
- package/dist/ai/configure.d.ts +61 -0
- package/dist/ai/configure.d.ts.map +1 -0
- package/dist/ai/configure.js +452 -0
- package/dist/ai/configure.js.map +1 -0
- package/dist/ai/credits.d.ts +27 -0
- package/dist/ai/credits.d.ts.map +1 -0
- package/dist/ai/credits.js +99 -0
- package/dist/ai/credits.js.map +1 -0
- package/dist/ai/models.d.ts +13 -0
- package/dist/ai/models.d.ts.map +1 -0
- package/dist/ai/models.js +49 -0
- package/dist/ai/models.js.map +1 -0
- package/dist/ai/oauth.d.ts +45 -0
- package/dist/ai/oauth.d.ts.map +1 -0
- package/dist/ai/oauth.js +137 -0
- package/dist/ai/oauth.js.map +1 -0
- package/dist/ai/purchase.d.ts +30 -0
- package/dist/ai/purchase.d.ts.map +1 -0
- package/dist/ai/purchase.js +456 -0
- package/dist/ai/purchase.js.map +1 -0
- package/dist/commands/address.d.ts.map +1 -1
- package/dist/commands/address.js +88 -36
- package/dist/commands/address.js.map +1 -1
- package/dist/commands/ai.d.ts +9 -0
- package/dist/commands/ai.d.ts.map +1 -0
- package/dist/commands/ai.js +675 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/balance.d.ts.map +1 -1
- package/dist/commands/balance.js +68 -129
- package/dist/commands/balance.js.map +1 -1
- package/dist/commands/history.d.ts.map +1 -1
- package/dist/commands/history.js +38 -78
- package/dist/commands/history.js.map +1 -1
- package/dist/commands/mcp.d.ts +14 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +68 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/pay.js +1 -1
- package/dist/commands/pay.js.map +1 -1
- package/dist/commands/receive.d.ts +1 -8
- package/dist/commands/receive.d.ts.map +1 -1
- package/dist/commands/receive.js +51 -124
- package/dist/commands/receive.js.map +1 -1
- package/dist/commands/send.d.ts +0 -10
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +40 -50
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/swap.js +1 -1
- package/dist/commands/swap.js.map +1 -1
- package/dist/commands/token.d.ts +1 -9
- package/dist/commands/token.d.ts.map +1 -1
- package/dist/commands/token.js +192 -289
- package/dist/commands/token.js.map +1 -1
- package/dist/core/context.d.ts +30 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +45 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/wallet.d.ts +130 -0
- package/dist/core/wallet.d.ts.map +1 -0
- package/dist/core/wallet.js +276 -0
- package/dist/core/wallet.js.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +8 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +24 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +5 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +473 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/utils/format.d.ts +23 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +62 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/x402.js +1 -1
- package/dist/utils/x402.js.map +1 -1
- package/dist/wallet/index.d.ts +13 -0
- package/dist/wallet/index.d.ts.map +1 -1
- package/dist/wallet/index.js +18 -0
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/keys.d.ts.map +1 -1
- package/dist/wallet/keys.js +2 -0
- package/dist/wallet/keys.js.map +1 -1
- package/package.json +7 -3
- package/dist/commands/wallet.test.d.ts +0 -2
- package/dist/commands/wallet.test.d.ts.map +0 -1
- package/dist/commands/wallet.test.js +0 -68
- package/dist/commands/wallet.test.js.map +0 -1
- package/dist/nostr/chat.test.d.ts +0 -2
- package/dist/nostr/chat.test.d.ts.map +0 -1
- package/dist/nostr/chat.test.js +0 -121
- package/dist/nostr/chat.test.js.map +0 -1
- package/dist/nostr/store.test.d.ts +0 -2
- package/dist/nostr/store.test.d.ts.map +0 -1
- package/dist/nostr/store.test.js +0 -456
- package/dist/nostr/store.test.js.map +0 -1
- package/dist/utils/prices.test.d.ts +0 -5
- package/dist/utils/prices.test.d.ts.map +0 -1
- package/dist/utils/prices.test.js +0 -62
- package/dist/utils/prices.test.js.map +0 -1
- package/dist/utils/x402.test.d.ts +0 -2
- package/dist/utils/x402.test.d.ts.map +0 -1
- package/dist/utils/x402.test.js +0 -216
- package/dist/utils/x402.test.js.map +0 -1
- package/dist/wallet/cauldron/pools.test.d.ts +0 -3
- package/dist/wallet/cauldron/pools.test.d.ts.map +0 -1
- package/dist/wallet/cauldron/pools.test.js +0 -149
- package/dist/wallet/cauldron/pools.test.js.map +0 -1
- package/dist/wallet/cauldron/swap.test.d.ts +0 -2
- package/dist/wallet/cauldron/swap.test.d.ts.map +0 -1
- package/dist/wallet/cauldron/swap.test.js +0 -179
- package/dist/wallet/cauldron/swap.test.js.map +0 -1
- package/skills/README.md +0 -68
- package/skills/paytaca-send/SKILL.md +0 -159
- package/skills/paytaca-wallet/SKILL.md +0 -164
- package/skills/paytaca-x402/SKILL.md +0 -130
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { getWalletStatus, } from './client.js';
|
|
2
|
+
export function buildPurchaseHint(model) {
|
|
3
|
+
if (!model || !model.id)
|
|
4
|
+
return null;
|
|
5
|
+
const tiers = Array.isArray(model.price_tiers) ? model.price_tiers : [];
|
|
6
|
+
const sorted = tiers
|
|
7
|
+
.filter((t) => Number(t.minutes) > 0)
|
|
8
|
+
.sort((a, b) => Number(a.minutes) - Number(b.minutes));
|
|
9
|
+
if (sorted.length === 0)
|
|
10
|
+
return null;
|
|
11
|
+
const minutes = Number(sorted[0].minutes);
|
|
12
|
+
const name = model.display_name || model.id;
|
|
13
|
+
const command = `paytaca ai purchase --model ${model.id} --minutes ${minutes}`;
|
|
14
|
+
return {
|
|
15
|
+
model: model.id,
|
|
16
|
+
minutes,
|
|
17
|
+
command,
|
|
18
|
+
message: `To keep using ${name}, top up by running this in a terminal:\n\n ${command}\n\n(Switch models with \`paytaca ai plans\`.)`,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export function getSessions(status) {
|
|
22
|
+
if (Array.isArray(status.sessions))
|
|
23
|
+
return status.sessions;
|
|
24
|
+
return [status];
|
|
25
|
+
}
|
|
26
|
+
function sessionMatches(session, modelId) {
|
|
27
|
+
const q = modelId.toLowerCase();
|
|
28
|
+
const id = String(session.model_id || session.ai_model || '').toLowerCase();
|
|
29
|
+
const name = String(session.display_name || '').toLowerCase();
|
|
30
|
+
return id === q || id.includes(q) || name.includes(q);
|
|
31
|
+
}
|
|
32
|
+
export function findSession(status, modelId) {
|
|
33
|
+
const sessions = getSessions(status).filter(Boolean);
|
|
34
|
+
if (sessions.length === 0)
|
|
35
|
+
return null;
|
|
36
|
+
if (modelId) {
|
|
37
|
+
const match = sessions.find((s) => sessionMatches(s, modelId));
|
|
38
|
+
if (match)
|
|
39
|
+
return match;
|
|
40
|
+
}
|
|
41
|
+
return (sessions.find((s) => s.model_active === true ||
|
|
42
|
+
s.session_active === true ||
|
|
43
|
+
(s.time_remaining_seconds ?? 0) > 0) ||
|
|
44
|
+
sessions[0] ||
|
|
45
|
+
null);
|
|
46
|
+
}
|
|
47
|
+
function sessionActive(session) {
|
|
48
|
+
return (session.model_active === true ||
|
|
49
|
+
session.session_active === true ||
|
|
50
|
+
(session.time_remaining_seconds ?? 0) > 0);
|
|
51
|
+
}
|
|
52
|
+
export function hasActiveCredits(status, modelId) {
|
|
53
|
+
if (!status)
|
|
54
|
+
return false;
|
|
55
|
+
const sessions = getSessions(status).filter(Boolean);
|
|
56
|
+
const candidates = modelId
|
|
57
|
+
? sessions.filter((s) => sessionMatches(s, modelId))
|
|
58
|
+
: sessions;
|
|
59
|
+
return candidates.some(sessionActive);
|
|
60
|
+
}
|
|
61
|
+
export function formatRemaining(seconds) {
|
|
62
|
+
if (!isFinite(seconds) || seconds <= 0)
|
|
63
|
+
return '0s';
|
|
64
|
+
const total = Math.floor(seconds);
|
|
65
|
+
const h = Math.floor(total / 3600);
|
|
66
|
+
const m = Math.floor((total % 3600) / 60);
|
|
67
|
+
const s = total % 60;
|
|
68
|
+
const parts = [];
|
|
69
|
+
if (h > 0)
|
|
70
|
+
parts.push(`${h}h`);
|
|
71
|
+
if (m > 0)
|
|
72
|
+
parts.push(`${m}m`);
|
|
73
|
+
if (s > 0 && h === 0)
|
|
74
|
+
parts.push(`${s}s`);
|
|
75
|
+
return parts.join(' ') || '0s';
|
|
76
|
+
}
|
|
77
|
+
function summarizeSession(session) {
|
|
78
|
+
return {
|
|
79
|
+
modelId: session.model_id || session.ai_model || null,
|
|
80
|
+
displayName: session.display_name || null,
|
|
81
|
+
active: sessionActive(session),
|
|
82
|
+
timeRemainingSeconds: session.time_remaining_seconds ?? 0,
|
|
83
|
+
timeCreditsSeconds: session.time_credits_seconds ?? 0,
|
|
84
|
+
timeUsedSeconds: session.time_used_seconds ?? 0,
|
|
85
|
+
tokenLimit: session.token_limit ?? null,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
export function summarizeCredits(status, modelId) {
|
|
89
|
+
const session = findSession(status, modelId);
|
|
90
|
+
return {
|
|
91
|
+
...summarizeSession(session ?? {}),
|
|
92
|
+
active: hasActiveCredits(status, modelId),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
export function summarizeAllCredits(status) {
|
|
96
|
+
return getSessions(status).filter(Boolean).map(summarizeSession);
|
|
97
|
+
}
|
|
98
|
+
export { getWalletStatus };
|
|
99
|
+
//# sourceMappingURL=credits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credits.js","sourceRoot":"","sources":["../../src/ai/credits.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AiConfig, AiModelConfig, PriceTier } from './client.js';
|
|
2
|
+
export interface PlanView {
|
|
3
|
+
id: string;
|
|
4
|
+
displayName: string;
|
|
5
|
+
plans: PriceTier[];
|
|
6
|
+
}
|
|
7
|
+
export declare function formatDuration(minutes: number): string;
|
|
8
|
+
export declare function formatPriceUsd(usd: number | undefined): string;
|
|
9
|
+
export declare function selectModel(models: AiModelConfig[], query: string): AiModelConfig | null;
|
|
10
|
+
export declare function selectTier(model: AiModelConfig, minutes: number): PriceTier | null;
|
|
11
|
+
export declare function listModels(config: AiConfig): AiModelConfig[];
|
|
12
|
+
export declare function listPlans(config: AiConfig, modelQuery?: string): PlanView[];
|
|
13
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/ai/models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAErE,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,SAAS,EAAE,CAAA;CACnB;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAItD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAG9D;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,aAAa,EAAE,EACvB,KAAK,EAAE,MAAM,GACZ,aAAa,GAAG,IAAI,CAgBtB;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,MAAM,GACd,SAAS,GAAG,IAAI,CAMlB;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,QAAQ,GAAG,aAAa,EAAE,CAE5D;AAED,wBAAgB,SAAS,CACvB,MAAM,EAAE,QAAQ,EAChB,UAAU,CAAC,EAAE,MAAM,GAClB,QAAQ,EAAE,CAYZ"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export function formatDuration(minutes) {
|
|
2
|
+
if (minutes < 60)
|
|
3
|
+
return `${minutes} min`;
|
|
4
|
+
const hours = minutes / 60;
|
|
5
|
+
return Number.isInteger(hours) ? `${hours} hr` : `${minutes} min`;
|
|
6
|
+
}
|
|
7
|
+
export function formatPriceUsd(usd) {
|
|
8
|
+
if (usd === undefined || usd === null || !isFinite(usd))
|
|
9
|
+
return 'n/a';
|
|
10
|
+
return `$${usd.toFixed(2)}`;
|
|
11
|
+
}
|
|
12
|
+
export function selectModel(models, query) {
|
|
13
|
+
if (!query)
|
|
14
|
+
return null;
|
|
15
|
+
const q = query.toLowerCase();
|
|
16
|
+
const exact = models.find((m) => String(m.id).toLowerCase() === q ||
|
|
17
|
+
String(m.display_name).toLowerCase() === q);
|
|
18
|
+
if (exact)
|
|
19
|
+
return exact;
|
|
20
|
+
return (models.find((m) => {
|
|
21
|
+
const id = String(m.id).toLowerCase();
|
|
22
|
+
const name = String(m.display_name).toLowerCase();
|
|
23
|
+
return id.includes(q) || name.includes(q);
|
|
24
|
+
}) || null);
|
|
25
|
+
}
|
|
26
|
+
export function selectTier(model, minutes) {
|
|
27
|
+
const tiers = Array.isArray(model.price_tiers) ? model.price_tiers : [];
|
|
28
|
+
const exact = tiers.find((t) => Number(t.minutes) === Number(minutes));
|
|
29
|
+
if (exact)
|
|
30
|
+
return exact;
|
|
31
|
+
const sorted = [...tiers].sort((a, b) => a.minutes - b.minutes);
|
|
32
|
+
return sorted.find((t) => t.minutes >= minutes) || sorted[sorted.length - 1] || null;
|
|
33
|
+
}
|
|
34
|
+
export function listModels(config) {
|
|
35
|
+
return Array.isArray(config.models) ? config.models : [];
|
|
36
|
+
}
|
|
37
|
+
export function listPlans(config, modelQuery) {
|
|
38
|
+
let models = listModels(config);
|
|
39
|
+
if (modelQuery) {
|
|
40
|
+
const model = selectModel(models, modelQuery);
|
|
41
|
+
models = model ? [model] : [];
|
|
42
|
+
}
|
|
43
|
+
return models.map((model) => ({
|
|
44
|
+
id: model.id,
|
|
45
|
+
displayName: model.display_name,
|
|
46
|
+
plans: Array.isArray(model.price_tiers) ? model.price_tiers : [],
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/ai/models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bitcoin Cash OAuth (bitcoincash-oauth) client for the Paytaca AI backend.
|
|
3
|
+
*
|
|
4
|
+
* Flow: sign a challenge with a wallet-derived key, register the key's
|
|
5
|
+
* address, exchange the signature for an access token, then mint an API key
|
|
6
|
+
* bound to the wallet hash. The API key is an identity only — AI usage is
|
|
7
|
+
* still metered against the wallet's credits.
|
|
8
|
+
*/
|
|
9
|
+
export declare const OAUTH_DOMAIN = "oauth";
|
|
10
|
+
export declare const OAUTH_AUTH_PATH = "2/0";
|
|
11
|
+
export interface WalletAuthMaterial {
|
|
12
|
+
userId: string;
|
|
13
|
+
publicKey: string;
|
|
14
|
+
address: string;
|
|
15
|
+
timestamp: number;
|
|
16
|
+
domain: string;
|
|
17
|
+
signature: string;
|
|
18
|
+
}
|
|
19
|
+
export interface CreatedApiKey {
|
|
20
|
+
id: string;
|
|
21
|
+
key: string;
|
|
22
|
+
keyPrefix: string;
|
|
23
|
+
name: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function buildAuthMessage(userId: string, timestamp: number, domain?: string): string;
|
|
26
|
+
/** Raw DER ECDSA over sha256(message) — no Bitcoin Signed Message prefix. */
|
|
27
|
+
export declare function signAuthMessage(message: string, privateKey: Uint8Array): string;
|
|
28
|
+
export declare function createAuthMaterial(mnemonic: string, walletHash: string, timestamp?: number): WalletAuthMaterial;
|
|
29
|
+
export declare function registerOAuthUser(material: WalletAuthMaterial, opts?: {
|
|
30
|
+
backendUrl?: string;
|
|
31
|
+
}): Promise<void>;
|
|
32
|
+
export declare function createAccessToken(material: WalletAuthMaterial, opts?: {
|
|
33
|
+
backendUrl?: string;
|
|
34
|
+
}): Promise<string>;
|
|
35
|
+
export declare function createApiKey(accessToken: string, name: string, opts?: {
|
|
36
|
+
backendUrl?: string;
|
|
37
|
+
}): Promise<CreatedApiKey>;
|
|
38
|
+
export declare function provisionApiKey(options: {
|
|
39
|
+
mnemonic: string;
|
|
40
|
+
walletHash: string;
|
|
41
|
+
backendUrl?: string;
|
|
42
|
+
name?: string;
|
|
43
|
+
timestamp?: number;
|
|
44
|
+
}): Promise<CreatedApiKey>;
|
|
45
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/ai/oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,eAAO,MAAM,YAAY,UAAU,CAAA;AACnC,eAAO,MAAM,eAAe,QAAQ,CAAA;AAEpC,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;CACb;AASD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,MAAqB,GAC5B,MAAM,CAER;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM,CAI/E;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,kBAAkB,CAcpB;AAkDD,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,kBAAkB,EAC5B,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACjC,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,kBAAkB,EAC5B,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACjC,OAAO,CAAC,MAAM,CAAC,CAoBjB;AAED,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACjC,OAAO,CAAC,aAAa,CAAC,CAmBxB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,GAAG,OAAO,CAAC,aAAa,CAAC,CAMzB"}
|
package/dist/ai/oauth.js
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bitcoin Cash OAuth (bitcoincash-oauth) client for the Paytaca AI backend.
|
|
3
|
+
*
|
|
4
|
+
* Flow: sign a challenge with a wallet-derived key, register the key's
|
|
5
|
+
* address, exchange the signature for an access token, then mint an API key
|
|
6
|
+
* bound to the wallet hash. The API key is an identity only — AI usage is
|
|
7
|
+
* still metered against the wallet's credits.
|
|
8
|
+
*/
|
|
9
|
+
import { binToHex, secp256k1, sha256 } from '@bitauth/libauth';
|
|
10
|
+
import { LibauthHDWallet } from '../wallet/keys.js';
|
|
11
|
+
import { BCH_DERIVATION_PATH } from '../utils/network.js';
|
|
12
|
+
import { pubkeyToAddress } from '../utils/crypto.js';
|
|
13
|
+
import { resolveBackendUrl, apiUrl } from './config.js';
|
|
14
|
+
import { AiApiError } from './client.js';
|
|
15
|
+
export const OAUTH_DOMAIN = 'oauth';
|
|
16
|
+
export const OAUTH_AUTH_PATH = '2/0';
|
|
17
|
+
export function buildAuthMessage(userId, timestamp, domain = OAUTH_DOMAIN) {
|
|
18
|
+
return `bitcoincash-oauth|${domain}|${userId}|${timestamp}`;
|
|
19
|
+
}
|
|
20
|
+
/** Raw DER ECDSA over sha256(message) — no Bitcoin Signed Message prefix. */
|
|
21
|
+
export function signAuthMessage(message, privateKey) {
|
|
22
|
+
const digest = sha256.hash(new TextEncoder().encode(message));
|
|
23
|
+
const signature = secp256k1.signMessageHashDER(privateKey, digest);
|
|
24
|
+
return typeof signature === 'string' ? signature : binToHex(signature);
|
|
25
|
+
}
|
|
26
|
+
export function createAuthMaterial(mnemonic, walletHash, timestamp) {
|
|
27
|
+
const hdWallet = new LibauthHDWallet(mnemonic, BCH_DERIVATION_PATH, 'mainnet');
|
|
28
|
+
const node = hdWallet.getNodeAt(OAUTH_AUTH_PATH);
|
|
29
|
+
const publicKey = hdWallet.getPubkeyAt(OAUTH_AUTH_PATH);
|
|
30
|
+
const ts = timestamp ?? Math.floor(Date.now() / 1000);
|
|
31
|
+
const signature = signAuthMessage(buildAuthMessage(walletHash, ts), node.privateKey);
|
|
32
|
+
return {
|
|
33
|
+
userId: walletHash,
|
|
34
|
+
publicKey,
|
|
35
|
+
address: pubkeyToAddress(publicKey, false),
|
|
36
|
+
timestamp: ts,
|
|
37
|
+
domain: OAUTH_DOMAIN,
|
|
38
|
+
signature,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
async function postJson(url, body, token, timeoutMs = 15000) {
|
|
42
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
43
|
+
if (token)
|
|
44
|
+
headers.Authorization = `Bearer ${token}`;
|
|
45
|
+
let response;
|
|
46
|
+
try {
|
|
47
|
+
response = await fetch(url, {
|
|
48
|
+
method: 'POST',
|
|
49
|
+
headers,
|
|
50
|
+
body: JSON.stringify(body),
|
|
51
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
throw new AiApiError(`Backend unreachable: ${err?.message || err}`);
|
|
56
|
+
}
|
|
57
|
+
const text = await response.text();
|
|
58
|
+
let parsed = null;
|
|
59
|
+
if (text) {
|
|
60
|
+
try {
|
|
61
|
+
parsed = JSON.parse(text);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
parsed = text;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
ok: response.ok,
|
|
69
|
+
status: response.status,
|
|
70
|
+
statusText: response.statusText,
|
|
71
|
+
body: parsed,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function errorMessage(response) {
|
|
75
|
+
const body = response.body;
|
|
76
|
+
if (body && typeof body === 'object') {
|
|
77
|
+
return body.error || body.detail || body.message || JSON.stringify(body);
|
|
78
|
+
}
|
|
79
|
+
if (typeof body === 'string' && body)
|
|
80
|
+
return body;
|
|
81
|
+
return response.statusText;
|
|
82
|
+
}
|
|
83
|
+
export async function registerOAuthUser(material, opts = {}) {
|
|
84
|
+
const url = apiUrl(resolveBackendUrl(opts.backendUrl), '/v1/auth/register');
|
|
85
|
+
const response = await postJson(url, {
|
|
86
|
+
bitcoincash_address: material.address,
|
|
87
|
+
user_id: material.userId,
|
|
88
|
+
timestamp: material.timestamp,
|
|
89
|
+
domain: material.domain,
|
|
90
|
+
public_key: material.publicKey,
|
|
91
|
+
signature: material.signature,
|
|
92
|
+
});
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
const message = errorMessage(response);
|
|
95
|
+
if (response.status === 409 || /already|exists/i.test(message))
|
|
96
|
+
return;
|
|
97
|
+
throw new AiApiError(`OAuth register failed (${response.status} ${response.statusText}): ${message}`, response.status, response.body);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export async function createAccessToken(material, opts = {}) {
|
|
101
|
+
const url = apiUrl(resolveBackendUrl(opts.backendUrl), '/v1/auth/token');
|
|
102
|
+
const response = await postJson(url, {
|
|
103
|
+
user_id: material.userId,
|
|
104
|
+
timestamp: material.timestamp,
|
|
105
|
+
domain: material.domain,
|
|
106
|
+
public_key: material.publicKey,
|
|
107
|
+
signature: material.signature,
|
|
108
|
+
scopes: ['read'],
|
|
109
|
+
});
|
|
110
|
+
const token = response.body?.access_token;
|
|
111
|
+
if (!response.ok || typeof token !== 'string' || !token) {
|
|
112
|
+
throw new AiApiError(`OAuth token request failed (${response.status} ${response.statusText}): ${errorMessage(response)}`, response.status, response.body);
|
|
113
|
+
}
|
|
114
|
+
return token;
|
|
115
|
+
}
|
|
116
|
+
export async function createApiKey(accessToken, name, opts = {}) {
|
|
117
|
+
const url = apiUrl(resolveBackendUrl(opts.backendUrl), '/v1/api-keys');
|
|
118
|
+
const response = await postJson(url, { name }, accessToken);
|
|
119
|
+
const rawKey = response.body?.key;
|
|
120
|
+
if (!response.ok || typeof rawKey !== 'string' || !rawKey) {
|
|
121
|
+
throw new AiApiError(`API key creation failed (${response.status} ${response.statusText}): ${errorMessage(response)}`, response.status, response.body);
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
id: String(response.body?.id ?? ''),
|
|
125
|
+
key: rawKey,
|
|
126
|
+
keyPrefix: String(response.body?.key_prefix ?? rawKey.slice(0, 12)),
|
|
127
|
+
name,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
export async function provisionApiKey(options) {
|
|
131
|
+
const { mnemonic, walletHash, backendUrl, name = 'paytaca-cli', timestamp } = options;
|
|
132
|
+
const material = createAuthMaterial(mnemonic, walletHash, timestamp);
|
|
133
|
+
await registerOAuthUser(material, { backendUrl });
|
|
134
|
+
const accessToken = await createAccessToken(material, { backendUrl });
|
|
135
|
+
return createApiKey(accessToken, name, { backendUrl });
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/ai/oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export type PaymentMethod = 'bch' | 'lift';
|
|
2
|
+
export interface BuyPlanOptions {
|
|
3
|
+
model: string;
|
|
4
|
+
minutes: number;
|
|
5
|
+
paymentMethod?: PaymentMethod;
|
|
6
|
+
isChipnet?: boolean;
|
|
7
|
+
confirmed?: boolean;
|
|
8
|
+
backendUrl?: string;
|
|
9
|
+
skipProbe?: boolean;
|
|
10
|
+
skipActiveCreditGuard?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface BuyPlanResult {
|
|
13
|
+
success: boolean;
|
|
14
|
+
paid: boolean;
|
|
15
|
+
model?: string;
|
|
16
|
+
displayName?: string;
|
|
17
|
+
minutes?: number;
|
|
18
|
+
priceSats?: number;
|
|
19
|
+
paymentMethod?: PaymentMethod;
|
|
20
|
+
txid?: string;
|
|
21
|
+
recipientAddress?: string;
|
|
22
|
+
status?: number;
|
|
23
|
+
sessionActivated?: boolean;
|
|
24
|
+
timeRemainingSeconds?: number;
|
|
25
|
+
data?: unknown;
|
|
26
|
+
error?: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function probePlanStability(baseUrl: string, modelId: string, minutes: number): Promise<void>;
|
|
29
|
+
export declare function buyPlan(opts: BuyPlanOptions): Promise<BuyPlanResult>;
|
|
30
|
+
//# sourceMappingURL=purchase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"purchase.d.ts","sourceRoot":"","sources":["../../src/ai/purchase.ts"],"names":[],"mappings":"AAuCA,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,CAAA;AAE1C,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAUD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAwCf;AAgND,wBAAsB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAkS1E"}
|