paytaca-cli 0.6.2 → 0.8.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.
Files changed (160) hide show
  1. package/README.md +183 -34
  2. package/dist/ai/autoRefill.d.ts +85 -0
  3. package/dist/ai/autoRefill.d.ts.map +1 -0
  4. package/dist/ai/autoRefill.js +266 -0
  5. package/dist/ai/autoRefill.js.map +1 -0
  6. package/dist/ai/client.d.ts +73 -0
  7. package/dist/ai/client.d.ts.map +1 -0
  8. package/dist/ai/client.js +90 -0
  9. package/dist/ai/client.js.map +1 -0
  10. package/dist/ai/config.d.ts +8 -0
  11. package/dist/ai/config.d.ts.map +1 -0
  12. package/dist/ai/config.js +17 -0
  13. package/dist/ai/config.js.map +1 -0
  14. package/dist/ai/configure.d.ts +61 -0
  15. package/dist/ai/configure.d.ts.map +1 -0
  16. package/dist/ai/configure.js +452 -0
  17. package/dist/ai/configure.js.map +1 -0
  18. package/dist/ai/credits.d.ts +27 -0
  19. package/dist/ai/credits.d.ts.map +1 -0
  20. package/dist/ai/credits.js +108 -0
  21. package/dist/ai/credits.js.map +1 -0
  22. package/dist/ai/images.d.ts +128 -0
  23. package/dist/ai/images.d.ts.map +1 -0
  24. package/dist/ai/images.js +399 -0
  25. package/dist/ai/images.js.map +1 -0
  26. package/dist/ai/models.d.ts +13 -0
  27. package/dist/ai/models.d.ts.map +1 -0
  28. package/dist/ai/models.js +49 -0
  29. package/dist/ai/models.js.map +1 -0
  30. package/dist/ai/oauth.d.ts +45 -0
  31. package/dist/ai/oauth.d.ts.map +1 -0
  32. package/dist/ai/oauth.js +137 -0
  33. package/dist/ai/oauth.js.map +1 -0
  34. package/dist/ai/purchase.d.ts +30 -0
  35. package/dist/ai/purchase.d.ts.map +1 -0
  36. package/dist/ai/purchase.js +456 -0
  37. package/dist/ai/purchase.js.map +1 -0
  38. package/dist/commands/address.d.ts.map +1 -1
  39. package/dist/commands/address.js +86 -47
  40. package/dist/commands/address.js.map +1 -1
  41. package/dist/commands/ai.d.ts +9 -0
  42. package/dist/commands/ai.d.ts.map +1 -0
  43. package/dist/commands/ai.js +951 -0
  44. package/dist/commands/ai.js.map +1 -0
  45. package/dist/commands/balance.d.ts.map +1 -1
  46. package/dist/commands/balance.js +68 -129
  47. package/dist/commands/balance.js.map +1 -1
  48. package/dist/commands/history.d.ts.map +1 -1
  49. package/dist/commands/history.js +38 -78
  50. package/dist/commands/history.js.map +1 -1
  51. package/dist/commands/mcp.d.ts +14 -0
  52. package/dist/commands/mcp.d.ts.map +1 -0
  53. package/dist/commands/mcp.js +68 -0
  54. package/dist/commands/mcp.js.map +1 -0
  55. package/dist/commands/pay.js +1 -1
  56. package/dist/commands/pay.js.map +1 -1
  57. package/dist/commands/receive.d.ts +1 -8
  58. package/dist/commands/receive.d.ts.map +1 -1
  59. package/dist/commands/receive.js +51 -124
  60. package/dist/commands/receive.js.map +1 -1
  61. package/dist/commands/send.d.ts +0 -10
  62. package/dist/commands/send.d.ts.map +1 -1
  63. package/dist/commands/send.js +40 -50
  64. package/dist/commands/send.js.map +1 -1
  65. package/dist/commands/swap.js +1 -1
  66. package/dist/commands/swap.js.map +1 -1
  67. package/dist/commands/token.d.ts +1 -9
  68. package/dist/commands/token.d.ts.map +1 -1
  69. package/dist/commands/token.js +192 -289
  70. package/dist/commands/token.js.map +1 -1
  71. package/dist/commands/update.d.ts +32 -0
  72. package/dist/commands/update.d.ts.map +1 -0
  73. package/dist/commands/update.js +200 -0
  74. package/dist/commands/update.js.map +1 -0
  75. package/dist/commands/wallet.js +1 -1
  76. package/dist/commands/wallet.js.map +1 -1
  77. package/dist/commands/web.d.ts +3 -0
  78. package/dist/commands/web.d.ts.map +1 -0
  79. package/dist/commands/web.js +71 -0
  80. package/dist/commands/web.js.map +1 -0
  81. package/dist/core/context.d.ts +30 -0
  82. package/dist/core/context.d.ts.map +1 -0
  83. package/dist/core/context.js +45 -0
  84. package/dist/core/context.js.map +1 -0
  85. package/dist/core/wallet.d.ts +130 -0
  86. package/dist/core/wallet.d.ts.map +1 -0
  87. package/dist/core/wallet.js +276 -0
  88. package/dist/core/wallet.js.map +1 -0
  89. package/dist/index.js +8 -0
  90. package/dist/index.js.map +1 -1
  91. package/dist/mcp/server.d.ts +8 -0
  92. package/dist/mcp/server.d.ts.map +1 -0
  93. package/dist/mcp/server.js +52 -0
  94. package/dist/mcp/server.js.map +1 -0
  95. package/dist/mcp/tools.d.ts +7 -0
  96. package/dist/mcp/tools.d.ts.map +1 -0
  97. package/dist/mcp/tools.js +752 -0
  98. package/dist/mcp/tools.js.map +1 -0
  99. package/dist/utils/format.d.ts +23 -0
  100. package/dist/utils/format.d.ts.map +1 -0
  101. package/dist/utils/format.js +62 -0
  102. package/dist/utils/format.js.map +1 -0
  103. package/dist/utils/x402.js +1 -1
  104. package/dist/utils/x402.js.map +1 -1
  105. package/dist/wallet/cauldron/swap.d.ts +15 -0
  106. package/dist/wallet/cauldron/swap.d.ts.map +1 -1
  107. package/dist/wallet/cauldron/swap.js +31 -0
  108. package/dist/wallet/cauldron/swap.js.map +1 -1
  109. package/dist/wallet/index.d.ts +29 -1
  110. package/dist/wallet/index.d.ts.map +1 -1
  111. package/dist/wallet/index.js +92 -8
  112. package/dist/wallet/index.js.map +1 -1
  113. package/dist/wallet/keys.d.ts.map +1 -1
  114. package/dist/wallet/keys.js +2 -0
  115. package/dist/wallet/keys.js.map +1 -1
  116. package/dist/web/assets.d.ts +3 -0
  117. package/dist/web/assets.d.ts.map +1 -0
  118. package/dist/web/assets.js +3 -0
  119. package/dist/web/assets.js.map +1 -0
  120. package/dist/web/page.d.ts +2 -0
  121. package/dist/web/page.d.ts.map +1 -0
  122. package/dist/web/page.js +637 -0
  123. package/dist/web/page.js.map +1 -0
  124. package/dist/web/server.d.ts +79 -0
  125. package/dist/web/server.d.ts.map +1 -0
  126. package/dist/web/server.js +665 -0
  127. package/dist/web/server.js.map +1 -0
  128. package/package.json +8 -3
  129. package/dist/commands/wallet.test.d.ts +0 -2
  130. package/dist/commands/wallet.test.d.ts.map +0 -1
  131. package/dist/commands/wallet.test.js +0 -68
  132. package/dist/commands/wallet.test.js.map +0 -1
  133. package/dist/nostr/chat.test.d.ts +0 -2
  134. package/dist/nostr/chat.test.d.ts.map +0 -1
  135. package/dist/nostr/chat.test.js +0 -121
  136. package/dist/nostr/chat.test.js.map +0 -1
  137. package/dist/nostr/store.test.d.ts +0 -2
  138. package/dist/nostr/store.test.d.ts.map +0 -1
  139. package/dist/nostr/store.test.js +0 -456
  140. package/dist/nostr/store.test.js.map +0 -1
  141. package/dist/utils/prices.test.d.ts +0 -5
  142. package/dist/utils/prices.test.d.ts.map +0 -1
  143. package/dist/utils/prices.test.js +0 -62
  144. package/dist/utils/prices.test.js.map +0 -1
  145. package/dist/utils/x402.test.d.ts +0 -2
  146. package/dist/utils/x402.test.d.ts.map +0 -1
  147. package/dist/utils/x402.test.js +0 -216
  148. package/dist/utils/x402.test.js.map +0 -1
  149. package/dist/wallet/cauldron/pools.test.d.ts +0 -3
  150. package/dist/wallet/cauldron/pools.test.d.ts.map +0 -1
  151. package/dist/wallet/cauldron/pools.test.js +0 -149
  152. package/dist/wallet/cauldron/pools.test.js.map +0 -1
  153. package/dist/wallet/cauldron/swap.test.d.ts +0 -2
  154. package/dist/wallet/cauldron/swap.test.d.ts.map +0 -1
  155. package/dist/wallet/cauldron/swap.test.js +0 -179
  156. package/dist/wallet/cauldron/swap.test.js.map +0 -1
  157. package/skills/README.md +0 -68
  158. package/skills/paytaca-send/SKILL.md +0 -159
  159. package/skills/paytaca-wallet/SKILL.md +0 -164
  160. package/skills/paytaca-x402/SKILL.md +0 -130
@@ -0,0 +1,266 @@
1
+ import fs from 'fs';
2
+ import { PAYTACA_DIR, AUTO_REFILL_FILE, AUTO_REFILL_EVENTS_FILE, } from './config.js';
3
+ export function readAutoRefillState() {
4
+ try {
5
+ const raw = fs.readFileSync(AUTO_REFILL_FILE, 'utf8');
6
+ const parsed = JSON.parse(raw);
7
+ if (!parsed || typeof parsed !== 'object')
8
+ return null;
9
+ return parsed;
10
+ }
11
+ catch {
12
+ return null;
13
+ }
14
+ }
15
+ export function writeAutoRefillState(state) {
16
+ fs.mkdirSync(PAYTACA_DIR, { recursive: true, mode: 0o700 });
17
+ const tmp = `${AUTO_REFILL_FILE}.tmp`;
18
+ fs.writeFileSync(tmp, JSON.stringify(state, null, 2), {
19
+ mode: 0o600,
20
+ });
21
+ fs.renameSync(tmp, AUTO_REFILL_FILE);
22
+ }
23
+ export function appendAutoRefillEvent(event, file = AUTO_REFILL_EVENTS_FILE) {
24
+ fs.mkdirSync(PAYTACA_DIR, { recursive: true, mode: 0o700 });
25
+ fs.appendFileSync(file, `${JSON.stringify(event)}\n`, { mode: 0o600 });
26
+ }
27
+ export function deleteAutoRefill(file = AUTO_REFILL_FILE) {
28
+ try {
29
+ fs.unlinkSync(file);
30
+ return true;
31
+ }
32
+ catch (err) {
33
+ if (err?.code === 'ENOENT')
34
+ return false;
35
+ throw err;
36
+ }
37
+ }
38
+ export function armAutoRefill(opts) {
39
+ const existing = readAutoRefillState();
40
+ const state = {
41
+ enabled: true,
42
+ model: opts.model ?? existing?.model,
43
+ minutes: opts.minutes ?? existing?.minutes,
44
+ maxMinutes: opts.maxMinutes ?? existing?.maxMinutes,
45
+ spentMinutes: existing?.spentMinutes ?? 0,
46
+ refillCount: existing?.refillCount ?? 0,
47
+ paymentMethod: opts.paymentMethod ?? existing?.paymentMethod ?? 'bch',
48
+ startedAt: new Date().toISOString(),
49
+ lastRefillAt: existing?.lastRefillAt,
50
+ lastRefillTxid: existing?.lastRefillTxid ?? null,
51
+ lastEvent: existing?.lastEvent,
52
+ };
53
+ writeAutoRefillState(state);
54
+ return state;
55
+ }
56
+ export function disarmAutoRefill() {
57
+ const existing = readAutoRefillState();
58
+ const state = {
59
+ ...(existing || {}),
60
+ enabled: false,
61
+ };
62
+ writeAutoRefillState(state);
63
+ return state;
64
+ }
65
+ export function remainingBudget(state) {
66
+ if (!state || state.maxMinutes === undefined)
67
+ return null;
68
+ return Math.max(0, state.maxMinutes - (state.spentMinutes ?? 0));
69
+ }
70
+ export function autoRefillCanBuy(state, model, minutes) {
71
+ if (!state || !state.enabled) {
72
+ return { canBuy: false, reason: 'Auto-refill is not enabled.' };
73
+ }
74
+ if (state.model && state.model !== model) {
75
+ return {
76
+ canBuy: false,
77
+ reason: `Auto-refill is armed for ${state.model}, not ${model}.`,
78
+ };
79
+ }
80
+ if (state.minutes && state.minutes !== minutes) {
81
+ return {
82
+ canBuy: false,
83
+ reason: `Auto-refill is armed for ${state.minutes}-minute plans, not ${minutes}.`,
84
+ };
85
+ }
86
+ const budget = remainingBudget(state);
87
+ if (budget !== null && budget < minutes) {
88
+ return {
89
+ canBuy: false,
90
+ reason: `Auto-refill budget exhausted (${budget} min left).`,
91
+ };
92
+ }
93
+ return { canBuy: true };
94
+ }
95
+ export const REFILL_COOLDOWN_MS = 5 * 60 * 1000;
96
+ export async function autoRefillTick(deps) {
97
+ const read = deps.readState ?? readAutoRefillState;
98
+ const write = deps.writeState ?? writeAutoRefillState;
99
+ const append = deps.appendEvent ?? appendAutoRefillEvent;
100
+ const now = deps.now ? deps.now() : Date.now();
101
+ const disarmWithState = (current, reason, extra) => {
102
+ const at = new Date(now).toISOString();
103
+ const next = {
104
+ ...current,
105
+ enabled: false,
106
+ lastEvent: {
107
+ action: 'disarmed',
108
+ reason,
109
+ at,
110
+ txid: extra?.txid ?? null,
111
+ status: extra?.status ?? 'completed',
112
+ },
113
+ };
114
+ write(next);
115
+ append({
116
+ action: 'disarmed',
117
+ reason,
118
+ at,
119
+ model: current.model ?? null,
120
+ minutes: current.minutes ?? null,
121
+ txid: extra?.txid ?? null,
122
+ priceSats: extra?.priceSats ?? null,
123
+ paymentMethod: current.paymentMethod ?? null,
124
+ status: extra?.status ?? 'completed',
125
+ });
126
+ return { action: 'disarmed', reason, state: next };
127
+ };
128
+ const state = read();
129
+ if (!state || !state.enabled)
130
+ return { action: 'idle' };
131
+ const model = state.model;
132
+ const minutes = state.minutes;
133
+ if (!model || !minutes || minutes <= 0) {
134
+ return disarmWithState(state, 'incomplete config');
135
+ }
136
+ const budget = remainingBudget(state);
137
+ if (budget !== null && budget < minutes) {
138
+ return disarmWithState(state, 'budget exhausted');
139
+ }
140
+ let active;
141
+ try {
142
+ active = await deps.hasActiveCredits(model);
143
+ }
144
+ catch (err) {
145
+ return { action: 'skipped', reason: `credit check failed: ${err?.message || err}` };
146
+ }
147
+ if (active)
148
+ return { action: 'idle' };
149
+ const fresh = read();
150
+ if (!fresh || !fresh.enabled)
151
+ return { action: 'idle' };
152
+ if (fresh.lastRefillAt) {
153
+ const last = Date.parse(fresh.lastRefillAt);
154
+ if (Number.isFinite(last) &&
155
+ now - last < REFILL_COOLDOWN_MS) {
156
+ return { action: 'skipped', reason: 'cooldown: last refill less than 5 minutes ago' };
157
+ }
158
+ }
159
+ const freshModel = fresh.model;
160
+ const freshMinutes = fresh.minutes;
161
+ if (!freshModel || !freshMinutes || freshMinutes <= 0) {
162
+ return disarmWithState(fresh, 'incomplete config');
163
+ }
164
+ const freshBudget = remainingBudget(fresh);
165
+ if (freshBudget !== null && freshBudget < freshMinutes) {
166
+ return disarmWithState(fresh, 'budget exhausted');
167
+ }
168
+ let result;
169
+ try {
170
+ result = await deps.buy({
171
+ model: freshModel,
172
+ minutes: freshMinutes,
173
+ paymentMethod: fresh.paymentMethod || 'bch',
174
+ });
175
+ }
176
+ catch (err) {
177
+ return { action: 'skipped', reason: `purchase failed: ${err?.message || err}` };
178
+ }
179
+ if (!result.success || !result.paid) {
180
+ return disarmWithState(fresh, result.error || 'purchase failed', {
181
+ priceSats: result.priceSats ?? null,
182
+ status: 'failed',
183
+ });
184
+ }
185
+ const at = new Date(now).toISOString();
186
+ const txid = result.txid ?? null;
187
+ const next = {
188
+ ...fresh,
189
+ spentMinutes: (fresh.spentMinutes ?? 0) + freshMinutes,
190
+ refillCount: (fresh.refillCount ?? 0) + 1,
191
+ lastRefillAt: at,
192
+ lastRefillTxid: txid,
193
+ lastEvent: {
194
+ action: 'refilled',
195
+ reason: null,
196
+ at,
197
+ txid,
198
+ status: 'completed',
199
+ },
200
+ };
201
+ const nextBudget = remainingBudget(next);
202
+ let exhausted = false;
203
+ if (nextBudget !== null && nextBudget < freshMinutes) {
204
+ exhausted = true;
205
+ next.enabled = false;
206
+ next.lastEvent = {
207
+ action: 'disarmed',
208
+ reason: 'budget exhausted',
209
+ at,
210
+ txid,
211
+ status: 'completed',
212
+ };
213
+ }
214
+ write(next);
215
+ append({
216
+ action: 'refilled',
217
+ reason: null,
218
+ at,
219
+ model: freshModel,
220
+ minutes: freshMinutes,
221
+ txid,
222
+ priceSats: result.priceSats ?? null,
223
+ paymentMethod: fresh.paymentMethod ?? null,
224
+ status: 'completed',
225
+ });
226
+ if (exhausted) {
227
+ append({
228
+ action: 'disarmed',
229
+ reason: 'budget exhausted',
230
+ at,
231
+ model: freshModel,
232
+ minutes: freshMinutes,
233
+ txid,
234
+ priceSats: result.priceSats ?? null,
235
+ paymentMethod: fresh.paymentMethod ?? null,
236
+ status: 'completed',
237
+ });
238
+ }
239
+ return { action: 'refilled', state: next };
240
+ }
241
+ export function startAutoRefillLoop(opts) {
242
+ const intervalMs = opts.intervalMs && opts.intervalMs > 0 ? opts.intervalMs : 60_000;
243
+ let running = false;
244
+ const tick = async () => {
245
+ if (running)
246
+ return;
247
+ running = true;
248
+ try {
249
+ const result = await autoRefillTick(opts);
250
+ if (result.action !== 'idle')
251
+ opts.onEvent?.(result);
252
+ }
253
+ catch (err) {
254
+ opts.onEvent?.({ action: 'skipped', reason: err?.message || String(err) });
255
+ }
256
+ finally {
257
+ running = false;
258
+ }
259
+ };
260
+ const timer = setInterval(() => void tick(), intervalMs);
261
+ if (typeof timer.unref === 'function')
262
+ timer.unref();
263
+ void tick();
264
+ return () => clearInterval(timer);
265
+ }
266
+ //# sourceMappingURL=autoRefill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoRefill.js","sourceRoot":"","sources":["../../src/ai/autoRefill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ export interface PriceTier {
2
+ minutes: number;
3
+ price_usd?: number;
4
+ price_php?: number;
5
+ price_sats: number;
6
+ }
7
+ export interface AiModelConfig {
8
+ id: string;
9
+ display_name: string;
10
+ price_tiers: PriceTier[];
11
+ }
12
+ export interface AiConfig {
13
+ models: AiModelConfig[];
14
+ default_model?: string;
15
+ default_duration_minutes?: number;
16
+ context_retention_hours?: number;
17
+ lift_payment_discount_percent?: number;
18
+ proxy_url?: string;
19
+ image_models?: unknown[];
20
+ }
21
+ export interface WalletSession {
22
+ model_id?: string;
23
+ ai_model?: string;
24
+ display_name?: string;
25
+ model_active?: boolean;
26
+ session_active?: boolean;
27
+ time_credits_seconds?: number;
28
+ time_used_seconds?: number;
29
+ time_remaining_seconds?: number;
30
+ token_limit?: number;
31
+ }
32
+ export interface WalletStatus extends WalletSession {
33
+ sessions?: WalletSession[];
34
+ }
35
+ export interface ChatMessage {
36
+ role: 'system' | 'user' | 'assistant' | 'tool';
37
+ content: string;
38
+ }
39
+ export interface ChatResult {
40
+ ok: boolean;
41
+ status: number;
42
+ statusText: string;
43
+ headers: Record<string, string>;
44
+ data: any;
45
+ }
46
+ export declare class AiApiError extends Error {
47
+ status?: number;
48
+ body?: unknown;
49
+ constructor(message: string, status?: number, body?: unknown);
50
+ }
51
+ export interface RequestOptions {
52
+ backendUrl?: string;
53
+ headers?: Record<string, string>;
54
+ timeoutMs?: number;
55
+ signal?: AbortSignal;
56
+ }
57
+ export declare function getConfig(opts?: RequestOptions): Promise<AiConfig>;
58
+ export declare function getWalletStatus(walletHash: string, opts?: RequestOptions & {
59
+ modelId?: string;
60
+ }): Promise<WalletStatus>;
61
+ export interface ChatRequestOptions extends RequestOptions {
62
+ walletHash: string;
63
+ body: {
64
+ model?: string;
65
+ messages: ChatMessage[];
66
+ stream?: boolean;
67
+ temperature?: number;
68
+ max_tokens?: number;
69
+ [key: string]: unknown;
70
+ };
71
+ }
72
+ export declare function chatCompletions(opts: ChatRequestOptions): Promise<ChatResult>;
73
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/ai/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { resolveBackendUrl, apiUrl } from './config.js';
2
+ export class AiApiError extends Error {
3
+ status;
4
+ body;
5
+ constructor(message, status, body) {
6
+ super(message);
7
+ this.name = 'AiApiError';
8
+ this.status = status;
9
+ this.body = body;
10
+ }
11
+ }
12
+ async function doFetch(url, init, timeoutMs) {
13
+ const signal = timeoutMs ? AbortSignal.timeout(timeoutMs) : undefined;
14
+ return fetch(url, { ...init, signal });
15
+ }
16
+ async function parseBody(response) {
17
+ const text = await response.text();
18
+ if (!text)
19
+ return null;
20
+ try {
21
+ return JSON.parse(text);
22
+ }
23
+ catch {
24
+ return text;
25
+ }
26
+ }
27
+ function headersToObject(headers) {
28
+ const out = {};
29
+ headers.forEach((value, key) => {
30
+ out[key] = value;
31
+ });
32
+ return out;
33
+ }
34
+ export async function getConfig(opts = {}) {
35
+ const base = resolveBackendUrl(opts.backendUrl);
36
+ let response;
37
+ try {
38
+ response = await doFetch(apiUrl(base, '/v1/config'), { method: 'GET', headers: opts.headers }, opts.timeoutMs ?? 15000);
39
+ }
40
+ catch (err) {
41
+ throw new AiApiError(`Backend unreachable: ${err?.message || err}`);
42
+ }
43
+ const body = await parseBody(response);
44
+ if (!response.ok) {
45
+ throw new AiApiError(`GET /v1/config failed (${response.status} ${response.statusText})`, response.status, body);
46
+ }
47
+ return body;
48
+ }
49
+ export async function getWalletStatus(walletHash, opts = {}) {
50
+ const base = resolveBackendUrl(opts.backendUrl);
51
+ const url = new URL(apiUrl(base, '/v1/wallet/status'));
52
+ if (opts.modelId)
53
+ url.searchParams.set('model_id', opts.modelId);
54
+ let response;
55
+ try {
56
+ response = await doFetch(url.toString(), {
57
+ method: 'GET',
58
+ headers: { 'X-Wallet-Hash': walletHash, ...(opts.headers || {}) },
59
+ }, opts.timeoutMs ?? 15000);
60
+ }
61
+ catch (err) {
62
+ throw new AiApiError(`Backend unreachable: ${err?.message || err}`);
63
+ }
64
+ const body = await parseBody(response);
65
+ if (!response.ok) {
66
+ throw new AiApiError(`GET /v1/wallet/status failed (${response.status} ${response.statusText})`, response.status, body);
67
+ }
68
+ return body;
69
+ }
70
+ export async function chatCompletions(opts) {
71
+ const base = resolveBackendUrl(opts.backendUrl);
72
+ const headers = {
73
+ 'Content-Type': 'application/json',
74
+ 'X-Wallet-Hash': opts.walletHash,
75
+ ...(opts.headers || {}),
76
+ };
77
+ const response = await doFetch(apiUrl(base, '/v1/chat/completions'), {
78
+ method: 'POST',
79
+ headers,
80
+ body: JSON.stringify({ stream: false, ...opts.body }),
81
+ }, opts.timeoutMs ?? 240000);
82
+ return {
83
+ ok: response.ok,
84
+ status: response.status,
85
+ statusText: response.statusText,
86
+ headers: headersToObject(response.headers),
87
+ data: await parseBody(response),
88
+ };
89
+ }
90
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/ai/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare const DEFAULT_BACKEND_URL = "https://api.paytaca.ai";
2
+ export declare const LIFT_TOKEN_ID = "5932b2fd4915d6a75d3ec53282cd49118149a2176ee67ed68b1111ff0786f7fc";
3
+ export declare const PAYTACA_DIR: string;
4
+ export declare const AUTO_REFILL_FILE: string;
5
+ export declare const AUTO_REFILL_EVENTS_FILE: string;
6
+ export declare function resolveBackendUrl(explicit?: string): string;
7
+ export declare function apiUrl(baseUrl: string, apiPath: string): string;
8
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/ai/config.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,mBAAmB,2BAA2B,CAAA;AAE3D,eAAO,MAAM,aAAa,qEAC0C,CAAA;AAEpE,eAAO,MAAM,WAAW,QAAsC,CAAA;AAC9D,eAAO,MAAM,gBAAgB,QAA6C,CAAA;AAC1E,eAAO,MAAM,uBAAuB,QAGnC,CAAA;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAI/D"}
@@ -0,0 +1,17 @@
1
+ import os from 'os';
2
+ import path from 'path';
3
+ export const DEFAULT_BACKEND_URL = 'https://api.paytaca.ai';
4
+ export const LIFT_TOKEN_ID = '5932b2fd4915d6a75d3ec53282cd49118149a2176ee67ed68b1111ff0786f7fc';
5
+ export const PAYTACA_DIR = path.join(os.homedir(), '.paytaca');
6
+ export const AUTO_REFILL_FILE = path.join(PAYTACA_DIR, 'auto-refill.json');
7
+ export const AUTO_REFILL_EVENTS_FILE = path.join(PAYTACA_DIR, 'auto-refill-events.jsonl');
8
+ export function resolveBackendUrl(explicit) {
9
+ const url = explicit || process.env.PAYTACA_BACKEND_URL || DEFAULT_BACKEND_URL;
10
+ return url.replace(/\/+$/, '');
11
+ }
12
+ export function apiUrl(baseUrl, apiPath) {
13
+ const normalized = baseUrl.replace(/\/+$/, '');
14
+ const suffix = apiPath.startsWith('/') ? apiPath : `/${apiPath}`;
15
+ return `${normalized}${suffix}`;
16
+ }
17
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/ai/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,MAAM,CAAC,MAAM,mBAAmB,GAAG,wBAAwB,CAAA;AAE3D,MAAM,CAAC,MAAM,aAAa,GACxB,kEAAkE,CAAA;AAEpE,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAA;AAC9D,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAA;AAC1E,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC,IAAI,CAC9C,WAAW,EACX,0BAA0B,CAC3B,CAAA;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAiB;IACjD,MAAM,GAAG,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,mBAAmB,CAAA;IAC9E,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AAChC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,OAAe,EAAE,OAAe;IACrD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAA;IAChE,OAAO,GAAG,UAAU,GAAG,MAAM,EAAE,CAAA;AACjC,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Harness configuration: writes the MCP server entry and the Paytaca AI
3
+ * provider (models + API key) — the opencode provider block or the Pi
4
+ * models.json — so AI models are usable right after `paytaca ai configure`.
5
+ */
6
+ import { type McpClient } from '../commands/mcp.js';
7
+ import { type AiConfig } from './client.js';
8
+ import { type CreditsSummary } from './credits.js';
9
+ export declare const OPENCODE_PROVIDER_ID = "paytaca-ai";
10
+ export declare const PI_PROVIDER_ID = "paytaca-ai";
11
+ export declare const OMP_PROVIDER_ID = "paytaca-ai";
12
+ export declare const OPENCODE_PROVIDER_NPM = "@ai-sdk/openai-compatible";
13
+ export declare const DEFAULT_MODEL_CONTEXT = 128000;
14
+ export declare const DEFAULT_MODEL_OUTPUT = 8192;
15
+ export interface PlanSuggestion {
16
+ modelId: string;
17
+ displayName: string;
18
+ minutes: number;
19
+ priceSats: number;
20
+ priceUsd?: number;
21
+ }
22
+ export interface ConfigureResult {
23
+ harness: McpClient;
24
+ path: string | null;
25
+ format: 'json';
26
+ instructions: string;
27
+ mcpInstalled: boolean;
28
+ providerInstalled: boolean;
29
+ providerError?: string;
30
+ canSign: boolean;
31
+ apiKeyReused: boolean;
32
+ apiKeyProvided: boolean;
33
+ apiKeyPrefix?: string;
34
+ models: {
35
+ id: string;
36
+ name: string;
37
+ }[];
38
+ creditsActive: boolean;
39
+ credits: CreditsSummary[];
40
+ planSuggestion?: PlanSuggestion;
41
+ warnings?: string[];
42
+ }
43
+ export interface ConfigureOptions {
44
+ harness: McpClient;
45
+ chipnet?: boolean;
46
+ backendUrl?: string;
47
+ path?: string;
48
+ apiKey?: string;
49
+ requestApiKey?: () => Promise<string | null>;
50
+ }
51
+ export declare function isValidApiKey(key: string): boolean;
52
+ export declare function deepMerge(target: Record<string, unknown>, patch: Record<string, unknown>): Record<string, unknown>;
53
+ export declare function buildOpencodeProvider(config: AiConfig, backendUrl: string, apiKey: string): Record<string, unknown>;
54
+ export declare function extractExistingApiKey(config: Record<string, unknown>, providerId?: string): string | null;
55
+ export declare function buildPiProvider(config: AiConfig, backendUrl: string, apiKey: string): Record<string, unknown>;
56
+ export declare function extractPiApiKey(config: Record<string, unknown>, providerId?: string): string | null;
57
+ export declare function extractOmpDefaultModel(yaml: string): string | null;
58
+ export declare function replaceOmpDefaultModel(yaml: string, nextModelRef: string): string | null;
59
+ export declare function parseJsonConfig(raw: string): Record<string, unknown>;
60
+ export declare function configureHarness(options: ConfigureOptions): Promise<ConfigureResult>;
61
+ //# sourceMappingURL=configure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../../src/ai/configure.ts"],"names":[],"mappings":"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"}