paytaca-cli 0.7.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +72 -6
  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 +638 -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
@@ -4,7 +4,7 @@ A command-line interface for the Paytaca [Bitcoin Cash](https://bitcoincash.org)
4
4
 
5
5
  Bitcoin Cash is peer-to-peer electronic cash, enabling fast, low-fee transactions for everyday use. Paytaca CLI brings the full capabilities of the Paytaca wallet to the terminal — create wallets, derive addresses, send and receive BCH, manage CashTokens (fungible tokens and NFTs), swap tokens on the Cauldron DEX, pay x402 HTTP APIs, chat over Nostr, and view transaction history, all from the command line.
6
6
 
7
- Designed to be AI agent-friendly and useful for automation by power users. It ships an MCP server and a one-step installer for the Paytaca AI provider.
7
+ Designed to be AI agent-friendly and useful for automation by power users. It ships an MCP server, a one-step installer for the Paytaca AI provider, and a local web UI (`paytaca web`).
8
8
 
9
9
  ## Requirements
10
10
 
@@ -36,11 +36,15 @@ Most commands accept `--json` for machine-readable output and `--chipnet` to tar
36
36
  ```bash
37
37
  paytaca wallet create # Generate a new 12-word seed phrase
38
38
  paytaca wallet create --chipnet # Create on chipnet (testnet)
39
- paytaca wallet import # Import an existing seed phrase
39
+ paytaca wallet import # Import a seed phrase (12/15/18/21/24 words)
40
40
  paytaca wallet info # Show wallet hash, address, and balance
41
41
  paytaca wallet export # Display the stored seed phrase (interactive terminal + biometrics)
42
42
  ```
43
43
 
44
+ > `wallet import` accepts 12/15/18/21/24-word phrases separated by spaces or
45
+ > commas. Unknown words are rejected with the closest BIP39 suggestion, and the
46
+ > checksum is validated before the wallet is stored.
47
+
44
48
  > `wallet export` requires an interactive terminal and prompts for biometric
45
49
  > authentication (Touch ID, fingerprint, or Windows Hello) when available. It
46
50
  > cannot be used from scripts, pipes, or other non-interactive processes.
@@ -155,6 +159,16 @@ paytaca pay https://api.example.com/v1/complete --method POST --body '{"prompt":
155
159
  # → Handles 402 → pays → returns response
156
160
  ```
157
161
 
162
+ ### Update
163
+
164
+ ```bash
165
+ paytaca update # Update paytaca-cli to the latest version on npm
166
+ paytaca update --check # Only check for updates; do not install
167
+ paytaca update --registry <url> # Override the npm registry URL
168
+ ```
169
+
170
+ 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.
171
+
158
172
  ### Paytaca AI
159
173
 
160
174
  Paytaca AI is a pay-as-you-go model gateway paid with BCH or LIFT via x402. Manage it from the CLI:
@@ -170,11 +184,32 @@ paytaca ai balance # BCH + LIFT funds available for purchases
170
184
  paytaca ai purchase --model <id> --minutes <n> # Buy a plan
171
185
  paytaca ai purchase --model <id> --minutes 60 --lift # Pay with LIFT (discount)
172
186
  paytaca ai auto-refill --enable --model <id> --minutes <n> --max-minutes <n>
173
- paytaca ai auto-refill --status # Inspect; also --disable
187
+ paytaca ai auto-refill --status # Inspect; also --disable, --delete
174
188
  ```
175
189
 
176
190
  `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
191
 
192
+ Armed auto-refill state lives at `~/.paytaca/auto-refill.json`. Arming performs one immediate check (buying right away if the armed model has no credits), and the `paytaca mcp` server keeps a background backstop (every 60s) while a session is running. The `get_credits` MCP tool is read-only and never triggers a purchase. 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).
193
+
194
+ ### Image Generation
195
+
196
+ Generate images with AI models, paid in BCH on-chain:
197
+
198
+ ```bash
199
+ paytaca ai image models # List available image models
200
+ paytaca ai image generate "a green phoenix" # Generate an image from a prompt
201
+ paytaca ai image generate "prompt" --model <id> # Specify model (defaults to cheapest)
202
+ paytaca ai image generate "prompt" --aspect-ratio 16:9 # Aspect ratio (default: 1:1)
203
+ paytaca ai image generate "prompt" --quality high # Quality: low, medium, high, auto
204
+ paytaca ai image generate "prompt" --resolution 2K # Resolution: 512, 1K, 2K, 4K
205
+ paytaca ai image generate "prompt" --yes # Skip confirmation prompt
206
+ paytaca ai image history # Show order history
207
+ paytaca ai image history --page 2 # Paginate history
208
+ paytaca ai image status <order-id> # Poll a pending generation order
209
+ ```
210
+
211
+ 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.
212
+
178
213
  ### MCP Server
179
214
 
180
215
  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 +236,9 @@ paytaca ai configure opencode --api-key sk-pytc-… # read-only wallet
201
236
 
202
237
  Read-only wallets report credits from the shared wallet hash but can't buy plans — fund credits from the full wallet.
203
238
 
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`).
239
+ **MCP tools:** wallet (`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
240
 
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.
241
+ 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
242
 
208
243
  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
244
 
@@ -240,6 +275,27 @@ paytaca chat remove-display-name # Remove published name
240
275
  paytaca chat remove-bch-address # Remove published address
241
276
  ```
242
277
 
278
+ ### Web UI
279
+
280
+ Launch a local browser UI for the wallet, Cauldron swaps, and Paytaca AI:
281
+
282
+ ```bash
283
+ paytaca web # Serve on http://127.0.0.1:7474 and open the browser
284
+ paytaca web --port 8080 # Use a custom port
285
+ paytaca web --chipnet # Mainnet by default; --chipnet targets testnet
286
+ paytaca web --backend <url> # Override the Paytaca AI backend URL
287
+ paytaca web --no-open # Do not auto-open the browser
288
+ ```
289
+
290
+ The server binds to `127.0.0.1` only. Access is gated by a random per-session token sent in the `X-Paytaca-Token` header; the browser is auto-opened with a session link that carries the token, and the page strips it from the address bar after loading. With `--no-open`, use the printed URL alongside the session link to open it manually.
291
+
292
+ The UI is organized into two tabs:
293
+
294
+ - **Wallet** — send and receive BCH, send CashTokens, swap on the Cauldron DEX, and review transaction history (date, type, counterparty, amount, USD value, fee, and explorer links), with token-category selection in the send and swap forms.
295
+ - **AI** — buy plans (BCH or a live LIFT quote), manage auto-refill (enable / pause / delete, with budget-cap validation), and browse generated images (gallery with lightbox, order history, and delete).
296
+
297
+ Incoming transactions are streamed live over a Watchtower WebSocket and surface as in-page notifications; a light/dark theme toggle is persisted in the browser.
298
+
243
299
  ## Network
244
300
 
245
301
  All commands default to **mainnet**. Pass `--chipnet` for testnet:
@@ -262,6 +318,8 @@ Powered by [@napi-rs/keyring](https://github.com/Brooooooklyn/keyring-node) (pre
262
318
 
263
319
  Nostr chat keys are **not** persisted — they are re-derived from the wallet mnemonic at runtime via HD path `m/44'/1237'/0'/0/0` and held only in memory for the duration of a session. Non-secret chat metadata (contacts, rooms, messages) is written to `~/.paytaca/chat-state.json` with mode `0600`; no key material is ever written there.
264
320
 
321
+ The `paytaca web` server listens on `127.0.0.1` only and requires a random per-session token in the `X-Paytaca-Token` header; requests whose `Host` header is not `127.0.0.1`/`localhost` are rejected, request bodies are capped at 1 MB, and internal error details are logged to stderr rather than returned to the client.
322
+
265
323
  ## Architecture
266
324
 
267
325
  ```
@@ -277,15 +335,21 @@ src/
277
335
  swap.ts Cauldron DEX swaps (sell/buy with --action)
278
336
  pay.ts x402 BCH payment handler for HTTP requests
279
337
  check.ts Check if URL requires x402 payment
280
- ai.ts Paytaca AI (configure, api-key, models, plans, credits, purchase, auto-refill)
338
+ ai.ts Paytaca AI (configure, api-key, models, plans, credits, purchase, auto-refill, image)
281
339
  chat.ts Nostr chat (contacts, conversations, identity, listen)
340
+ web.ts `paytaca web` — local browser UI launcher
282
341
  mcp.ts `paytaca mcp` stdio entry + per-harness config templates
342
+ update.ts Self-update from npm registry
283
343
  core/
284
344
  context.ts Wallet context resolution (keychain + network), embed-safe
285
345
  wallet.ts Render-agnostic wallet ops shared by CLI and MCP tools
286
346
  mcp/
287
347
  server.ts MCP server construction and stdio lifecycle
288
348
  tools.ts MCP tool registration (wallet reads, send, Paytaca AI)
349
+ web/
350
+ server.ts Local HTTP server (token auth, JSON API routes)
351
+ page.ts Self-contained Alpine.js UI (wallet, swap, AI tabs)
352
+ assets.ts Inline asset loading (vendored Alpine.js, styles)
289
353
  wallet/
290
354
  index.ts Wallet class, mnemonic gen/import/load
291
355
  bch.ts BchWallet (balance, send, history, CashTokens)
@@ -312,6 +376,7 @@ src/
312
376
  oauth.ts BCH OAuth challenge -> access token -> API key
313
377
  models.ts Model catalogue, plan tiers, price/duration helpers
314
378
  credits.ts Credit session lookup and summaries
379
+ images.ts Image generation client, order orchestration, polling
315
380
  purchase.ts Plan purchase via x402 (BCH or LIFT)
316
381
  autoRefill.ts Auto-refill state and orchestration
317
382
  configure.ts Harness setup (MCP + Paytaca AI provider + credits offer)
@@ -331,6 +396,7 @@ src/
331
396
  | `@cashlab/cauldron` | Cauldron DEX swap building |
332
397
  | `@napi-rs/keyring` | OS-native keychain storage |
333
398
  | `@modelcontextprotocol/sdk` | MCP server (stdio) |
399
+ | `alpinejs` | Reactive web UI (`paytaca web`), vendored inline |
334
400
  | `bip39` | Mnemonic generation and validation |
335
401
  | `nostr-tools` | Nostr chat events, keys, and relay transport |
336
402
  | `js-sha256` | Hashing for key derivation and payment headers |
@@ -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":"AAOA,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,CAAA;AAE1C,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,UAAU,GAAG,UAAU,CAAA;IAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAA;CAC/B;AAED,MAAM,WAAW,WAAY,SAAQ,eAAe;IAClD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,aAAa,EAAE,aAAa,GAAG,IAAI,CAAA;CACpC;AAED,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,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,SAAS,CAAC,EAAE,eAAe,CAAA;CAC5B;AAED,wBAAgB,mBAAmB,IAAI,eAAe,GAAG,IAAI,CAS5D;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAOjE;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,WAAW,EAClB,IAAI,GAAE,MAAgC,GACrC,IAAI,CAGN;AAED,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,MAAyB,GAAG,OAAO,CAQzE;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,CAiBzE;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;AAED,eAAO,MAAM,kBAAkB,QAAgB,CAAA;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,aAAa,CAAA;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACrD,GAAG,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,OAAO,CAAC,eAAe,CAAC,CAAA;IACzD,SAAS,CAAC,EAAE,MAAM,eAAe,GAAG,IAAI,CAAA;IACxC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAA;IAC7C,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAA;IAC1C,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAClB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,GAC9C;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,CAAA;AAElE,wBAAsB,cAAc,CAClC,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAyJ3B;AAED,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAA;CAC7C;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,IAAI,CAmBvE"}
@@ -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":"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"}
@@ -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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"}