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.
- package/README.md +37 -4
- 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 +637 -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
|
@@ -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)
|
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"}
|