paytaca-cli 0.7.0 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -6
- package/dist/ai/autoRefill.d.ts +58 -0
- package/dist/ai/autoRefill.d.ts.map +1 -1
- package/dist/ai/autoRefill.js +193 -2
- package/dist/ai/autoRefill.js.map +1 -1
- package/dist/ai/config.d.ts +1 -0
- package/dist/ai/config.d.ts.map +1 -1
- package/dist/ai/config.js +1 -0
- package/dist/ai/config.js.map +1 -1
- package/dist/ai/credits.d.ts.map +1 -1
- package/dist/ai/credits.js +20 -11
- package/dist/ai/credits.js.map +1 -1
- package/dist/ai/images.d.ts +128 -0
- package/dist/ai/images.d.ts.map +1 -0
- package/dist/ai/images.js +399 -0
- package/dist/ai/images.js.map +1 -0
- package/dist/commands/ai.d.ts.map +1 -1
- package/dist/commands/ai.js +283 -7
- package/dist/commands/ai.js.map +1 -1
- package/dist/commands/update.d.ts +32 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +200 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/wallet.js +1 -1
- package/dist/commands/wallet.js.map +1 -1
- package/dist/commands/web.d.ts +3 -0
- package/dist/commands/web.d.ts.map +1 -0
- package/dist/commands/web.js +71 -0
- package/dist/commands/web.js.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +29 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts +2 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +288 -9
- package/dist/mcp/tools.js.map +1 -1
- package/dist/wallet/cauldron/swap.d.ts +15 -0
- package/dist/wallet/cauldron/swap.d.ts.map +1 -1
- package/dist/wallet/cauldron/swap.js +31 -0
- package/dist/wallet/cauldron/swap.js.map +1 -1
- package/dist/wallet/index.d.ts +16 -1
- package/dist/wallet/index.d.ts.map +1 -1
- package/dist/wallet/index.js +74 -8
- package/dist/wallet/index.js.map +1 -1
- package/dist/web/assets.d.ts +3 -0
- package/dist/web/assets.d.ts.map +1 -0
- package/dist/web/assets.js +3 -0
- package/dist/web/assets.js.map +1 -0
- package/dist/web/page.d.ts +2 -0
- package/dist/web/page.d.ts.map +1 -0
- package/dist/web/page.js +638 -0
- package/dist/web/page.js.map +1 -0
- package/dist/web/server.d.ts +79 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +665 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +2 -1
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
|
|
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
|
|
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
|
|
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 |
|
package/dist/ai/autoRefill.d.ts
CHANGED
|
@@ -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":"
|
|
1
|
+
{"version":3,"file":"autoRefill.d.ts","sourceRoot":"","sources":["../../src/ai/autoRefill.ts"],"names":[],"mappings":"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"}
|
package/dist/ai/autoRefill.js
CHANGED
|
@@ -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
|
-
|
|
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":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,
|
|
1
|
+
{"version":3,"file":"autoRefill.js","sourceRoot":"","sources":["../../src/ai/autoRefill.ts"],"names":[],"mappings":"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"}
|
package/dist/ai/config.d.ts
CHANGED
|
@@ -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
|
package/dist/ai/config.d.ts.map
CHANGED
|
@@ -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;
|
|
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(/\/+$/, '');
|
package/dist/ai/config.js.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/ai/credits.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/ai/credits.js
CHANGED
|
@@ -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
|
|
28
|
-
const id = String(session.model_id || session.ai_model || '')
|
|
29
|
-
|
|
30
|
-
|
|
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
|
|
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.
|
|
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) {
|
package/dist/ai/credits.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credits.js","sourceRoot":"","sources":["../../src/ai/credits.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,GAIhB,MAAM,aAAa,CAAA;AASpB,MAAM,UAAU,iBAAiB,CAC/B,KAKa;IAEb,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,OAAO,IAAI,CAAA;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAA;IACvE,MAAM,MAAM,GAAG,KAAK;SACjB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;SACpC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;IACxD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACpC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IACzC,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,EAAE,CAAA;IAC3C,MAAM,OAAO,GAAG,+BAA+B,KAAK,CAAC,EAAE,cAAc,OAAO,EAAE,CAAA;IAC9E,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,EAAE;QACf,OAAO;QACP,OAAO;QACP,OAAO,EAAE,iBAAiB,IAAI,kDAAkD,OAAO,gDAAgD;KACxI,CAAA;AACH,CAAC;AAYD,MAAM,UAAU,WAAW,CAAC,MAAoB;IAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAA;IAC1D,OAAO,CAAC,MAAM,CAAC,CAAA;AACjB,CAAC;AAED,SAAS,
|
|
1
|
+
{"version":3,"file":"credits.js","sourceRoot":"","sources":["../../src/ai/credits.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,GAIhB,MAAM,aAAa,CAAA;AASpB,MAAM,UAAU,iBAAiB,CAC/B,KAKa;IAEb,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,OAAO,IAAI,CAAA;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAA;IACvE,MAAM,MAAM,GAAG,KAAK;SACjB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;SACpC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;IACxD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACpC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IACzC,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,EAAE,CAAA;IAC3C,MAAM,OAAO,GAAG,+BAA+B,KAAK,CAAC,EAAE,cAAc,OAAO,EAAE,CAAA;IAC9E,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,EAAE;QACf,OAAO;QACP,OAAO;QACP,OAAO,EAAE,iBAAiB,IAAI,kDAAkD,OAAO,gDAAgD;KACxI,CAAA;AACH,CAAC;AAYD,MAAM,UAAU,WAAW,CAAC,MAAoB;IAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAA;IAC1D,OAAO,CAAC,MAAM,CAAC,CAAA;AACjB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAA;AAChE,CAAC;AAED,SAAS,aAAa,CAAC,SAAiB,EAAE,KAAa;IACrD,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IACtC,IAAI,SAAS,KAAK,KAAK;QAAE,OAAO,IAAI,CAAA;IACpC,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IACrE,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IACzD,OAAO,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,KAAK,SAAS,CAAA;AAChE,CAAC;AAED,SAAS,cAAc,CAAC,OAAsB,EAAE,OAAe;IAC7D,MAAM,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IACnC,MAAM,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAA;IAC/E,IAAI,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IACrC,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAA;IACjE,OAAO,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,CAAC,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,MAAoB,EACpB,OAAgB;IAEhB,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACpD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAEtC,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;QAC9D,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;IACzB,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;AAC5D,CAAC;AAED,SAAS,aAAa,CAAC,OAAsB;IAC3C,OAAO,CACL,OAAO,CAAC,cAAc,KAAK,IAAI;QAC/B,CAAC,OAAO,CAAC,sBAAsB,IAAI,CAAC,CAAC,GAAG,CAAC,CAC1C,CAAA;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,MAA2B,EAC3B,OAAgB;IAEhB,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACzB,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACpD,MAAM,UAAU,GAAG,OAAO;QACxB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACpD,CAAC,CAAC,QAAQ,CAAA;IACZ,OAAO,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACjC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAA;IAClC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IACzC,MAAM,CAAC,GAAG,KAAK,GAAG,EAAE,CAAA;IACpB,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,CAAC,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC9B,IAAI,CAAC,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACzC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAA;AAChC,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAsB;IAC9C,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,IAAI,IAAI;QACrD,WAAW,EAAE,OAAO,CAAC,YAAY,IAAI,IAAI;QACzC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC;QAC9B,oBAAoB,EAAE,OAAO,CAAC,sBAAsB,IAAI,CAAC;QACzD,kBAAkB,EAAE,OAAO,CAAC,oBAAoB,IAAI,CAAC;QACrD,eAAe,EAAE,OAAO,CAAC,iBAAiB,IAAI,CAAC;QAC/C,UAAU,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;KACxC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,MAAoB,EACpB,OAAgB;IAEhB,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC5C,OAAO;QACL,GAAG,gBAAgB,CAAC,OAAO,IAAK,EAAoB,CAAC;QACrD,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC;KAC1C,CAAA;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAoB;IACtD,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;AAClE,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,CAAA"}
|