paytaca-cli 0.7.0 → 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 (59) hide show
  1. package/README.md +37 -4
  2. package/dist/ai/autoRefill.d.ts +58 -0
  3. package/dist/ai/autoRefill.d.ts.map +1 -1
  4. package/dist/ai/autoRefill.js +193 -2
  5. package/dist/ai/autoRefill.js.map +1 -1
  6. package/dist/ai/config.d.ts +1 -0
  7. package/dist/ai/config.d.ts.map +1 -1
  8. package/dist/ai/config.js +1 -0
  9. package/dist/ai/config.js.map +1 -1
  10. package/dist/ai/credits.d.ts.map +1 -1
  11. package/dist/ai/credits.js +20 -11
  12. package/dist/ai/credits.js.map +1 -1
  13. package/dist/ai/images.d.ts +128 -0
  14. package/dist/ai/images.d.ts.map +1 -0
  15. package/dist/ai/images.js +399 -0
  16. package/dist/ai/images.js.map +1 -0
  17. package/dist/commands/ai.d.ts.map +1 -1
  18. package/dist/commands/ai.js +283 -7
  19. package/dist/commands/ai.js.map +1 -1
  20. package/dist/commands/update.d.ts +32 -0
  21. package/dist/commands/update.d.ts.map +1 -0
  22. package/dist/commands/update.js +200 -0
  23. package/dist/commands/update.js.map +1 -0
  24. package/dist/commands/wallet.js +1 -1
  25. package/dist/commands/wallet.js.map +1 -1
  26. package/dist/commands/web.d.ts +3 -0
  27. package/dist/commands/web.d.ts.map +1 -0
  28. package/dist/commands/web.js +71 -0
  29. package/dist/commands/web.js.map +1 -0
  30. package/dist/index.js +4 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/mcp/server.d.ts.map +1 -1
  33. package/dist/mcp/server.js +29 -1
  34. package/dist/mcp/server.js.map +1 -1
  35. package/dist/mcp/tools.d.ts +2 -0
  36. package/dist/mcp/tools.d.ts.map +1 -1
  37. package/dist/mcp/tools.js +288 -9
  38. package/dist/mcp/tools.js.map +1 -1
  39. package/dist/wallet/cauldron/swap.d.ts +15 -0
  40. package/dist/wallet/cauldron/swap.d.ts.map +1 -1
  41. package/dist/wallet/cauldron/swap.js +31 -0
  42. package/dist/wallet/cauldron/swap.js.map +1 -1
  43. package/dist/wallet/index.d.ts +16 -1
  44. package/dist/wallet/index.d.ts.map +1 -1
  45. package/dist/wallet/index.js +74 -8
  46. package/dist/wallet/index.js.map +1 -1
  47. package/dist/web/assets.d.ts +3 -0
  48. package/dist/web/assets.d.ts.map +1 -0
  49. package/dist/web/assets.js +3 -0
  50. package/dist/web/assets.js.map +1 -0
  51. package/dist/web/page.d.ts +2 -0
  52. package/dist/web/page.d.ts.map +1 -0
  53. package/dist/web/page.js +637 -0
  54. package/dist/web/page.js.map +1 -0
  55. package/dist/web/server.d.ts +79 -0
  56. package/dist/web/server.d.ts.map +1 -0
  57. package/dist/web/server.js +665 -0
  58. package/dist/web/server.js.map +1 -0
  59. package/package.json +2 -1
package/README.md CHANGED
@@ -155,6 +155,16 @@ paytaca pay https://api.example.com/v1/complete --method POST --body '{"prompt":
155
155
  # → Handles 402 → pays → returns response
156
156
  ```
157
157
 
158
+ ### Update
159
+
160
+ ```bash
161
+ paytaca update # Update paytaca-cli to the latest version on npm
162
+ paytaca update --check # Only check for updates; do not install
163
+ paytaca update --registry <url> # Override the npm registry URL
164
+ ```
165
+
166
+ Compares the installed version against the latest published version on npm and, when behind, runs `npm install -g paytaca-cli@latest`. Pass `--check` to see available updates without installing.
167
+
158
168
  ### Paytaca AI
159
169
 
160
170
  Paytaca AI is a pay-as-you-go model gateway paid with BCH or LIFT via x402. Manage it from the CLI:
@@ -170,11 +180,32 @@ paytaca ai balance # BCH + LIFT funds available for purchases
170
180
  paytaca ai purchase --model <id> --minutes <n> # Buy a plan
171
181
  paytaca ai purchase --model <id> --minutes 60 --lift # Pay with LIFT (discount)
172
182
  paytaca ai auto-refill --enable --model <id> --minutes <n> --max-minutes <n>
173
- paytaca ai auto-refill --status # Inspect; also --disable
183
+ paytaca ai auto-refill --status # Inspect; also --disable, --delete
174
184
  ```
175
185
 
176
186
  `ai configure` accepts `--backend`, `--path`, `--api-key`, `--chipnet`, and `-y/--yes`. `ai purchase` and `ai auto-refill` accept `--lift` to pay with LIFT tokens at a discount. Add `--json` to any `ai` subcommand for machine-readable output.
177
187
 
188
+ Armed auto-refill state lives at `~/.paytaca/auto-refill.json`. It runs inline — arming performs one immediate check (buying right away if the armed model has no credits), the `get_credits` MCP tool refills on demand, and the `paytaca mcp` server keeps a background backstop while a session is running. Each execution is appended to `~/.paytaca/auto-refill-events.jsonl` and the latest is reported as `lastEvent`. It disarms when the budget is spent, funds are short, or the plan is no longer offered. Use `--disable` to pause and `--delete` to remove the configuration (history is kept).
189
+
190
+ ### Image Generation
191
+
192
+ Generate images with AI models, paid in BCH on-chain:
193
+
194
+ ```bash
195
+ paytaca ai image models # List available image models
196
+ paytaca ai image generate "a green phoenix" # Generate an image from a prompt
197
+ paytaca ai image generate "prompt" --model <id> # Specify model (defaults to cheapest)
198
+ paytaca ai image generate "prompt" --aspect-ratio 16:9 # Aspect ratio (default: 1:1)
199
+ paytaca ai image generate "prompt" --quality high # Quality: low, medium, high, auto
200
+ paytaca ai image generate "prompt" --resolution 2K # Resolution: 512, 1K, 2K, 4K
201
+ paytaca ai image generate "prompt" --yes # Skip confirmation prompt
202
+ paytaca ai image history # Show order history
203
+ paytaca ai image history --page 2 # Paginate history
204
+ paytaca ai image status <order-id> # Poll a pending generation order
205
+ ```
206
+
207
+ Image generation uses a two-phase flow: an order is created (returning a CashScript contract address and sats price), BCH is paid on-chain, the backend confirms payment via Watchtower, generation runs server-side, and the finished image is saved under `~/.paytaca/images/`. Use `image status` to resume if a generation is still processing when the initial request returns.
208
+
178
209
  ### MCP Server
179
210
 
180
211
  Configure an AI harness in one step. This installs the Paytaca MCP server and, for opencode, also the Paytaca AI provider (model catalogue + API key) so the Paytaca AI models are usable immediately:
@@ -201,9 +232,9 @@ paytaca ai configure opencode --api-key sk-pytc-… # read-only wallet
201
232
 
202
233
  Read-only wallets report credits from the shared wallet hash but can't buy plans — fund credits from the full wallet.
203
234
 
204
- **MCP tools:** wallet reads (`get_balance`, `get_transactions`, `get_receiving_address`, `get_tokens`, `send`) plus Paytaca AI (`get_models`, `get_plans`, `get_credits`, `buy_plan`, `auto_refill`, `get_help`).
235
+ **MCP tools:** wallet reads (`get_balance`, `get_transactions`, `get_receiving_address`, `get_tokens`, `send`) plus Paytaca AI (`get_models`, `get_plans`, `get_credits`, `buy_plan`, `auto_refill`, `get_help`, `generate_image`, `get_image_status`, `get_image_models`, `get_image_history`).
205
236
 
206
- Spending tools (`send`, `buy_plan`, `auto_refill`) require host-level approval. By default MCP operates on your **main wallet** and can spend real funds.
237
+ Spending tools (`send`, `buy_plan`, `auto_refill`, `generate_image`) require host-level approval. By default MCP operates on your **main wallet** and can spend real funds.
207
238
 
208
239
  When `get_credits` finds a model with no active session (e.g. after a `402` from the Paytaca AI provider), the result includes a `purchaseHint`. Relay `purchaseHint.message` as-is — it carries the exact copy-paste top-up command (no upsell or follow-up questions needed):
209
240
 
@@ -277,9 +308,10 @@ src/
277
308
  swap.ts Cauldron DEX swaps (sell/buy with --action)
278
309
  pay.ts x402 BCH payment handler for HTTP requests
279
310
  check.ts Check if URL requires x402 payment
280
- ai.ts Paytaca AI (configure, api-key, models, plans, credits, purchase, auto-refill)
311
+ ai.ts Paytaca AI (configure, api-key, models, plans, credits, purchase, auto-refill, image)
281
312
  chat.ts Nostr chat (contacts, conversations, identity, listen)
282
313
  mcp.ts `paytaca mcp` stdio entry + per-harness config templates
314
+ update.ts Self-update from npm registry
283
315
  core/
284
316
  context.ts Wallet context resolution (keychain + network), embed-safe
285
317
  wallet.ts Render-agnostic wallet ops shared by CLI and MCP tools
@@ -312,6 +344,7 @@ src/
312
344
  oauth.ts BCH OAuth challenge -> access token -> API key
313
345
  models.ts Model catalogue, plan tiers, price/duration helpers
314
346
  credits.ts Credit session lookup and summaries
347
+ images.ts Image generation client, order orchestration, polling
315
348
  purchase.ts Plan purchase via x402 (BCH or LIFT)
316
349
  autoRefill.ts Auto-refill state and orchestration
317
350
  configure.ts Harness setup (MCP + Paytaca AI provider + credits offer)
@@ -1,16 +1,34 @@
1
1
  export type PaymentMethod = 'bch' | 'lift';
2
+ export interface RefillLastEvent {
3
+ action: 'refilled' | 'disarmed';
4
+ reason: string | null;
5
+ at: string;
6
+ txid: string | null;
7
+ status: 'completed' | 'failed';
8
+ }
9
+ export interface RefillEvent extends RefillLastEvent {
10
+ model: string | null;
11
+ minutes: number | null;
12
+ priceSats: number | null;
13
+ paymentMethod: PaymentMethod | null;
14
+ }
2
15
  export interface AutoRefillState {
3
16
  enabled: boolean;
4
17
  model?: string;
5
18
  minutes?: number;
6
19
  maxMinutes?: number;
7
20
  spentMinutes?: number;
21
+ refillCount?: number;
8
22
  paymentMethod?: PaymentMethod;
9
23
  startedAt?: string;
10
24
  lastRefillAt?: string;
25
+ lastRefillTxid?: string | null;
26
+ lastEvent?: RefillLastEvent;
11
27
  }
12
28
  export declare function readAutoRefillState(): AutoRefillState | null;
13
29
  export declare function writeAutoRefillState(state: AutoRefillState): void;
30
+ export declare function appendAutoRefillEvent(event: RefillEvent, file?: string): void;
31
+ export declare function deleteAutoRefill(file?: string): boolean;
14
32
  export interface ArmAutoRefillOptions {
15
33
  model?: string;
16
34
  minutes?: number;
@@ -24,4 +42,44 @@ export declare function autoRefillCanBuy(state: AutoRefillState | null, model: s
24
42
  canBuy: boolean;
25
43
  reason?: string;
26
44
  };
45
+ export declare const REFILL_COOLDOWN_MS: number;
46
+ export interface RefillBuyOptions {
47
+ model: string;
48
+ minutes: number;
49
+ paymentMethod: PaymentMethod;
50
+ }
51
+ export interface RefillBuyResult {
52
+ success: boolean;
53
+ paid?: boolean;
54
+ txid?: string;
55
+ priceSats?: number;
56
+ error?: string;
57
+ }
58
+ export interface RefillTickDeps {
59
+ hasActiveCredits: (model: string) => Promise<boolean>;
60
+ buy: (opts: RefillBuyOptions) => Promise<RefillBuyResult>;
61
+ readState?: () => AutoRefillState | null;
62
+ writeState?: (state: AutoRefillState) => void;
63
+ appendEvent?: (event: RefillEvent) => void;
64
+ now?: () => number;
65
+ }
66
+ export type RefillTickResult = {
67
+ action: 'idle';
68
+ } | {
69
+ action: 'skipped';
70
+ reason: string;
71
+ } | {
72
+ action: 'refilled';
73
+ state: AutoRefillState;
74
+ } | {
75
+ action: 'disarmed';
76
+ reason: string;
77
+ state: AutoRefillState;
78
+ };
79
+ export declare function autoRefillTick(deps: RefillTickDeps): Promise<RefillTickResult>;
80
+ export interface RefillLoopOptions extends RefillTickDeps {
81
+ intervalMs?: number;
82
+ onEvent?: (result: RefillTickResult) => void;
83
+ }
84
+ export declare function startAutoRefillLoop(opts: RefillLoopOptions): () => void;
27
85
  //# sourceMappingURL=autoRefill.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"autoRefill.d.ts","sourceRoot":"","sources":["../../src/ai/autoRefill.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,CAAA;AAE1C,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,wBAAgB,mBAAmB,IAAI,eAAe,GAAG,IAAI,CAS5D;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAKjE;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,aAAa,CAAA;CAC9B;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG,eAAe,CAczE;AAED,wBAAgB,gBAAgB,IAAI,eAAe,CAQlD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAG5E;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,eAAe,GAAG,IAAI,EAC7B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAwBtC"}
1
+ {"version":3,"file":"autoRefill.d.ts","sourceRoot":"","sources":["../../src/ai/autoRefill.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import fs from 'fs';
2
- import { PAYTACA_DIR, AUTO_REFILL_FILE } from './config.js';
2
+ import { PAYTACA_DIR, AUTO_REFILL_FILE, AUTO_REFILL_EVENTS_FILE, } from './config.js';
3
3
  export function readAutoRefillState() {
4
4
  try {
5
5
  const raw = fs.readFileSync(AUTO_REFILL_FILE, 'utf8');
@@ -14,9 +14,26 @@ export function readAutoRefillState() {
14
14
  }
15
15
  export function writeAutoRefillState(state) {
16
16
  fs.mkdirSync(PAYTACA_DIR, { recursive: true, mode: 0o700 });
17
- fs.writeFileSync(AUTO_REFILL_FILE, JSON.stringify(state, null, 2), {
17
+ const tmp = `${AUTO_REFILL_FILE}.tmp`;
18
+ fs.writeFileSync(tmp, JSON.stringify(state, null, 2), {
18
19
  mode: 0o600,
19
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
+ }
20
37
  }
21
38
  export function armAutoRefill(opts) {
22
39
  const existing = readAutoRefillState();
@@ -26,9 +43,12 @@ export function armAutoRefill(opts) {
26
43
  minutes: opts.minutes ?? existing?.minutes,
27
44
  maxMinutes: opts.maxMinutes ?? existing?.maxMinutes,
28
45
  spentMinutes: existing?.spentMinutes ?? 0,
46
+ refillCount: existing?.refillCount ?? 0,
29
47
  paymentMethod: opts.paymentMethod ?? existing?.paymentMethod ?? 'bch',
30
48
  startedAt: new Date().toISOString(),
31
49
  lastRefillAt: existing?.lastRefillAt,
50
+ lastRefillTxid: existing?.lastRefillTxid ?? null,
51
+ lastEvent: existing?.lastEvent,
32
52
  };
33
53
  writeAutoRefillState(state);
34
54
  return state;
@@ -72,4 +92,175 @@ export function autoRefillCanBuy(state, model, minutes) {
72
92
  }
73
93
  return { canBuy: true };
74
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
+ }
75
266
  //# sourceMappingURL=autoRefill.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"autoRefill.js","sourceRoot":"","sources":["../../src/ai/autoRefill.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"autoRefill.js","sourceRoot":"","sources":["../../src/ai/autoRefill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,aAAa,CAAA;AAiCpB,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC9B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAA;QACtD,OAAO,MAAyB,CAAA;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAsB;IACzD,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAC3D,MAAM,GAAG,GAAG,GAAG,gBAAgB,MAAM,CAAA;IACrC,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QACpD,IAAI,EAAE,KAAK;KACZ,CAAC,CAAA;IACF,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAA;AACtC,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAAkB,EAClB,OAAe,uBAAuB;IAEtC,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAC3D,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;AACxE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe,gBAAgB;IAC9D,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACnB,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,EAAE,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAA;QACxC,MAAM,GAAG,CAAA;IACX,CAAC;AACH,CAAC;AASD,MAAM,UAAU,aAAa,CAAC,IAA0B;IACtD,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAA;IACtC,MAAM,KAAK,GAAoB;QAC7B,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,QAAQ,EAAE,KAAK;QACpC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,QAAQ,EAAE,OAAO;QAC1C,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,QAAQ,EAAE,UAAU;QACnD,YAAY,EAAE,QAAQ,EAAE,YAAY,IAAI,CAAC;QACzC,WAAW,EAAE,QAAQ,EAAE,WAAW,IAAI,CAAC;QACvC,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,QAAQ,EAAE,aAAa,IAAI,KAAK;QACrE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,YAAY,EAAE,QAAQ,EAAE,YAAY;QACpC,cAAc,EAAE,QAAQ,EAAE,cAAc,IAAI,IAAI;QAChD,SAAS,EAAE,QAAQ,EAAE,SAAS;KAC/B,CAAA;IACD,oBAAoB,CAAC,KAAK,CAAC,CAAA;IAC3B,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAA;IACtC,MAAM,KAAK,GAAoB;QAC7B,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;QACnB,OAAO,EAAE,KAAK;KACf,CAAA;IACD,oBAAoB,CAAC,KAAK,CAAC,CAAA;IAC3B,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAA6B;IAC3D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IACzD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAA;AAClE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,KAA6B,EAC7B,KAAa,EACb,OAAe;IAEf,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QAC7B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAA;IACjE,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QACzC,OAAO;YACL,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,4BAA4B,KAAK,CAAC,KAAK,SAAS,KAAK,GAAG;SACjE,CAAA;IACH,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;QAC/C,OAAO;YACL,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,4BAA4B,KAAK,CAAC,OAAO,sBAAsB,OAAO,GAAG;SAClF,CAAA;IACH,CAAC;IACD,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IACrC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,GAAG,OAAO,EAAE,CAAC;QACxC,OAAO;YACL,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,iCAAiC,MAAM,aAAa;SAC7D,CAAA;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;AACzB,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;AA+B/C,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAoB;IAEpB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,IAAI,mBAAmB,CAAA;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,IAAI,oBAAoB,CAAA;IACrD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,IAAI,qBAAqB,CAAA;IACxD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAA;IAE9C,MAAM,eAAe,GAAG,CACtB,OAAwB,EACxB,MAAc,EACd,KAA4F,EAC1E,EAAE;QACpB,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;QACtC,MAAM,IAAI,GAAoB;YAC5B,GAAG,OAAO;YACV,OAAO,EAAE,KAAK;YACd,SAAS,EAAE;gBACT,MAAM,EAAE,UAAU;gBAClB,MAAM;gBACN,EAAE;gBACF,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,IAAI;gBACzB,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,WAAW;aACrC;SACF,CAAA;QACD,KAAK,CAAC,IAAI,CAAC,CAAA;QACX,MAAM,CAAC;YACL,MAAM,EAAE,UAAU;YAClB,MAAM;YACN,EAAE;YACF,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;YAChC,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,IAAI;YACzB,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,IAAI;YACnC,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI;YAC5C,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,WAAW;SACrC,CAAC,CAAA;QACF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IACpD,CAAC,CAAA;IAED,MAAM,KAAK,GAAG,IAAI,EAAE,CAAA;IACpB,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;IAEvD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;IACzB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAA;IAC7B,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACvC,OAAO,eAAe,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAA;IACpD,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IACrC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,GAAG,OAAO,EAAE,CAAC;QACxC,OAAO,eAAe,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAA;IACnD,CAAC;IAED,IAAI,MAAe,CAAA;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;IAC7C,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,wBAAwB,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,EAAE,CAAA;IACrF,CAAC;IACD,IAAI,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;IAErC,MAAM,KAAK,GAAG,IAAI,EAAE,CAAA;IACpB,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;IACvD,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAC3C,IACE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YACrB,GAAG,GAAG,IAAI,GAAG,kBAAkB,EAC/B,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,+CAA+C,EAAE,CAAA;QACvF,CAAC;IACH,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAA;IAC9B,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAA;IAClC,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QACtD,OAAO,eAAe,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAA;IACpD,CAAC;IACD,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IAC1C,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,GAAG,YAAY,EAAE,CAAC;QACvD,OAAO,eAAe,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAA;IACnD,CAAC;IAED,IAAI,MAAuB,CAAA;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC;YACtB,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,YAAY;YACrB,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,KAAK;SAC5C,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,oBAAoB,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,EAAE,CAAA;IACjF,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACpC,OAAO,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,iBAAiB,EAAE;YAC/D,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI;YACnC,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAA;IAChC,MAAM,IAAI,GAAoB;QAC5B,GAAG,KAAK;QACR,YAAY,EAAE,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,YAAY;QACtD,WAAW,EAAE,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,CAAC;QACzC,YAAY,EAAE,EAAE;QAChB,cAAc,EAAE,IAAI;QACpB,SAAS,EAAE;YACT,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,IAAI;YACZ,EAAE;YACF,IAAI;YACJ,MAAM,EAAE,WAAW;SACpB;KACF,CAAA;IACD,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;IACxC,IAAI,SAAS,GAAG,KAAK,CAAA;IACrB,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,GAAG,YAAY,EAAE,CAAC;QACrD,SAAS,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,IAAI,CAAC,SAAS,GAAG;YACf,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,kBAAkB;YAC1B,EAAE;YACF,IAAI;YACJ,MAAM,EAAE,WAAW;SACpB,CAAA;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,CAAA;IACX,MAAM,CAAC;QACL,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,IAAI;QACZ,EAAE;QACF,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,YAAY;QACrB,IAAI;QACJ,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI;QACnC,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,IAAI;QAC1C,MAAM,EAAE,WAAW;KACpB,CAAC,CAAA;IACF,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC;YACL,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,kBAAkB;YAC1B,EAAE;YACF,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,YAAY;YACrB,IAAI;YACJ,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI;YACnC,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,IAAI;YAC1C,MAAM,EAAE,WAAW;SACpB,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AAC5C,CAAC;AAOD,MAAM,UAAU,mBAAmB,CAAC,IAAuB;IACzD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAA;IACpF,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;QACrC,IAAI,OAAO;YAAE,OAAM;QACnB,OAAO,GAAG,IAAI,CAAA;QACd,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAA;YACzC,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;gBAAE,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAA;QACtD,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC5E,CAAC;gBAAS,CAAC;YACT,OAAO,GAAG,KAAK,CAAA;QACjB,CAAC;IACH,CAAC,CAAA;IACD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,EAAE,UAAU,CAAC,CAAA;IACxD,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU;QAAE,KAAK,CAAC,KAAK,EAAE,CAAA;IACpD,KAAK,IAAI,EAAE,CAAA;IACX,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;AACnC,CAAC"}
@@ -2,6 +2,7 @@ export declare const DEFAULT_BACKEND_URL = "https://api.paytaca.ai";
2
2
  export declare const LIFT_TOKEN_ID = "5932b2fd4915d6a75d3ec53282cd49118149a2176ee67ed68b1111ff0786f7fc";
3
3
  export declare const PAYTACA_DIR: string;
4
4
  export declare const AUTO_REFILL_FILE: string;
5
+ export declare const AUTO_REFILL_EVENTS_FILE: string;
5
6
  export declare function resolveBackendUrl(explicit?: string): string;
6
7
  export declare function apiUrl(baseUrl: string, apiPath: string): string;
7
8
  //# sourceMappingURL=config.d.ts.map
@@ -1 +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;AAE1E,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"}
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"}
package/dist/ai/config.js CHANGED
@@ -4,6 +4,7 @@ export const DEFAULT_BACKEND_URL = 'https://api.paytaca.ai';
4
4
  export const LIFT_TOKEN_ID = '5932b2fd4915d6a75d3ec53282cd49118149a2176ee67ed68b1111ff0786f7fc';
5
5
  export const PAYTACA_DIR = path.join(os.homedir(), '.paytaca');
6
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');
7
8
  export function resolveBackendUrl(explicit) {
8
9
  const url = explicit || process.env.PAYTACA_BACKEND_URL || DEFAULT_BACKEND_URL;
9
10
  return url.replace(/\/+$/, '');
@@ -1 +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;AAE1E,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"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"credits.d.ts","sourceRoot":"","sources":["../../src/ai/credits.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,aAAa,EACnB,MAAM,aAAa,CAAA;AAEpB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EACD,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,aAAa,CAAC,GAAG;IAC3C,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B,CAAC,GACF,IAAI,GACJ,SAAS,GACZ,YAAY,GAAG,IAAI,CAgBrB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,MAAM,EAAE,OAAO,CAAA;IACf,oBAAoB,EAAE,MAAM,CAAA;IAC5B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,EAAE,CAGjE;AASD,wBAAgB,WAAW,CACzB,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,aAAa,GAAG,IAAI,CAmBtB;AAUD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,GAAG,IAAI,EAC3B,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAOT;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAWvD;AAcD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,cAAc,CAMhB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,EAAE,CAE1E;AAED,OAAO,EAAE,eAAe,EAAE,CAAA"}
1
+ {"version":3,"file":"credits.d.ts","sourceRoot":"","sources":["../../src/ai/credits.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,aAAa,EACnB,MAAM,aAAa,CAAA;AAEpB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EACD,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,aAAa,CAAC,GAAG;IAC3C,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B,CAAC,GACF,IAAI,GACJ,SAAS,GACZ,YAAY,GAAG,IAAI,CAgBrB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,MAAM,EAAE,OAAO,CAAA;IACf,oBAAoB,EAAE,MAAM,CAAA;IAC5B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,EAAE,CAGjE;AAsBD,wBAAgB,WAAW,CACzB,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,aAAa,GAAG,IAAI,CAUtB;AASD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,GAAG,IAAI,EAC3B,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAOT;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAWvD;AAcD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,cAAc,CAMhB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,EAAE,CAE1E;AAED,OAAO,EAAE,eAAe,EAAE,CAAA"}
@@ -23,11 +23,25 @@ export function getSessions(status) {
23
23
  return status.sessions;
24
24
  return [status];
25
25
  }
26
+ function normalizeModelId(value) {
27
+ return value.trim().toLowerCase().replace(/^paytaca-ai\//, '');
28
+ }
29
+ function modelIdsMatch(candidate, query) {
30
+ if (!candidate || !query)
31
+ return false;
32
+ if (candidate === query)
33
+ return true;
34
+ const candidateTail = candidate.slice(candidate.lastIndexOf('/') + 1);
35
+ const queryTail = query.slice(query.lastIndexOf('/') + 1);
36
+ return candidateTail.length > 0 && candidateTail === queryTail;
37
+ }
26
38
  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);
39
+ const q = normalizeModelId(modelId);
40
+ const id = normalizeModelId(String(session.model_id || session.ai_model || ''));
41
+ if (modelIdsMatch(id, q))
42
+ return true;
43
+ const name = normalizeModelId(String(session.display_name || ''));
44
+ return name !== '' && name === q;
31
45
  }
32
46
  export function findSession(status, modelId) {
33
47
  const sessions = getSessions(status).filter(Boolean);
@@ -38,15 +52,10 @@ export function findSession(status, modelId) {
38
52
  if (match)
39
53
  return match;
40
54
  }
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);
55
+ return sessions.find(sessionActive) || sessions[0] || null;
46
56
  }
47
57
  function sessionActive(session) {
48
- return (session.model_active === true ||
49
- session.session_active === true ||
58
+ return (session.session_active === true ||
50
59
  (session.time_remaining_seconds ?? 0) > 0);
51
60
  }
52
61
  export function hasActiveCredits(status, modelId) {
@@ -1 +1 @@
1
- {"version":3,"file":"credits.js","sourceRoot":"","sources":["../../src/ai/credits.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"credits.js","sourceRoot":"","sources":["../../src/ai/credits.ts"],"names":[],"mappings":"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"}