@tempoxyz/patron 0.0.27 → 0.0.28

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/bin.js CHANGED
@@ -4,14 +4,14 @@ const require = __patronCreateRequire(import.meta.url)
4
4
 
5
5
  // src/bin.ts
6
6
  if (process.argv[2] === "hook") {
7
- const { runHookProcess } = await import("./chunks/hook-process-QQPBFRY6.js");
7
+ const { runHookProcess } = await import("./chunks/hook-process-IMQMGXBT.js");
8
8
  await runHookProcess().catch(() => void 0);
9
9
  process.exit(0);
10
10
  } else if (process.argv[2] === "pay") {
11
- const { runPayProcess } = await import("./chunks/hook-process-QQPBFRY6.js");
11
+ const { runPayProcess } = await import("./chunks/hook-process-IMQMGXBT.js");
12
12
  await runPayProcess().catch(() => void 0);
13
13
  process.exit(0);
14
14
  } else {
15
- const { run } = await import("./chunks/-PBBSDRMM.js");
15
+ const { run } = await import("./chunks/-5Q7V7W7W.js");
16
16
  process.exitCode = await run(process.argv.slice(2));
17
17
  }
@@ -3,8 +3,6 @@ const require = __patronCreateRequire(import.meta.url)
3
3
  import {
4
4
  FileTokenStore,
5
5
  LINK_TOKEN_STEP,
6
- LeaderboardResponse,
7
- PatronInfo,
8
6
  STARTER_TOKENS,
9
7
  budgetTokens,
10
8
  buyTokens,
@@ -17,7 +15,6 @@ import {
17
15
  loadIssuer,
18
16
  needsRefill,
19
17
  parseUsd,
20
- profileMessage,
21
18
  purchasableTokens,
22
19
  readJsonObject,
23
20
  redeem,
@@ -29,26 +26,20 @@ import {
29
26
  withPatronStatus,
30
27
  withoutPatronHandlers,
31
28
  writeJsonObject
32
- } from "./chunk-F5CY5O7O.js";
29
+ } from "./chunk-EKFENOVR.js";
33
30
  import {
34
31
  startRefill
35
32
  } from "./chunk-TV5VLFTD.js";
36
33
  import {
37
- DEFAULT_MONTHLY_BUDGET_USD,
38
- MAX_TOKENS_PER_PAGE,
39
- MIN_TOKENS_PER_PAGE,
40
- PACK_SIZE,
41
- TOKEN_PRICE_UNITS,
42
- clampTokensPerPage,
43
- formatUsd,
44
- normalizePayee,
45
34
  resolveSettings,
46
- settingsFor,
47
- tokensToUnits
48
- } from "./chunk-WZRGCKEK.js";
35
+ settingsFor
36
+ } from "./chunk-OQXACACU.js";
49
37
  import {
50
38
  AGENT_IDS,
39
+ LeaderboardResponse,
40
+ PatronInfo,
51
41
  ensureHome,
42
+ profileMessage,
52
43
  readConfig,
53
44
  readJson,
54
45
  readUsage,
@@ -56,11 +47,20 @@ import {
56
47
  updateUsage,
57
48
  writeConfig,
58
49
  writePrivateFile
59
- } from "./chunk-MZJEM2SE.js";
50
+ } from "./chunk-EV7OA6GK.js";
60
51
  import {
52
+ DEFAULT_MONTHLY_BUDGET_USD,
53
+ MAX_TOKENS_PER_PAGE,
54
+ MIN_TOKENS_PER_PAGE,
55
+ PACK_SIZE,
56
+ TOKEN_PRICE_UNITS,
57
+ clampTokensPerPage,
58
+ formatUsd,
59
+ normalizePayee,
60
+ tokensToUnits,
61
61
  tryLock,
62
62
  withLock
63
- } from "./chunk-O64T22EK.js";
63
+ } from "./chunk-EISHX7Q3.js";
64
64
  import "./chunk-GTMLTZRN.js";
65
65
 
66
66
  // src/index.ts
@@ -700,10 +700,10 @@ async function linkRefillFailedAt(home) {
700
700
  var REFILL_LOCK_STALE_MS = 5 * 60 * 1e3;
701
701
  var defaultOpenWallet = async (settings, config, issuer, maxUnits) => {
702
702
  if (config.wallet === "link") {
703
- const { openLinkWallet } = await import("./wallet-OJP2JREM.js");
703
+ const { openLinkWallet } = await import("./wallet-6TDMXRWW.js");
704
704
  return openLinkWallet(config, maxUnits);
705
705
  }
706
- const { openWallet } = await import("./wallet-OJP2JREM.js");
706
+ const { openWallet } = await import("./wallet-6TDMXRWW.js");
707
707
  return openWallet(settings, config.wallet, issuer, maxUnits);
708
708
  };
709
709
  async function buyWithinBudget(settings, config, wanted, openWallet = defaultOpenWallet) {
@@ -861,6 +861,19 @@ function defaults() {
861
861
  stdout: process.stdout
862
862
  };
863
863
  }
864
+ var REFRESHES_STABLE_COPY = /* @__PURE__ */ new Set([
865
+ "status",
866
+ "pause",
867
+ "resume",
868
+ "budget",
869
+ "per-page",
870
+ "tip",
871
+ "name"
872
+ ]);
873
+ async function refreshStableCli(deps) {
874
+ const config = await readConfig(deps.settings.home).catch(() => void 0);
875
+ if (config) await installStableCli(deps.settings.home).catch(() => void 0);
876
+ }
864
877
  async function run(argv, overrides = {}) {
865
878
  const base = { ...defaults(), ...overrides };
866
879
  let shared;
@@ -873,6 +886,8 @@ async function run(argv, overrides = {}) {
873
886
  };
874
887
  const [command, ...args] = argv;
875
888
  try {
889
+ if (command !== void 0 && REFRESHES_STABLE_COPY.has(command))
890
+ await refreshStableCli(deps);
876
891
  switch (command) {
877
892
  case void 0:
878
893
  await main(deps);
@@ -1069,7 +1084,7 @@ async function tempoSignIn(deps, budgetUnits, issuer) {
1069
1084
  deps,
1070
1085
  deps.settings.privateKey ? "Using PATRON_PRIVATE_KEY" : "Signing in with Tempo Wallet"
1071
1086
  );
1072
- const { signIn } = await import("./wallet-OJP2JREM.js");
1087
+ const { signIn } = await import("./wallet-6TDMXRWW.js");
1073
1088
  const account = await signIn(deps.settings, {
1074
1089
  budgetUnits,
1075
1090
  issuer,
@@ -1181,9 +1196,9 @@ async function changeBudget(deps, input) {
1181
1196
  if (budget === void 0 || budget < 1e-3)
1182
1197
  throw new UsageError("Usage: patron budget <usd>, such as patron budget 10");
1183
1198
  } else budget = await askBudget(deps, config.monthlyBudgetUsd);
1184
- if (config.wallet === "tempo" && budget > config.monthlyBudgetUsd) {
1199
+ if (config.wallet === "tempo" && budget >= config.monthlyBudgetUsd) {
1185
1200
  step(deps, "Approve the new spending limit in Tempo Wallet");
1186
- const { authorizeBudget } = await import("./wallet-OJP2JREM.js");
1201
+ const { authorizeBudget } = await import("./wallet-6TDMXRWW.js");
1187
1202
  const issuer = await loadIssuer(settings.home, settings.gatewayUrl, {
1188
1203
  fetch: deps.fetch
1189
1204
  });
@@ -1237,8 +1252,9 @@ async function tip(deps, url, amount = "0.10") {
1237
1252
  throw new Error(
1238
1253
  `This tip needs ${tokensUsd(missing)} more than this month's budget allows. Raise it with patron budget <usd>.`
1239
1254
  );
1240
- step(deps, `Adding ${tokensUsd(missing)} to your balance`);
1241
- await buyWithinBudget(settings, config, missing, deps.openWallet);
1255
+ const amount2 = Math.max(missing, purchasableTokens(config, usage, PACK_SIZE));
1256
+ step(deps, `Adding ${tokensUsd(amount2)} to your balance`);
1257
+ await buyWithinBudget(settings, config, amount2, deps.openWallet);
1242
1258
  }
1243
1259
  const issuer = await loadIssuer(settings.home, settings.gatewayUrl, {
1244
1260
  fetch: deps.fetch
@@ -1300,7 +1316,7 @@ async function setName(deps, name) {
1300
1316
  const issuer = await loadIssuer(settings.home, settings.gatewayUrl, {
1301
1317
  fetch: deps.fetch
1302
1318
  });
1303
- const open = deps.openWallet ?? (async (s, c, i, max) => (await import("./wallet-OJP2JREM.js")).openWallet(s, c.wallet, i, max));
1319
+ const open = deps.openWallet ?? (async (s, c, i, max) => (await import("./wallet-6TDMXRWW.js")).openWallet(s, c.wallet, i, max));
1304
1320
  const wallet = await open(settings, config, issuer, 0n);
1305
1321
  await setProfile(settings.gatewayUrl, wallet, name, deps.fetch);
1306
1322
  await writeConfig(settings.home, { ...config, name });
@@ -797,6 +797,10 @@ var TOKEN_PRICE_UNITS = 1000n;
797
797
  var PACK_SIZE = 1e3;
798
798
  var MAX_TOKENS_PER_PURCHASE = 5e3;
799
799
  var DEFAULT_MONTHLY_BUDGET_USD = 5;
800
+ function accessKeyLimitUnits(budgetUnits) {
801
+ if (budgetUnits <= 0n) return 0n;
802
+ return budgetUnits + 50000n + budgetUnits / 100n;
803
+ }
800
804
  var MIN_TOKENS_PER_PAGE = 1;
801
805
  var MAX_TOKENS_PER_PAGE = 10;
802
806
  var DEFAULT_TOKENS_PER_PAGE = 1;
@@ -956,36 +960,6 @@ function normalizePayee(input) {
956
960
  return normalizeDomain(trimmed);
957
961
  }
958
962
 
959
- // src/settings.ts
960
- import { homedir } from "node:os";
961
- import { join } from "node:path";
962
- var DEFAULT_GATEWAY_URL = "https://patron-gateway.tempo-dev.workers.dev";
963
- var DEFAULT_RELAY_URL = "https://patron-relay.tempo-dev.workers.dev";
964
- function resolveSettings(env = process.env) {
965
- const key = env.PATRON_PRIVATE_KEY?.trim();
966
- const privateKey = key && /^0x[0-9a-fA-F]{64}$/.test(key) ? key : void 0;
967
- return {
968
- gatewayUrl: env.PATRON_GATEWAY_URL || DEFAULT_GATEWAY_URL,
969
- home: env.PATRON_HOME || join(homedir(), ".patron"),
970
- network: env.PATRON_NETWORK === "testnet" ? "testnet" : "mainnet",
971
- overridden: {
972
- gatewayUrl: Boolean(env.PATRON_GATEWAY_URL),
973
- network: Boolean(env.PATRON_NETWORK),
974
- relayUrl: Boolean(env.PATRON_RELAY_URL)
975
- },
976
- relayUrl: env.PATRON_RELAY_URL || DEFAULT_RELAY_URL,
977
- ...privateKey ? { privateKey } : {}
978
- };
979
- }
980
- function settingsFor(settings, saved) {
981
- return {
982
- ...settings,
983
- gatewayUrl: settings.overridden.gatewayUrl || !saved.gatewayUrl ? settings.gatewayUrl : saved.gatewayUrl,
984
- network: settings.overridden.network ? settings.network : saved.network,
985
- relayUrl: settings.overridden.relayUrl || !saved.relayUrl ? settings.relayUrl : saved.relayUrl
986
- };
987
- }
988
-
989
963
  // ../protocol/src/encoding.ts
990
964
  function toBase64Url(bytes) {
991
965
  let binary = "";
@@ -1190,11 +1164,59 @@ function tokensToUnits(tokens) {
1190
1164
  return BigInt(tokens) * TOKEN_PRICE_UNITS;
1191
1165
  }
1192
1166
 
1167
+ // src/lock.ts
1168
+ import { open, rm, stat } from "node:fs/promises";
1169
+ async function withLock(path, fn, options = {}) {
1170
+ const deadline = Date.now() + (options.timeoutMs ?? 3e3);
1171
+ const staleMs = options.staleMs ?? 1e4;
1172
+ for (; ; ) {
1173
+ try {
1174
+ const handle = await open(path, "wx", 384);
1175
+ await handle.close();
1176
+ break;
1177
+ } catch (error) {
1178
+ if (error.code !== "EEXIST") throw error;
1179
+ const age = await stat(path).then(
1180
+ (stats) => Date.now() - stats.mtimeMs,
1181
+ () => 0
1182
+ );
1183
+ if (age > staleMs) {
1184
+ await rm(path, { force: true });
1185
+ continue;
1186
+ }
1187
+ if (Date.now() > deadline) throw new Error(`Patron state is busy: ${path}`);
1188
+ await new Promise((resolve) => setTimeout(resolve, 10 + Math.random() * 20));
1189
+ }
1190
+ }
1191
+ try {
1192
+ return await fn();
1193
+ } finally {
1194
+ await rm(path, { force: true });
1195
+ }
1196
+ }
1197
+ async function tryLock(path, staleMs) {
1198
+ try {
1199
+ const handle = await open(path, "wx", 384);
1200
+ await handle.close();
1201
+ } catch (error) {
1202
+ if (error.code !== "EEXIST") throw error;
1203
+ const age = await stat(path).then(
1204
+ (stats) => Date.now() - stats.mtimeMs,
1205
+ () => 0
1206
+ );
1207
+ if (age <= staleMs) return void 0;
1208
+ await rm(path, { force: true });
1209
+ return tryLock(path, staleMs);
1210
+ }
1211
+ return () => rm(path, { force: true });
1212
+ }
1213
+
1193
1214
  export {
1194
1215
  TOKEN_PRICE_UNITS,
1195
1216
  PACK_SIZE,
1196
1217
  MAX_TOKENS_PER_PURCHASE,
1197
1218
  DEFAULT_MONTHLY_BUDGET_USD,
1219
+ accessKeyLimitUnits,
1198
1220
  MIN_TOKENS_PER_PAGE,
1199
1221
  MAX_TOKENS_PER_PAGE,
1200
1222
  clampTokensPerPage,
@@ -1206,6 +1228,6 @@ export {
1206
1228
  isExcludedByDefault,
1207
1229
  formatUsd,
1208
1230
  tokensToUnits,
1209
- resolveSettings,
1210
- settingsFor
1231
+ withLock,
1232
+ tryLock
1211
1233
  };