@blockrun/clawrouter 0.12.255 → 0.12.257
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/dist/cli.js +973 -614
- package/dist/index.d.ts +235 -113
- package/dist/index.js +959 -600
- package/docs/configuration.md +81 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { RoutingConfig, RoutingDecision } from '@blockrun/router-core';
|
|
2
2
|
export { DEFAULT_ROUTING_CONFIG, RouterOptions, RoutingConfig, RoutingDecision, TaskType, Tier, calculateModelCost, filterCandidatesByCapacity, getFallbackChain, getFallbackChainFiltered, inferToolRequirement, route } from '@blockrun/router-core';
|
|
3
|
+
import { x402Client } from '@x402/fetch';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* OpenClaw Plugin Types (locally defined)
|
|
@@ -588,6 +589,234 @@ declare class SolanaBalanceMonitor {
|
|
|
588
589
|
private buildInfo;
|
|
589
590
|
}
|
|
590
591
|
|
|
592
|
+
/**
|
|
593
|
+
* Spend Control - Time-windowed spending limits and counterparty policy
|
|
594
|
+
*
|
|
595
|
+
* Absorbed from @blockrun/clawwallet. Chain-agnostic (works for both EVM and Solana).
|
|
596
|
+
*
|
|
597
|
+
* Features:
|
|
598
|
+
* - Per-request limits (e.g., max $0.10 per call)
|
|
599
|
+
* - Hourly limits (e.g., max $3.00 per hour)
|
|
600
|
+
* - Daily limits (e.g., max $20.00 per day)
|
|
601
|
+
* - Session limits (e.g., max $5.00 per session)
|
|
602
|
+
* - Rolling windows (last 1h, last 24h)
|
|
603
|
+
* - Counterparty policy: payee allow/deny, network and asset allowlists
|
|
604
|
+
* - Fail-closed enforcement before the signer, via the x402 pre-sign hook
|
|
605
|
+
* - Persistent storage (~/.openclaw/blockrun/spending.json)
|
|
606
|
+
*/
|
|
607
|
+
|
|
608
|
+
type SpendWindow = "perRequest" | "hourly" | "daily" | "session";
|
|
609
|
+
/**
|
|
610
|
+
* Counterparty/network/asset allow-or-deny lists. Default-off: a list only
|
|
611
|
+
* takes effect once configured via setPolicy(). `allowedPayees`/`blockedPayees`
|
|
612
|
+
* are both supported (block always wins if both are set); network and asset
|
|
613
|
+
* are allowlist-only, matching what a caller can realistically enumerate.
|
|
614
|
+
*/
|
|
615
|
+
type PolicyList = "allowedPayees" | "blockedPayees" | "allowedNetworks" | "allowedAssets";
|
|
616
|
+
/** Base mainnet, as carried on x402 `selectedRequirements.network`. */
|
|
617
|
+
declare const CAIP2_BASE = "eip155:8453";
|
|
618
|
+
/** Solana mainnet genesis, as carried on x402 `selectedRequirements.network`. */
|
|
619
|
+
declare const CAIP2_SOLANA_MAINNET = "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d";
|
|
620
|
+
/**
|
|
621
|
+
* A policy list on disk is present but unusable. Thrown rather than swallowed:
|
|
622
|
+
* silently dropping a corrupted allow/deny list would widen what the agent may
|
|
623
|
+
* pay, which is the one direction this file must never fail in. Callers
|
|
624
|
+
* classify on `instanceof`, not on the message text.
|
|
625
|
+
*/
|
|
626
|
+
declare class MalformedSpendPolicyError extends Error {
|
|
627
|
+
constructor(key: string);
|
|
628
|
+
}
|
|
629
|
+
interface SpendLimits {
|
|
630
|
+
perRequest?: number;
|
|
631
|
+
hourly?: number;
|
|
632
|
+
daily?: number;
|
|
633
|
+
session?: number;
|
|
634
|
+
allowedPayees?: string[];
|
|
635
|
+
blockedPayees?: string[];
|
|
636
|
+
/**
|
|
637
|
+
* CAIP-2 identifiers matching x402 `selectedRequirements.network`
|
|
638
|
+
* (e.g. `eip155:8453`, `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d`).
|
|
639
|
+
* Nicknames such as `base` or `solana` do not match and fail closed.
|
|
640
|
+
*/
|
|
641
|
+
allowedNetworks?: string[];
|
|
642
|
+
allowedAssets?: string[];
|
|
643
|
+
}
|
|
644
|
+
/**
|
|
645
|
+
* Counterparty details for a pending payment, passed to check() alongside
|
|
646
|
+
* the estimated cost. EVM `payTo` values matching `0x` + 40 hex are compared
|
|
647
|
+
* case-insensitively; anything else (including Solana base58) is exact-match.
|
|
648
|
+
*/
|
|
649
|
+
interface CounterpartyInfo {
|
|
650
|
+
payTo?: string;
|
|
651
|
+
network?: string;
|
|
652
|
+
asset?: string;
|
|
653
|
+
}
|
|
654
|
+
interface SpendRecord {
|
|
655
|
+
timestamp: number;
|
|
656
|
+
amount: number;
|
|
657
|
+
model?: string;
|
|
658
|
+
action?: string;
|
|
659
|
+
}
|
|
660
|
+
interface SpendingStatus {
|
|
661
|
+
limits: SpendLimits;
|
|
662
|
+
spending: {
|
|
663
|
+
hourly: number;
|
|
664
|
+
daily: number;
|
|
665
|
+
session: number;
|
|
666
|
+
};
|
|
667
|
+
remaining: {
|
|
668
|
+
hourly: number | null;
|
|
669
|
+
daily: number | null;
|
|
670
|
+
session: number | null;
|
|
671
|
+
};
|
|
672
|
+
calls: number;
|
|
673
|
+
}
|
|
674
|
+
interface CheckResult {
|
|
675
|
+
allowed: boolean;
|
|
676
|
+
blockedBy?: SpendWindow;
|
|
677
|
+
blockedByPolicy?: PolicyList;
|
|
678
|
+
remaining?: number;
|
|
679
|
+
reason?: string;
|
|
680
|
+
resetIn?: number;
|
|
681
|
+
}
|
|
682
|
+
interface SpendControlStorage {
|
|
683
|
+
load(): {
|
|
684
|
+
limits: SpendLimits;
|
|
685
|
+
history: SpendRecord[];
|
|
686
|
+
} | null;
|
|
687
|
+
save(data: {
|
|
688
|
+
limits: SpendLimits;
|
|
689
|
+
history: SpendRecord[];
|
|
690
|
+
}): void;
|
|
691
|
+
/**
|
|
692
|
+
* Optional: persist history without touching stored limits. Implement it to
|
|
693
|
+
* keep recorded spend from overwriting an operator's policy edits. Falls
|
|
694
|
+
* back to save() when absent.
|
|
695
|
+
*/
|
|
696
|
+
saveHistory?(history: SpendRecord[]): void;
|
|
697
|
+
}
|
|
698
|
+
declare class FileSpendControlStorage implements SpendControlStorage {
|
|
699
|
+
private readonly spendingFile;
|
|
700
|
+
constructor();
|
|
701
|
+
load(): {
|
|
702
|
+
limits: SpendLimits;
|
|
703
|
+
history: SpendRecord[];
|
|
704
|
+
} | null;
|
|
705
|
+
save(data: {
|
|
706
|
+
limits: SpendLimits;
|
|
707
|
+
history: SpendRecord[];
|
|
708
|
+
}): void;
|
|
709
|
+
/**
|
|
710
|
+
* Persist history while leaving the stored limits exactly as they are on
|
|
711
|
+
* disk. Recording spend must not rewrite policy: the proxy reads limits once
|
|
712
|
+
* at startup, so writing its in-memory copy back on every payment would
|
|
713
|
+
* erase an operator's hand-edit to spending.json seconds after they made it.
|
|
714
|
+
*/
|
|
715
|
+
saveHistory(history: SpendRecord[]): void;
|
|
716
|
+
}
|
|
717
|
+
declare class InMemorySpendControlStorage implements SpendControlStorage {
|
|
718
|
+
private data;
|
|
719
|
+
load(): {
|
|
720
|
+
limits: SpendLimits;
|
|
721
|
+
history: SpendRecord[];
|
|
722
|
+
} | null;
|
|
723
|
+
save(data: {
|
|
724
|
+
limits: SpendLimits;
|
|
725
|
+
history: SpendRecord[];
|
|
726
|
+
}): void;
|
|
727
|
+
}
|
|
728
|
+
interface SpendControlOptions {
|
|
729
|
+
storage?: SpendControlStorage;
|
|
730
|
+
now?: () => number;
|
|
731
|
+
}
|
|
732
|
+
declare class SpendControl {
|
|
733
|
+
private limits;
|
|
734
|
+
private history;
|
|
735
|
+
private sessionSpent;
|
|
736
|
+
private sessionCalls;
|
|
737
|
+
private pending;
|
|
738
|
+
private reservationSeq;
|
|
739
|
+
/** Limits we loaded and have not changed; history-only saves must not clobber operator edits. */
|
|
740
|
+
private limitsDirty;
|
|
741
|
+
/** Set when spending.json held an unusable policy list: refuse every payment. */
|
|
742
|
+
private policyFileBroken?;
|
|
743
|
+
private readonly storage;
|
|
744
|
+
private readonly now;
|
|
745
|
+
constructor(options?: SpendControlOptions);
|
|
746
|
+
setLimit(window: SpendWindow, amount: number): void;
|
|
747
|
+
clearLimit(window: SpendWindow): void;
|
|
748
|
+
setPolicy(list: PolicyList, values: string[]): void;
|
|
749
|
+
clearPolicy(list: PolicyList): void;
|
|
750
|
+
getLimits(): SpendLimits;
|
|
751
|
+
check(estimatedCost: number, counterparty?: CounterpartyInfo): CheckResult;
|
|
752
|
+
record(amount: number, metadata?: {
|
|
753
|
+
model?: string;
|
|
754
|
+
action?: string;
|
|
755
|
+
}): void;
|
|
756
|
+
/** True when any window that this module can compare an amount against is set. */
|
|
757
|
+
hasAmountLimits(): boolean;
|
|
758
|
+
/** True when a window spans more than one request, so reservations matter. */
|
|
759
|
+
hasAggregateLimits(): boolean;
|
|
760
|
+
/**
|
|
761
|
+
* Hold `amount` against the aggregate windows before a payment is signed.
|
|
762
|
+
*
|
|
763
|
+
* Reservations live in memory only and are never persisted: an unsettled
|
|
764
|
+
* reservation is not spend, and writing it to disk is what made a failed
|
|
765
|
+
* signer permanently consume budget. They expire on their own so a caller
|
|
766
|
+
* that never settles or releases (process killed mid-payment, a transport
|
|
767
|
+
* that hangs past the payment timeout) cannot wedge the window shut.
|
|
768
|
+
*/
|
|
769
|
+
reserve(amount: number): string;
|
|
770
|
+
/** Convert a reservation into recorded spend (the payment was signed). */
|
|
771
|
+
settleReservation(id: string, metadata?: {
|
|
772
|
+
model?: string;
|
|
773
|
+
action?: string;
|
|
774
|
+
}): void;
|
|
775
|
+
/** Drop a reservation without recording spend (the payment was never signed). */
|
|
776
|
+
releaseReservation(id: string): void;
|
|
777
|
+
/** Total currently held but not yet settled. */
|
|
778
|
+
private pendingTotal;
|
|
779
|
+
private expireReservations;
|
|
780
|
+
private getSpendingInWindow;
|
|
781
|
+
getSpending(window: "hourly" | "daily" | "session"): number;
|
|
782
|
+
getRemaining(window: "hourly" | "daily" | "session"): number | null;
|
|
783
|
+
getStatus(): SpendingStatus;
|
|
784
|
+
getHistory(limit?: number): SpendRecord[];
|
|
785
|
+
resetSession(): void;
|
|
786
|
+
private cleanup;
|
|
787
|
+
private save;
|
|
788
|
+
private load;
|
|
789
|
+
}
|
|
790
|
+
/**
|
|
791
|
+
* Thrown from the pre-sign hook when policy or an amount window refuses.
|
|
792
|
+
*
|
|
793
|
+
* A deliberate refusal must never be mistaken for a transient upstream fault:
|
|
794
|
+
* the proxy's fallback loop retries provider errors across every paid model
|
|
795
|
+
* and then silently lands on a free one, which would hide the denial from the
|
|
796
|
+
* caller entirely. Callers classify on `instanceof` (see `proxy.ts`), so the
|
|
797
|
+
* message text is free to change. It keeps the `Payment creation aborted:`
|
|
798
|
+
* prefix that `@x402/core` uses for its own aborts so existing log greps and
|
|
799
|
+
* error matchers still see a familiar string.
|
|
800
|
+
*/
|
|
801
|
+
declare class SpendPolicyError extends Error {
|
|
802
|
+
readonly blockedBy?: SpendWindow;
|
|
803
|
+
readonly blockedByPolicy?: PolicyList;
|
|
804
|
+
constructor(reason: string, blocked?: {
|
|
805
|
+
blockedBy?: SpendWindow;
|
|
806
|
+
blockedByPolicy?: PolicyList;
|
|
807
|
+
});
|
|
808
|
+
}
|
|
809
|
+
/**
|
|
810
|
+
* Register the fail-closed spend-policy hook on an x402 client.
|
|
811
|
+
*
|
|
812
|
+
* Reservations are keyed on the `selectedRequirements` object, which
|
|
813
|
+
* `@x402/core` passes by reference to the before / after / failure hooks of
|
|
814
|
+
* the same `createPaymentPayload` call, so concurrent payments never settle
|
|
815
|
+
* each other's reservation.
|
|
816
|
+
*/
|
|
817
|
+
declare function registerSpendPolicyHook(x402: x402Client, control: SpendControl): void;
|
|
818
|
+
declare function formatDuration(seconds: number): string;
|
|
819
|
+
|
|
591
820
|
/**
|
|
592
821
|
* Session Persistence Store
|
|
593
822
|
*
|
|
@@ -845,6 +1074,11 @@ type ProxyOptions = {
|
|
|
845
1074
|
onLowBalance?: (info: LowBalanceInfo) => void;
|
|
846
1075
|
/** Called when balance is insufficient for a request (request fails) */
|
|
847
1076
|
onInsufficientFunds?: (info: InsufficientFundsInfo) => void;
|
|
1077
|
+
/**
|
|
1078
|
+
* Spend / counterparty policy. Default: FileSpendControlStorage at
|
|
1079
|
+
* ~/.openclaw/blockrun/spending.json. Inject in tests.
|
|
1080
|
+
*/
|
|
1081
|
+
spendControl?: SpendControl;
|
|
848
1082
|
/**
|
|
849
1083
|
* Upstream proxy URL for all outgoing requests.
|
|
850
1084
|
* Supports http://, https://, and socks5:// schemes.
|
|
@@ -1090,118 +1324,6 @@ declare class RequestDeduplicator {
|
|
|
1090
1324
|
private prune;
|
|
1091
1325
|
}
|
|
1092
1326
|
|
|
1093
|
-
/**
|
|
1094
|
-
* Spend Control - Time-windowed spending limits
|
|
1095
|
-
*
|
|
1096
|
-
* Absorbed from @blockrun/clawwallet. Chain-agnostic (works for both EVM and Solana).
|
|
1097
|
-
*
|
|
1098
|
-
* Features:
|
|
1099
|
-
* - Per-request limits (e.g., max $0.10 per call)
|
|
1100
|
-
* - Hourly limits (e.g., max $3.00 per hour)
|
|
1101
|
-
* - Daily limits (e.g., max $20.00 per day)
|
|
1102
|
-
* - Session limits (e.g., max $5.00 per session)
|
|
1103
|
-
* - Rolling windows (last 1h, last 24h)
|
|
1104
|
-
* - Persistent storage (~/.openclaw/blockrun/spending.json)
|
|
1105
|
-
*/
|
|
1106
|
-
type SpendWindow = "perRequest" | "hourly" | "daily" | "session";
|
|
1107
|
-
interface SpendLimits {
|
|
1108
|
-
perRequest?: number;
|
|
1109
|
-
hourly?: number;
|
|
1110
|
-
daily?: number;
|
|
1111
|
-
session?: number;
|
|
1112
|
-
}
|
|
1113
|
-
interface SpendRecord {
|
|
1114
|
-
timestamp: number;
|
|
1115
|
-
amount: number;
|
|
1116
|
-
model?: string;
|
|
1117
|
-
action?: string;
|
|
1118
|
-
}
|
|
1119
|
-
interface SpendingStatus {
|
|
1120
|
-
limits: SpendLimits;
|
|
1121
|
-
spending: {
|
|
1122
|
-
hourly: number;
|
|
1123
|
-
daily: number;
|
|
1124
|
-
session: number;
|
|
1125
|
-
};
|
|
1126
|
-
remaining: {
|
|
1127
|
-
hourly: number | null;
|
|
1128
|
-
daily: number | null;
|
|
1129
|
-
session: number | null;
|
|
1130
|
-
};
|
|
1131
|
-
calls: number;
|
|
1132
|
-
}
|
|
1133
|
-
interface CheckResult {
|
|
1134
|
-
allowed: boolean;
|
|
1135
|
-
blockedBy?: SpendWindow;
|
|
1136
|
-
remaining?: number;
|
|
1137
|
-
reason?: string;
|
|
1138
|
-
resetIn?: number;
|
|
1139
|
-
}
|
|
1140
|
-
interface SpendControlStorage {
|
|
1141
|
-
load(): {
|
|
1142
|
-
limits: SpendLimits;
|
|
1143
|
-
history: SpendRecord[];
|
|
1144
|
-
} | null;
|
|
1145
|
-
save(data: {
|
|
1146
|
-
limits: SpendLimits;
|
|
1147
|
-
history: SpendRecord[];
|
|
1148
|
-
}): void;
|
|
1149
|
-
}
|
|
1150
|
-
declare class FileSpendControlStorage implements SpendControlStorage {
|
|
1151
|
-
private readonly spendingFile;
|
|
1152
|
-
constructor();
|
|
1153
|
-
load(): {
|
|
1154
|
-
limits: SpendLimits;
|
|
1155
|
-
history: SpendRecord[];
|
|
1156
|
-
} | null;
|
|
1157
|
-
save(data: {
|
|
1158
|
-
limits: SpendLimits;
|
|
1159
|
-
history: SpendRecord[];
|
|
1160
|
-
}): void;
|
|
1161
|
-
}
|
|
1162
|
-
declare class InMemorySpendControlStorage implements SpendControlStorage {
|
|
1163
|
-
private data;
|
|
1164
|
-
load(): {
|
|
1165
|
-
limits: SpendLimits;
|
|
1166
|
-
history: SpendRecord[];
|
|
1167
|
-
} | null;
|
|
1168
|
-
save(data: {
|
|
1169
|
-
limits: SpendLimits;
|
|
1170
|
-
history: SpendRecord[];
|
|
1171
|
-
}): void;
|
|
1172
|
-
}
|
|
1173
|
-
interface SpendControlOptions {
|
|
1174
|
-
storage?: SpendControlStorage;
|
|
1175
|
-
now?: () => number;
|
|
1176
|
-
}
|
|
1177
|
-
declare class SpendControl {
|
|
1178
|
-
private limits;
|
|
1179
|
-
private history;
|
|
1180
|
-
private sessionSpent;
|
|
1181
|
-
private sessionCalls;
|
|
1182
|
-
private readonly storage;
|
|
1183
|
-
private readonly now;
|
|
1184
|
-
constructor(options?: SpendControlOptions);
|
|
1185
|
-
setLimit(window: SpendWindow, amount: number): void;
|
|
1186
|
-
clearLimit(window: SpendWindow): void;
|
|
1187
|
-
getLimits(): SpendLimits;
|
|
1188
|
-
check(estimatedCost: number): CheckResult;
|
|
1189
|
-
record(amount: number, metadata?: {
|
|
1190
|
-
model?: string;
|
|
1191
|
-
action?: string;
|
|
1192
|
-
}): void;
|
|
1193
|
-
private getSpendingInWindow;
|
|
1194
|
-
getSpending(window: "hourly" | "daily" | "session"): number;
|
|
1195
|
-
getRemaining(window: "hourly" | "daily" | "session"): number | null;
|
|
1196
|
-
getStatus(): SpendingStatus;
|
|
1197
|
-
getHistory(limit?: number): SpendRecord[];
|
|
1198
|
-
resetSession(): void;
|
|
1199
|
-
private cleanup;
|
|
1200
|
-
private save;
|
|
1201
|
-
private load;
|
|
1202
|
-
}
|
|
1203
|
-
declare function formatDuration(seconds: number): string;
|
|
1204
|
-
|
|
1205
1327
|
/**
|
|
1206
1328
|
* Wallet Key Derivation
|
|
1207
1329
|
*
|
|
@@ -1602,4 +1724,4 @@ declare function parseCallArgs(raw: string): {
|
|
|
1602
1724
|
declare function buildImageGenerationProvider(): ImageGenerationProviderPlugin;
|
|
1603
1725
|
declare const plugin: OpenClawPluginDefinition;
|
|
1604
1726
|
|
|
1605
|
-
export { type AggregatedStats, BALANCE_THRESHOLDS, BLOCKRUN_MODELS, type BalanceInfo, BalanceMonitor, type CachedLLMResponse, type CachedResponse, type CheckResult, DEFAULT_RETRY_CONFIG, DEFAULT_SESSION_CONFIG, type DailyStats, type DerivedKeys, EmptyWalletError, FileSpendControlStorage, InMemorySpendControlStorage, InsufficientFundsError, type InsufficientFundsInfo, type LowBalanceInfo, MODEL_ALIASES, OPENCLAW_MODELS, PARTNER_SERVICES, type PartnerServiceDefinition, type PartnerToolDefinition, type PaymentChain, type ProxyHandle, type ProxyOptions, RequestDeduplicator, ResponseCache, type ResponseCacheConfig, type RetryConfig, RpcError, type SessionConfig, type SessionEntry, SessionStore, type SolanaBalanceInfo, SolanaBalanceMonitor, SpendControl, type SpendControlOptions, type SpendControlStorage, type SpendLimits, type SpendRecord, type SpendWindow, type SpendingStatus, type SufficiencyResult, type UsageEntry, VISIBLE_OPENCLAW_MODELS, type WalletConfig, type WalletResolution, blockrunProvider, buildImageGenerationProvider, buildPartnerTools, buildProviderModels, clearStats, plugin as default, deriveAllKeys, deriveEvmKey, deriveSolanaKeyBytes, fetchWithRetry, formatDuration, formatStatsAscii, generateWalletMnemonic, getAgenticModels, getModelContextWindow, getPartnerService, getProxyPort, getSessionId, getStats, hashRequestContent, injectAuthProfile, injectModelsConfig, isAgenticModel, isBalanceError, isBlockrunWebSearchDisabled, isEmptyWalletError, isInsufficientFundsError, isRetryable, isRpcError, isValidMnemonic, loadPaymentChain, logUsage, parseCallArgs, resolveModelAlias, resolvePaymentChain, savePaymentChain, setupSolana, startProxy, syncAgentModelCache };
|
|
1727
|
+
export { type AggregatedStats, BALANCE_THRESHOLDS, BLOCKRUN_MODELS, type BalanceInfo, BalanceMonitor, CAIP2_BASE, CAIP2_SOLANA_MAINNET, type CachedLLMResponse, type CachedResponse, type CheckResult, type CounterpartyInfo, DEFAULT_RETRY_CONFIG, DEFAULT_SESSION_CONFIG, type DailyStats, type DerivedKeys, EmptyWalletError, FileSpendControlStorage, InMemorySpendControlStorage, InsufficientFundsError, type InsufficientFundsInfo, type LowBalanceInfo, MODEL_ALIASES, MalformedSpendPolicyError, OPENCLAW_MODELS, PARTNER_SERVICES, type PartnerServiceDefinition, type PartnerToolDefinition, type PaymentChain, type PolicyList, type ProxyHandle, type ProxyOptions, RequestDeduplicator, ResponseCache, type ResponseCacheConfig, type RetryConfig, RpcError, type SessionConfig, type SessionEntry, SessionStore, type SolanaBalanceInfo, SolanaBalanceMonitor, SpendControl, type SpendControlOptions, type SpendControlStorage, type SpendLimits, SpendPolicyError, type SpendRecord, type SpendWindow, type SpendingStatus, type SufficiencyResult, type UsageEntry, VISIBLE_OPENCLAW_MODELS, type WalletConfig, type WalletResolution, blockrunProvider, buildImageGenerationProvider, buildPartnerTools, buildProviderModels, clearStats, plugin as default, deriveAllKeys, deriveEvmKey, deriveSolanaKeyBytes, fetchWithRetry, formatDuration, formatStatsAscii, generateWalletMnemonic, getAgenticModels, getModelContextWindow, getPartnerService, getProxyPort, getSessionId, getStats, hashRequestContent, injectAuthProfile, injectModelsConfig, isAgenticModel, isBalanceError, isBlockrunWebSearchDisabled, isEmptyWalletError, isInsufficientFundsError, isRetryable, isRpcError, isValidMnemonic, loadPaymentChain, logUsage, parseCallArgs, registerSpendPolicyHook, resolveModelAlias, resolvePaymentChain, savePaymentChain, setupSolana, startProxy, syncAgentModelCache };
|