@lucid-agents/taskmarket 1.17.1 → 1.17.2

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.
@@ -14,7 +14,7 @@ import {
14
14
  loadKeystore,
15
15
  loadX402Policy,
16
16
  rpcUrlForNetwork
17
- } from "./chunk-3S63AB3C.js";
17
+ } from "./chunk-FRV3ZHUR.js";
18
18
  import {
19
19
  AgentLaunchError
20
20
  } from "./chunk-YM4S6IE4.js";
@@ -6,7 +6,7 @@ import {
6
6
  loadComputeCreditConfig,
7
7
  onComputeBalanceObserved,
8
8
  readComputeCreditStatus
9
- } from "./chunk-EIHZYRIU.js";
9
+ } from "./chunk-52Q2DCZN.js";
10
10
  import {
11
11
  AgentLaunchError
12
12
  } from "./chunk-YM4S6IE4.js";
@@ -2,7 +2,7 @@ import { createRequire as __tmCreateRequire } from 'node:module'; import { fileU
2
2
  import {
3
3
  computeAllocationId,
4
4
  readComputeView
5
- } from "./chunk-MI2GPMCZ.js";
5
+ } from "./chunk-LDCFKFF6.js";
6
6
  import {
7
7
  allocationViews,
8
8
  channelView,
@@ -10,11 +10,11 @@ import {
10
10
  openAgentChannels,
11
11
  uncertainPurchases,
12
12
  withdrawalHatch
13
- } from "./chunk-F5SS4NUF.js";
13
+ } from "./chunk-GJQUALXN.js";
14
14
  import {
15
15
  SandboxListOutputSchema,
16
16
  apiUrl
17
- } from "./chunk-3S63AB3C.js";
17
+ } from "./chunk-FRV3ZHUR.js";
18
18
  import {
19
19
  AgentLaunchError
20
20
  } from "./chunk-YM4S6IE4.js";
@@ -6,14 +6,14 @@ import {
6
6
  } from "./chunk-OKZ2NRYZ.js";
7
7
  import {
8
8
  listSandboxes
9
- } from "./chunk-JAZ5BWPB.js";
10
- import "./chunk-MI2GPMCZ.js";
11
- import "./chunk-EIHZYRIU.js";
9
+ } from "./chunk-XXD7TWLP.js";
10
+ import "./chunk-LDCFKFF6.js";
11
+ import "./chunk-52Q2DCZN.js";
12
12
  import {
13
13
  channelView,
14
14
  loadAgentPolicy,
15
15
  openAgentChannels
16
- } from "./chunk-F5SS4NUF.js";
16
+ } from "./chunk-GJQUALXN.js";
17
17
  import {
18
18
  apiUrl,
19
19
  getX402PolicyPath,
@@ -21,7 +21,7 @@ import {
21
21
  loadKeystore,
22
22
  loadX402Policy,
23
23
  rpcUrlForNetwork
24
- } from "./chunk-3S63AB3C.js";
24
+ } from "./chunk-FRV3ZHUR.js";
25
25
  import "./chunk-YM4S6IE4.js";
26
26
  import {
27
27
  AGENT_VIEW_VERSION
package/dist/index.js CHANGED
@@ -22,7 +22,7 @@ import {
22
22
  releasePendingComputePurchase,
23
23
  resolvePendingComputePurchases,
24
24
  x402FeePost
25
- } from "./chunk-EIHZYRIU.js";
25
+ } from "./chunk-52Q2DCZN.js";
26
26
  import {
27
27
  AgentMessageEnvelopeSchema,
28
28
  ApiError,
@@ -58,6 +58,7 @@ import {
58
58
  buildWalletLegalAcceptanceMessage,
59
59
  buildWithdrawDreamsMessage,
60
60
  chainInfoFor,
61
+ clientValidityWindowSeconds,
61
62
  createWalletAccountFromKeystore,
62
63
  decryptPrivateKey,
63
64
  dreamsToUsd,
@@ -81,6 +82,7 @@ import {
81
82
  loadX402Policy,
82
83
  networkToStamp,
83
84
  paymentProtocolOf,
85
+ paymentTokenSymbol,
84
86
  readFailureBody,
85
87
  readKeystoreNetwork,
86
88
  removeX402PolicyRule,
@@ -99,7 +101,7 @@ import {
99
101
  usdcToBaseUnits,
100
102
  withErrorContext,
101
103
  withIdempotentWrite
102
- } from "./chunk-3S63AB3C.js";
104
+ } from "./chunk-FRV3ZHUR.js";
103
105
  import {
104
106
  channelLines
105
107
  } from "./chunk-73RXOYME.js";
@@ -184,6 +186,8 @@ async function pollAgentId(address, maxWaitMs = 6e4) {
184
186
  async function registerDevice(input) {
185
187
  const response = await fetch(`${apiUrl()}/api/devices`, {
186
188
  body: JSON.stringify({
189
+ // The identity the platform mints for a new device lands on this chain.
190
+ chainId: selectedNetwork().chainId,
187
191
  publicKey: input.publicKey,
188
192
  signature: input.signature,
189
193
  walletAddress: input.walletAddress
@@ -633,7 +637,7 @@ async function x402Post(path3, body, options) {
633
637
 
634
638
  // src/commands/identity.ts
635
639
  var identityCommand = new Command4("identity").description("Manage agent identity");
636
- identityCommand.command("register").description("Register ERC-8004 agent identity (costs 0.001 USDC)").action(async () => {
640
+ identityCommand.command("register").description("Register ERC-8004 agent identity (costs 0.001 in the payment token)").action(async () => {
637
641
  const { data: result, idempotencyKey } = await x402Post("/api/identity/register", {});
638
642
  printResult({ agentId: result.agentId }, { idempotencyKey });
639
643
  });
@@ -654,7 +658,9 @@ var statsCommand = new Command5("stats").description("View agent statistics").op
654
658
  const statsQuery = opts.agent ? `/api/agents/stats?agentId=${opts.agent}` : `/api/agents/stats?address=${address}`;
655
659
  const [result, balanceResult, dreamsResult, exchangeRateResult] = await Promise.all([
656
660
  apiGet(statsQuery),
657
- apiGet(`/api/wallet/balance?address=${address}`),
661
+ apiGet(
662
+ `/api/wallet/balance?address=${address}&chainId=${selectedNetwork().chainId}`
663
+ ),
658
664
  apiGet(`/api/wallet/dreams-balance?address=${address}`).then((r) => r).catch(() => null),
659
665
  apiGet("/api/wallet/exchange-rate").then((r) => r).catch(() => null)
660
666
  ]);
@@ -675,6 +681,7 @@ var statsCommand = new Command5("stats").description("View agent statistics").op
675
681
  agentId: result.agentId,
676
682
  address: result.address,
677
683
  balanceUsdc: balanceResult.balanceUsdc,
684
+ balanceToken: balanceResult.tokenSymbol ?? paymentTokenSymbol(selectedNetwork().chainId),
678
685
  balanceBaseUnits: balanceResult.balanceBaseUnits,
679
686
  pendingDreamsRewards,
680
687
  pendingDreamsUsd,
@@ -715,7 +722,7 @@ function parseStakeOptions(opts) {
715
722
  }
716
723
  return { stakeRequired: true, stakeBps };
717
724
  }
718
- var createCmd = new Command6("create").description("Create a new task (costs reward amount in USDC)").requiredOption("--description <text>", "Task description").requiredOption("--reward <usdc>", "Reward in USDC (e.g. 5 for 5 USDC)").requiredOption("--duration <hours>", "Task duration in hours").option("--mode <mode>", "Task mode: bounty, claim, pitch, benchmark, auction", "bounty").option(
725
+ var createCmd = new Command6("create").description("Create a new task (costs the reward, in the payment token)").requiredOption("--description <text>", "Task description").requiredOption("--reward <amount>", "Reward in the payment token (e.g. 5)").requiredOption("--duration <hours>", "Task duration in hours").option("--mode <mode>", "Task mode: bounty, claim, pitch, benchmark, auction", "bounty").option(
719
726
  "--task-visibility <mode>",
720
727
  "Task visibility: public (default), unlisted, or private. Unlisted only hides a task from Taskmarket's own listings/search/SEO -- it stays permanently visible on the public blockchain to anyone with the link, reading the contract directly, or running their own indexer. private is genuinely access-controlled: only the requester and invited/assigned workers can view it via listings, get, or the gated reads -- see --allowed-viewers and --access-password. Even private, the on-chain existence, reward, and participation stay publicly observable regardless.",
721
728
  "public"
@@ -729,15 +736,18 @@ var createCmd = new Command6("create").description("Create a new task (costs rew
729
736
  "--submission-visibility <mode>",
730
737
  "Submission visibility: public (default), reveal_all, winner_only, or never. Controls who can see what workers submit while the task is live and after it ends. public matches today's behavior exactly. The other three modes hide submissions from everyone but the requester and each submitting worker while the task is active; once it ends, reveal_all shows everything, winner_only shows only the winning submission(s), and never keeps every submission hidden indefinitely. Chosen once here and locked in permanently -- there is no command to change it later.",
731
738
  "public"
732
- ).option("--tags <tags>", "Comma-separated tags").option("--pitch-deadline <hours>", "Pitch deadline in hours from now (pitch mode only)").option("--bid-deadline <hours>", "Bid deadline in hours from now (auction mode only)").option("--max-price <usdc>", "Maximum bid price in USDC (required for auction mode)").option(
739
+ ).option("--tags <tags>", "Comma-separated tags").option("--pitch-deadline <hours>", "Pitch deadline in hours from now (pitch mode only)").option("--bid-deadline <hours>", "Bid deadline in hours from now (auction mode only)").option(
740
+ "--max-price <amount>",
741
+ "Maximum bid price in the payment token (required for auction mode)"
742
+ ).option(
733
743
  "--auction-type <type>",
734
744
  "Auction subtype: dutch, english, reverse_dutch, reverse_english (required for auction mode)"
735
745
  ).option(
736
- "--auction-start-price <usdc>",
737
- "Starting clock price in USDC for reverse_dutch (required for reverse_dutch)"
746
+ "--auction-start-price <amount>",
747
+ "Starting clock price in the payment token for reverse_dutch (required for reverse_dutch)"
738
748
  ).option(
739
- "--auction-floor-price <usdc>",
740
- "Floor price in USDC for dutch clock (required for dutch)"
749
+ "--auction-floor-price <amount>",
750
+ "Floor price in the payment token for dutch clock (required for dutch)"
741
751
  ).option(
742
752
  "--hook <address>",
743
753
  "Custom ITMPHook contract address (repeat in execution order; protocol defaults run first)",
@@ -1410,7 +1420,7 @@ var listCmd = new Command7("list").alias("search").description("List available t
1410
1420
  ).option("--mode <mode>", "Filter by mode (bounty, claim, pitch, benchmark, auction)").option(
1411
1421
  "--auction-type <type>",
1412
1422
  "Filter auction tasks by subtype (dutch, english, reverse_dutch, reverse_english)"
1413
- ).option("--tags <tags>", "Comma-separated tags to filter by").option("--skill <skill>", "Filter by skill tag (comma-separated, alias for --tags)").option("--reward-min <n>", "Minimum reward in USDC").option("--reward-max <n>", "Maximum reward in USDC").option("--deadline-hours <n>", "Only tasks expiring within this many hours").option("--limit <n>", "Maximum results to return", "20").option("--cursor <cursor>", "Cursor from previous page (nextCursor in JSON output)").action(
1423
+ ).option("--tags <tags>", "Comma-separated tags to filter by").option("--skill <skill>", "Filter by skill tag (comma-separated, alias for --tags)").option("--reward-min <n>", "Minimum reward in the payment token").option("--reward-max <n>", "Maximum reward in the payment token").option("--deadline-hours <n>", "Only tasks expiring within this many hours").option("--limit <n>", "Maximum results to return", "20").option("--cursor <cursor>", "Cursor from previous page (nextCursor in JSON output)").action(
1414
1424
  async (opts) => {
1415
1425
  const tagsValue = opts.tags ?? opts.skill;
1416
1426
  const result = await listTasks(cliTaskReadContext(), {
@@ -1471,7 +1481,7 @@ var submitCmd = new Command9("submit").description("Submit work for a task").arg
1471
1481
 
1472
1482
  // src/commands/task/accept.ts
1473
1483
  import { Command as Command10 } from "commander";
1474
- var acceptCmd = new Command10("accept").description("Accept a submission (costs 0.001 USDC)").argument("<taskId>", "Task ID (0x-prefixed hex)").requiredOption("--worker <addr>", "Worker wallet address").action(async (taskId, opts) => {
1484
+ var acceptCmd = new Command10("accept").description("Accept a submission (costs 0.001 in the payment token)").argument("<taskId>", "Task ID (0x-prefixed hex)").requiredOption("--worker <addr>", "Worker wallet address").action(async (taskId, opts) => {
1475
1485
  const task = await getTask(cliTaskReadContext(), { taskId });
1476
1486
  if (!task) {
1477
1487
  printError(
@@ -1522,7 +1532,7 @@ function parseWinner(spec) {
1522
1532
  return { worker, share, ...submissionId !== void 0 && { submissionId } };
1523
1533
  }
1524
1534
  var acceptSubmissionsCmd = new Command11("accept-submissions").description(
1525
- "Accept N submissions for a Bounty/Benchmark task with explicit share basis points (costs 0.001 USDC).\nShares must sum to 10000. The contract resolves each deliverable from on-chain submission history.\n\nFor ranked payouts, pass winners in rank order \u2014 workers[0] is the primary winner.\n\nTo pin a specific submission version, append the submission ID as a third field.\n\nExamples:\n task accept-submissions 0x\u2026 --winner 0xAlice:5000 --winner 0xBob:3000 --winner 0xCarol:2000\n task accept-submissions 0x\u2026 --winner 0xAlice:5000:sub_abc123 --winner 0xBob:5000:sub_def456"
1535
+ "Accept N submissions for a Bounty/Benchmark task with explicit share basis points (costs 0.001 in the payment token).\nShares must sum to 10000. The contract resolves each deliverable from on-chain submission history.\n\nFor ranked payouts, pass winners in rank order \u2014 workers[0] is the primary winner.\n\nTo pin a specific submission version, append the submission ID as a third field.\n\nExamples:\n task accept-submissions 0x\u2026 --winner 0xAlice:5000 --winner 0xBob:3000 --winner 0xCarol:2000\n task accept-submissions 0x\u2026 --winner 0xAlice:5000:sub_abc123 --winner 0xBob:5000:sub_def456"
1526
1536
  ).argument("<taskId>", "Task ID (0x-prefixed hex)").requiredOption(
1527
1537
  "--winner <spec...>",
1528
1538
  "Winner spec <addr>:<share> or <addr>:<share>:<submissionId>. Pass multiple times."
@@ -1548,7 +1558,7 @@ var acceptSubmissionsCmd = new Command11("accept-submissions").description(
1548
1558
 
1549
1559
  // src/commands/task/rate.ts
1550
1560
  import { Command as Command12 } from "commander";
1551
- var rateCmd = new Command12("rate").description("Rate a worker (costs 0.001 USDC)").argument("<taskId>", "Task ID (0x-prefixed hex)").requiredOption("--worker <addr>", "Worker wallet address").requiredOption("--rating <n>", "Rating 0-100").option("--feedback <text>", "Optional feedback text").action(async (taskId, opts) => {
1561
+ var rateCmd = new Command12("rate").description("Rate a worker (costs 0.001 in the payment token)").argument("<taskId>", "Task ID (0x-prefixed hex)").requiredOption("--worker <addr>", "Worker wallet address").requiredOption("--rating <n>", "Rating 0-100").option("--feedback <text>", "Optional feedback text").action(async (taskId, opts) => {
1552
1562
  const rating = parseInt(opts.rating, 10);
1553
1563
  if (rating < 0 || rating > 100) {
1554
1564
  printError("Rating must be between 0 and 100");
@@ -1573,7 +1583,9 @@ var claimCmd = new Command13("claim").description("Claim a task as a worker").ar
1573
1583
 
1574
1584
  // src/commands/task/pitch.ts
1575
1585
  import { Command as Command14 } from "commander";
1576
- var pitchCmd = new Command14("pitch").description("Submit a pitch for a task (costs 0.001 USDC, anchors hash on-chain)").argument("<taskId>", "Task ID (0x-prefixed hex)").requiredOption("--text <text>", "Pitch text").option("--duration <hours>", "Estimated duration in hours").action(async (taskId, opts) => {
1586
+ var pitchCmd = new Command14("pitch").description(
1587
+ "Submit a pitch for a task (costs 0.001 in the payment token, anchors hash on-chain)"
1588
+ ).argument("<taskId>", "Task ID (0x-prefixed hex)").requiredOption("--text <text>", "Pitch text").option("--duration <hours>", "Estimated duration in hours").action(async (taskId, opts) => {
1577
1589
  const keystore = await loadKeystore();
1578
1590
  const signature = await signMessage(`taskmarket:pitch:${taskId}`, keystore);
1579
1591
  const { data: result, idempotencyKey } = await x402Post(
@@ -1618,7 +1630,7 @@ var selectWorkerCmd = new Command16("select-worker").description("Select a worke
1618
1630
 
1619
1631
  // src/commands/task/proof.ts
1620
1632
  import { Command as Command17 } from "commander";
1621
- var proofCmd = new Command17("proof").description("Submit a benchmark proof (costs 0.001 USDC, anchors hash on-chain)").argument("<taskId>", "Task ID (0x-prefixed hex)").requiredOption("--data <data>", "Proof data").requiredOption("--type <type>", "Proof type").option("--metric <val>", "Metric value").action(async (taskId, opts) => {
1633
+ var proofCmd = new Command17("proof").description("Submit a benchmark proof (costs 0.001 in the payment token, anchors hash on-chain)").argument("<taskId>", "Task ID (0x-prefixed hex)").requiredOption("--data <data>", "Proof data").requiredOption("--type <type>", "Proof type").option("--metric <val>", "Metric value").action(async (taskId, opts) => {
1622
1634
  const keystore = await loadKeystore();
1623
1635
  const signature = await signMessage(`taskmarket:proof:${taskId}`, keystore);
1624
1636
  const { data: result, idempotencyKey } = await x402Post(`/api/tasks/${taskId}/proofs`, {
@@ -1646,7 +1658,7 @@ var proofsCmd = new Command18("proofs").description("List proofs for a benchmark
1646
1658
 
1647
1659
  // src/commands/task/bid.ts
1648
1660
  import { Command as Command19 } from "commander";
1649
- var bidCmd = new Command19("bid").description("Submit a bid on an auction task").argument("<taskId>", "Task ID (0x-prefixed hex)").requiredOption("--price <usdc>", "Bid price in USDC (e.g. 3 or 1.5)").action(async (taskId, opts) => {
1661
+ var bidCmd = new Command19("bid").description("Submit a bid on an auction task").argument("<taskId>", "Task ID (0x-prefixed hex)").requiredOption("--price <amount>", "Bid price in the payment token (e.g. 3 or 1.5)").action(async (taskId, opts) => {
1650
1662
  let priceBaseUnits;
1651
1663
  try {
1652
1664
  priceBaseUnits = usdcToBaseUnits(opts.price);
@@ -1667,7 +1679,7 @@ var bidCmd = new Command19("bid").description("Submit a bid on an auction task")
1667
1679
  // src/commands/task/auction-accept.ts
1668
1680
  import { Command as Command20 } from "commander";
1669
1681
  var auctionAcceptCmd = new Command20("auction-accept").description("Accept current clock price on a dutch or reverse_dutch auction task").argument("<taskId>", "Task ID (0x-prefixed hex)").option(
1670
- "--min-price <usdc>",
1682
+ "--min-price <amount>",
1671
1683
  "Reject if current clock price is below this value (price floor guard)"
1672
1684
  ).action(async (taskId, opts) => {
1673
1685
  const body = { taskId };
@@ -1775,7 +1787,9 @@ var downloadCmd = new Command23("download").description("Download a submission f
1775
1787
 
1776
1788
  // src/commands/task/cancel.ts
1777
1789
  import { Command as Command24 } from "commander";
1778
- var cancelCmd = new Command24("cancel").description("Cancel an open task and refund the escrowed reward (costs 0.001 USDC)").argument("<taskId>", "Task ID (0x-prefixed hex)").action(async (taskId) => {
1790
+ var cancelCmd = new Command24("cancel").description(
1791
+ "Cancel an open task and refund the escrowed reward (costs 0.001 in the payment token)"
1792
+ ).argument("<taskId>", "Task ID (0x-prefixed hex)").action(async (taskId) => {
1779
1793
  const { data: result, idempotencyKey } = await x402Post(
1780
1794
  `/api/tasks/${taskId}/cancel`,
1781
1795
  { taskId }
@@ -1786,7 +1800,7 @@ var cancelCmd = new Command24("cancel").description("Cancel an open task and ref
1786
1800
  // src/commands/task/refund-expired.ts
1787
1801
  import { Command as Command25 } from "commander";
1788
1802
  var refundExpiredCmd = new Command25("refund-expired").description(
1789
- "Refund an expired task with no submissions back to the requester (costs 0.001 USDC)"
1803
+ "Refund an expired task with no submissions back to the requester (costs 0.001 in the payment token)"
1790
1804
  ).argument("<taskId>", "Task ID (0x-prefixed hex)").action(async (taskId) => {
1791
1805
  try {
1792
1806
  const { data: result, idempotencyKey } = await x402Post(
@@ -1802,7 +1816,7 @@ var refundExpiredCmd = new Command25("refund-expired").description(
1802
1816
  // src/commands/task/reject-submission.ts
1803
1817
  import { Command as Command26 } from "commander";
1804
1818
  var rejectSubmissionCmd = new Command26("reject-submission").description(
1805
- "Reject a spam or low-quality submission (costs 0.001 USDC relay fee). Once all submissions are rejected, the task can be cancelled to recover escrow."
1819
+ "Reject a spam or low-quality submission (costs a 0.001 relay fee in the payment token). Once all submissions are rejected, the task can be cancelled to recover escrow."
1806
1820
  ).argument("<taskId>", "Task ID (0x-prefixed hex)").requiredOption("--worker <address>", "Worker address whose submission to reject").action(async (taskId, opts) => {
1807
1821
  try {
1808
1822
  const { data: result, idempotencyKey } = await x402Post(
@@ -1916,7 +1930,7 @@ var mySubmissionsCmd = new Command28("my-submissions").description("List all sub
1916
1930
 
1917
1931
  // src/commands/task/update.ts
1918
1932
  import { Command as Command29 } from "commander";
1919
- var updateCmd = new Command29("update").description("Update an open task (costs 0.001 USDC plus any reward increase)").argument("<taskId>", "Task ID (0x-prefixed hex)").option("--reward <usdc>", 'New reward in USDC (human units, e.g. "50")').option("--extend-expiry <seconds>", "Extend expiry by this many seconds").option("--bid-deadline <iso>", "New bid deadline (ISO 8601)").option("--pitch-deadline <iso>", "New pitch deadline (ISO 8601)").option("--auction-floor-price <usdc>", "New auction floor price in USDC").option("--auction-start-price <usdc>", "New auction start price in USDC").option("--description <text>", "New description").option("--tags <csv>", "New tags (comma-separated)").option("--metric-description <text>", "New metric description").action(
1933
+ var updateCmd = new Command29("update").description("Update an open task (costs 0.001 plus any reward increase, in the payment token)").argument("<taskId>", "Task ID (0x-prefixed hex)").option("--reward <amount>", 'New reward in the payment token (human units, e.g. "50")').option("--extend-expiry <seconds>", "Extend expiry by this many seconds").option("--bid-deadline <iso>", "New bid deadline (ISO 8601)").option("--pitch-deadline <iso>", "New pitch deadline (ISO 8601)").option("--auction-floor-price <amount>", "New auction floor price in the payment token").option("--auction-start-price <amount>", "New auction start price in the payment token").option("--description <text>", "New description").option("--tags <csv>", "New tags (comma-separated)").option("--metric-description <text>", "New metric description").action(
1920
1934
  async (taskId, opts) => {
1921
1935
  const body = { taskId };
1922
1936
  if (opts.reward !== void 0) {
@@ -2028,7 +2042,7 @@ var forfeitCmd = new Command30("forfeit").description("Reclaim a claim-mode task
2028
2042
  import { Command as Command31 } from "commander";
2029
2043
  var ADDRESS_PATTERN = /^0x[0-9a-fA-F]{40}$/;
2030
2044
  var assignEvaluatorCmd = new Command31("assign-evaluator").description(
2031
- "Assign an evaluator to an open, unclaimed task you requested (costs 0.001 USDC). Only possible before a worker claims the task."
2045
+ "Assign an evaluator to an open, unclaimed task you requested (costs 0.001 in the payment token). Only possible before a worker claims the task."
2032
2046
  ).argument("<taskId>", "Task ID (0x-prefixed hex)").requiredOption("--evaluator <address>", "Evaluator wallet address").option("--evaluator-fee-bps <bps>", "Evaluator fee in basis points, 0-10000 (default: 0)").option("--evaluation-window <hours>", "Hours the evaluator has to issue a verdict (default: 24)").option("--appeal-window <hours>", "Hours the worker has to appeal a verdict (default: 24)").option("--dispute-resolver <address>", "Address allowed to resolve an appealed verdict").action(
2033
2047
  async (taskId, opts) => {
2034
2048
  if (!ADDRESS_PATTERN.test(opts.evaluator)) {
@@ -2082,7 +2096,7 @@ var assignEvaluatorCmd = new Command31("assign-evaluator").description(
2082
2096
  import { Command as Command32 } from "commander";
2083
2097
  var evaluateCmd = new Command32("evaluate").description("Submit an evaluation verdict for a task in Review state").argument("<taskId>", "Task ID (0x-prefixed hex)").requiredOption("--verdict <type>", "Verdict: approve, reject, or partial").option("--score <n>", "Score 0-1000 (default: 1000)", "1000").option("--confidence <n>", "Confidence 0-1000 (default: 1000)", "1000").option("--evidence-hash <hash>", "Evidence hash (32-byte hex)").option(
2084
2098
  "--award <worker:amount:rank>",
2085
- "Award entry (repeatable): worker:amountUSDC:rank",
2099
+ "Award entry (repeatable): worker:amount:rank",
2086
2100
  collect,
2087
2101
  []
2088
2102
  ).action(
@@ -2095,11 +2109,9 @@ var evaluateCmd = new Command32("evaluate").description("Submit an evaluation ve
2095
2109
  for (const entry of opts.award) {
2096
2110
  const parts = entry.split(":");
2097
2111
  if (parts.length < 3 || !parts[0] || !parts[1] || !parts[2]) {
2098
- return void printError(
2099
- `Invalid award format '${entry}'. Expected worker:amountUSDC:rank`
2100
- );
2112
+ return void printError(`Invalid award format '${entry}'. Expected worker:amount:rank`);
2101
2113
  }
2102
- const [worker, amountUSDC, rankStr] = parts;
2114
+ const [worker, amount, rankStr] = parts;
2103
2115
  if (!/^0x[0-9a-fA-F]{40}$/.test(worker)) {
2104
2116
  return void printError(
2105
2117
  `Invalid worker address in '${entry}': must be 0x-prefixed 40-char hex`
@@ -2107,7 +2119,7 @@ var evaluateCmd = new Command32("evaluate").description("Submit an evaluation ve
2107
2119
  }
2108
2120
  let microUnits;
2109
2121
  try {
2110
- microUnits = usdcToBaseUnits(amountUSDC);
2122
+ microUnits = usdcToBaseUnits(amount);
2111
2123
  } catch (err) {
2112
2124
  renderFailure(withErrorContext(err, `Invalid amount in '${entry}'`));
2113
2125
  return;
@@ -2534,7 +2546,7 @@ async function runAgentCommand(options) {
2534
2546
  try {
2535
2547
  const { assertAgentCompatibility } = await import("./compatibility-KUYGZSUC.js");
2536
2548
  const pi = assertAgentCompatibility();
2537
- const { runAgent } = await import("./launch-DE65XO5C.js");
2549
+ const { runAgent } = await import("./launch-2U3KFTFD.js");
2538
2550
  result = await runAgent({ model: options.model, pi });
2539
2551
  } catch (error) {
2540
2552
  renderFailure(error, {
@@ -2588,20 +2600,20 @@ function agentManagementCommands() {
2588
2600
  const status = new Command43("status").description(
2589
2601
  "Show the agent channels (locked, charged, refundable), purchases with an unknown outcome, the sandbox and compute credit. Reads only."
2590
2602
  ).option("--json", "Print the versioned JSON envelope").action(async (options) => {
2591
- const { collectAgentStatus, statusLines } = await import("./status-3Q55PBFC.js");
2603
+ const { collectAgentStatus, statusLines } = await import("./status-5IMULBQQ.js");
2592
2604
  await run(options, () => collectAgentStatus(), statusLines);
2593
2605
  });
2594
2606
  const doctor = new Command43("doctor").description(
2595
2607
  "Check that the agent can start: Node and the bundled runtime, wallet and policy, channels, API, sandbox broker, host keys, xgate and RPC. Reads only."
2596
2608
  ).option("--json", "Print the versioned JSON envelope").action(async (options) => {
2597
- const { runDoctor, doctorLines } = await import("./doctor-BY2PBHS7.js");
2609
+ const { runDoctor, doctorLines } = await import("./doctor-7TWLIJWW.js");
2598
2610
  const report = await run(options, () => runDoctor(), doctorLines);
2599
2611
  if (report && !report.ok) process.exitCode = 1;
2600
2612
  });
2601
2613
  const reconcile = new Command43("reconcile").description(
2602
2614
  "Decide an agent purchase whose outcome is unknown, by its invocation ID. Never sends it again."
2603
2615
  ).argument("<invocation-id>", "The purchase, as status or the agent named it").option("--json", "Print the versioned JSON envelope").action(async (invocationId, options) => {
2604
- const { reconcileInvocation } = await import("./reconcile-VEMPNIAO.js");
2616
+ const { reconcileInvocation } = await import("./reconcile-XZR2UYSW.js");
2605
2617
  await run(
2606
2618
  options,
2607
2619
  () => reconcileInvocation(invocationId),
@@ -2624,7 +2636,7 @@ function agentManagementCommands() {
2624
2636
  `Not a USDC amount: ${options.amount} (digits, at most 6 decimals)`
2625
2637
  );
2626
2638
  }
2627
- const { openAgentChannels, requestTopUp, selectRail, withdrawalHatch } = await import("./channels-Q7XMSUSO.js");
2639
+ const { openAgentChannels, requestTopUp, selectRail, withdrawalHatch } = await import("./channels-JF4Q5KG3.js");
2628
2640
  const { rails } = await openAgentChannels();
2629
2641
  const result = await requestTopUp(selectRail(rails, options.rail), amount);
2630
2642
  return {
@@ -2648,7 +2660,7 @@ function agentManagementCommands() {
2648
2660
  async () => {
2649
2661
  await requireExperimental();
2650
2662
  const { AGENT_VIEW_VERSION } = await import("./budget-view-XKZC3GY5.js");
2651
- const { closeChannel, openAgentChannels, selectChannel } = await import("./channels-Q7XMSUSO.js");
2663
+ const { closeChannel, openAgentChannels, selectChannel } = await import("./channels-JF4Q5KG3.js");
2652
2664
  const { rail, retired } = selectChannel(await openAgentChannels(), options);
2653
2665
  const result = await closeChannel(
2654
2666
  rail,
@@ -2774,12 +2786,17 @@ var depositCommand = new Command48("deposit").description("Show wallet address a
2774
2786
  renderFailure(err, { fallback: "Failed to fetch network info from backend." });
2775
2787
  return;
2776
2788
  }
2789
+ const chain = chainInfoFor(networkInfo, selectedNetwork().chainId);
2790
+ const chainId = chain?.chainId ?? networkInfo.chainId;
2791
+ const tokenAddress = chain?.tokenAddress ?? networkInfo.usdcAddress;
2777
2792
  const data = {
2778
2793
  address,
2779
- network: networkInfo.networkName,
2780
- chainId: networkInfo.chainId,
2781
- currency: "USDC",
2782
- usdcContract: networkInfo.usdcAddress
2794
+ network: chain?.networkName ?? networkInfo.networkName,
2795
+ chainId,
2796
+ currency: paymentTokenSymbol(chainId),
2797
+ tokenAddress,
2798
+ /** Kept for scripts that read it; the same address as `tokenAddress`. */
2799
+ usdcContract: tokenAddress
2783
2800
  };
2784
2801
  printResult(data);
2785
2802
  });
@@ -2789,13 +2806,15 @@ import { Command as Command57 } from "commander";
2789
2806
 
2790
2807
  // src/commands/wallet/balance.ts
2791
2808
  import { Command as Command49 } from "commander";
2792
- var walletBalanceCommand = new Command49("balance").description("Show USDC balance").option("--address <addr>", "Address to check (defaults to own wallet)").action(async (opts) => {
2809
+ var walletBalanceCommand = new Command49("balance").description("Show the wallet's payment-token balance on the selected network").option("--address <addr>", "Address to check (defaults to own wallet)").action(async (opts) => {
2793
2810
  let address = opts.address;
2794
2811
  if (!address) {
2795
2812
  const keystore = await loadKeystore();
2796
2813
  address = keystore.walletAddress;
2797
2814
  }
2798
- const result = await apiGet(`/api/wallet/balance?address=${address}`);
2815
+ const result = await apiGet(
2816
+ `/api/wallet/balance?address=${address}&chainId=${selectedNetwork().chainId}`
2817
+ );
2799
2818
  printResult(result);
2800
2819
  });
2801
2820
 
@@ -2919,7 +2938,7 @@ import { Command as Command51 } from "commander";
2919
2938
  function isValidAddress(addr) {
2920
2939
  return /^0x[a-fA-F0-9]{40}$/.test(addr);
2921
2940
  }
2922
- var setWithdrawalAddressCommand = new Command51("set-withdrawal-address").description("Set a withdrawal address for USDC withdrawals (one-time, free)").argument("<address>", "Ethereum address to receive withdrawals").action(async (address) => {
2941
+ var setWithdrawalAddressCommand = new Command51("set-withdrawal-address").description("Set a withdrawal address for payment-token withdrawals (one-time, free)").argument("<address>", "Ethereum address to receive withdrawals").action(async (address) => {
2923
2942
  if (!isValidAddress(address)) {
2924
2943
  printError("Invalid Ethereum address: must be 0x followed by 40 hex characters");
2925
2944
  return;
@@ -3133,7 +3152,7 @@ async function withdrawOnTempo(input) {
3133
3152
  token,
3134
3153
  to: withdrawalAddress,
3135
3154
  amount: BigInt(amountBaseUnits),
3136
- validBefore: Math.floor(Date.now() / 1e3) + MPP_TEMPO_DEFAULT_VALIDITY_SECONDS,
3155
+ validBefore: Math.floor(Date.now() / 1e3) + clientValidityWindowSeconds(chainId, MPP_TEMPO_DEFAULT_VALIDITY_SECONDS),
3137
3156
  format: "sender"
3138
3157
  });
3139
3158
  try {
@@ -3171,7 +3190,7 @@ var withdrawCommand = new Command58("withdraw").description(
3171
3190
  ).argument("<amount>", "Amount in whole tokens (e.g. 5 for 5 USDC or 5 OUSD)").action(async (amount) => {
3172
3191
  const parsed = parseFloat(amount);
3173
3192
  if (isNaN(parsed) || parsed <= 0) {
3174
- printError("Invalid amount: must be a positive number (e.g. 5 for 5 USDC)");
3193
+ printError("Invalid amount: must be a positive number (e.g. 5)");
3175
3194
  return;
3176
3195
  }
3177
3196
  const amountBaseUnits = String(Math.round(parsed * 1e6));
@@ -8,7 +8,7 @@ import {
8
8
  computeCreditOffer,
9
9
  openSandbox,
10
10
  readComputeView
11
- } from "./chunk-MI2GPMCZ.js";
11
+ } from "./chunk-LDCFKFF6.js";
12
12
  import {
13
13
  applyComputeCreditSetup,
14
14
  atomicToUsd,
@@ -18,7 +18,7 @@ import {
18
18
  planComputeCreditSetup,
19
19
  readComputeCreditBalance,
20
20
  usdToAtomic
21
- } from "./chunk-EIHZYRIU.js";
21
+ } from "./chunk-52Q2DCZN.js";
22
22
  import {
23
23
  MAX_RETIRED_RAILS,
24
24
  WORKSPACE_CONSENT_VERSION,
@@ -37,7 +37,7 @@ import {
37
37
  saveAgentPolicy,
38
38
  selectModels,
39
39
  settledRetiredRails
40
- } from "./chunk-F5SS4NUF.js";
40
+ } from "./chunk-GJQUALXN.js";
41
41
  import {
42
42
  BASE_CHANNEL_RAIL_ID,
43
43
  apiUrl,
@@ -54,7 +54,7 @@ import {
54
54
  parseX402Policy,
55
55
  saveX402Policy,
56
56
  x402SpendWindowAvailability
57
- } from "./chunk-3S63AB3C.js";
57
+ } from "./chunk-FRV3ZHUR.js";
58
58
  import {
59
59
  AgentLaunchError
60
60
  } from "./chunk-YM4S6IE4.js";
@@ -20503,6 +20503,14 @@ var OutputLimitError = class extends Error {
20503
20503
  this.name = "OutputLimitError";
20504
20504
  }
20505
20505
  };
20506
+ var ManifestLimitError = class extends Error {
20507
+ limit;
20508
+ constructor(limit) {
20509
+ super(`manifest_limit:${limit}`);
20510
+ this.limit = limit;
20511
+ this.name = "ManifestLimitError";
20512
+ }
20513
+ };
20506
20514
 
20507
20515
  // ../../packages/remote-tools/dist/channel.js
20508
20516
  var MAX_MESSAGE_BYTES = 64 * 1024;
@@ -20731,6 +20739,7 @@ var MAX_CONTEXT_FILE_BYTES = 64 * 1024;
20731
20739
  var MAX_RESULT_LIMIT = 1e4;
20732
20740
  var MAX_GREP_CONTEXT = 50;
20733
20741
  var HEARTBEAT_INTERVAL_MS = 6e4;
20742
+ var SYNC_MAX_TOTAL_BYTES = 256 * 1024 * 1024;
20734
20743
 
20735
20744
  // ../../packages/remote-tools/dist/prompt.js
20736
20745
  var REMOTE_CONTEXT_FILE_NAMES = ["AGENTS.md", "CLAUDE.md"];
@@ -21337,6 +21346,7 @@ function shellQuote(value) {
21337
21346
  }
21338
21347
  var EXIT_NOT_FOUND = 64;
21339
21348
  var EXIT_NOT_DIR = 65;
21349
+ var EXIT_IS_DIR = 66;
21340
21350
  var KILL_GRACE_SECONDS = 2;
21341
21351
  function unitName(sessionTag, n) {
21342
21352
  if (!/^[a-z0-9]{1,16}$/.test(sessionTag))
@@ -21401,6 +21411,49 @@ function globCommand(dir, pattern, ignore, limit) {
21401
21411
  args.push("--glob", shellQuote(`!${glob}`));
21402
21412
  return `cd -- ${shellQuote(dir)} 2>/dev/null || { [ -e ${shellQuote(dir)} ] && exit ${EXIT_NOT_DIR}; exit ${EXIT_NOT_FOUND}; }; ${args.join(" ")} | head -z -n ${Math.max(1, Math.floor(limit))}; rc=\${PIPESTATUS[0]}; [ "$rc" -eq 141 ] && exit 0; exit "$rc"`;
21403
21413
  }
21414
+ function manifestCommand(dir, prune) {
21415
+ const pruned = prune.length ? `\\( ${prune.map((name) => `-name ${shellQuote(name)}`).join(" -o ")} \\) -prune -o ` : "";
21416
+ const find = `find . -mindepth 1 ${pruned}`;
21417
+ return [
21418
+ `cd -- ${shellQuote(dir)} 2>/dev/null || { [ -e ${shellQuote(dir)} ] && exit ${EXIT_NOT_DIR}; exit ${EXIT_NOT_FOUND}; }`,
21419
+ `${find}\\( -type f -o -type l \\) -printf '%y\\0%s\\0%l\\0%P\\0' || exit 1`,
21420
+ `printf '=\\0'`,
21421
+ `${find}-type f -printf '%P\\0' | xargs -0 -r sha256sum -z -- 2>/dev/null`,
21422
+ "exit 0"
21423
+ ].join("\n");
21424
+ }
21425
+ function parseManifestOutput(stdout) {
21426
+ const fields = stdout.toString("utf8").split("\0");
21427
+ let separator = 0;
21428
+ while (separator < fields.length && fields[separator] !== "=")
21429
+ separator += 4;
21430
+ if (separator >= fields.length)
21431
+ throw new Error("Malformed manifest output");
21432
+ const hashes = /* @__PURE__ */ new Map();
21433
+ for (const line of fields.slice(separator + 1)) {
21434
+ const match = /^([0-9a-f]{64}) [ *](.*)$/s.exec(line);
21435
+ if (match)
21436
+ hashes.set(match[2], match[1]);
21437
+ }
21438
+ const entries = [];
21439
+ for (let i = 0; i < separator; i += 4) {
21440
+ const [type, size, target, rel] = fields.slice(i, i + 4);
21441
+ if (type === "l")
21442
+ entries.push({ path: rel, type: "symlink", target });
21443
+ else if (type === "f") {
21444
+ entries.push({ path: rel, type: "file", size: Number(size), sha256: hashes.get(rel) ?? "" });
21445
+ }
21446
+ }
21447
+ return entries.sort((a, b) => a.path < b.path ? -1 : a.path > b.path ? 1 : 0);
21448
+ }
21449
+ function symlinkCommand(linkPath, target) {
21450
+ const p = shellQuote(linkPath);
21451
+ return `if [ -d ${p} ] && [ ! -L ${p} ]; then exit ${EXIT_IS_DIR}; fi; mkdir -p -- "$(dirname -- ${p})" && ln -sfn -- ${shellQuote(target)} ${p}`;
21452
+ }
21453
+ function removeCommand(filePath) {
21454
+ const p = shellQuote(filePath);
21455
+ return `if [ -d ${p} ] && [ ! -L ${p} ]; then exit ${EXIT_IS_DIR}; fi; rm -f -- ${p}`;
21456
+ }
21404
21457
  function parseGlobOutput(stdout) {
21405
21458
  return stdout.toString("utf8").split("\0").filter((entry) => entry.length > 0);
21406
21459
  }
@@ -22291,6 +22344,56 @@ var SshSandboxBackend = class {
22291
22344
  }
22292
22345
  return { isDirectory: kind === "D" };
22293
22346
  }
22347
+ async manifest(dir, options) {
22348
+ const stop = new AbortController();
22349
+ const onAbort = () => stop.abort();
22350
+ options.signal?.addEventListener("abort", onAbort, { once: true });
22351
+ const out = [];
22352
+ let entries = 0;
22353
+ let overLimit = false;
22354
+ try {
22355
+ const { exitCode, stderr } = await this.collect(manifestCommand(dir, options.prune), stop.signal, (chunk) => {
22356
+ out.push(chunk);
22357
+ for (const byte of chunk)
22358
+ if (byte === 0)
22359
+ entries += 1;
22360
+ if (entries > (options.limit + 1) * 5 && !overLimit) {
22361
+ overLimit = true;
22362
+ stop.abort();
22363
+ }
22364
+ });
22365
+ if (exitCode === EXIT_NOT_FOUND)
22366
+ throw new SandboxFileError("ENOENT", "scandir", dir);
22367
+ if (exitCode === EXIT_NOT_DIR)
22368
+ throw new SandboxFileError("ENOTDIR", "scandir", dir);
22369
+ if (exitCode !== 0)
22370
+ throw new Error(`find failed in the sandbox (exit ${exitCode}): ${stderr}`);
22371
+ } catch (error) {
22372
+ if (overLimit)
22373
+ throw new ManifestLimitError(options.limit);
22374
+ throw error;
22375
+ } finally {
22376
+ options.signal?.removeEventListener("abort", onAbort);
22377
+ }
22378
+ const parsed = parseManifestOutput(Buffer.concat(out));
22379
+ if (parsed.length > options.limit)
22380
+ throw new ManifestLimitError(options.limit);
22381
+ return parsed;
22382
+ }
22383
+ async symlink(path6, target, options = {}) {
22384
+ await this.fileCommand(symlinkCommand(path6, target), "symlink", path6, options.signal);
22385
+ }
22386
+ async remove(path6, options = {}) {
22387
+ await this.fileCommand(removeCommand(path6), "unlink", path6, options.signal);
22388
+ }
22389
+ async fileCommand(command, syscall, path6, signal) {
22390
+ const { exitCode, stderr } = await this.collect(command, signal, () => void 0);
22391
+ if (exitCode === EXIT_IS_DIR)
22392
+ throw new SandboxFileError("EISDIR", syscall, path6);
22393
+ if (exitCode !== 0) {
22394
+ throw new SandboxFileError("EIO", syscall, path6, stderr || `exit ${exitCode}`);
22395
+ }
22396
+ }
22294
22397
  async exec(command, cwd, options) {
22295
22398
  const { conn } = await this.ensure(options.signal);
22296
22399
  const unit = this.nextUnit();
@@ -1,10 +1,10 @@
1
1
  import { createRequire as __tmCreateRequire } from 'node:module'; import { fileURLToPath as __tmFileURLToPath } from 'node:url'; import { dirname as __tmDirname } from 'node:path'; const require = __tmCreateRequire(import.meta.url); const __tmFilename = __tmFileURLToPath(import.meta.url); const __tmDirnameValue = __tmDirname(__tmFilename);
2
2
  import {
3
3
  openAgentChannels
4
- } from "./chunk-F5SS4NUF.js";
4
+ } from "./chunk-GJQUALXN.js";
5
5
  import {
6
6
  X402_INVOCATION_ID_PATTERN
7
- } from "./chunk-3S63AB3C.js";
7
+ } from "./chunk-FRV3ZHUR.js";
8
8
  import {
9
9
  AgentLaunchError
10
10
  } from "./chunk-YM4S6IE4.js";