@lucid-agents/taskmarket 1.23.0 → 1.24.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.
@@ -1,5 +1,5 @@
1
1
  {
2
- "taskmarket": "1.23.0",
2
+ "taskmarket": "1.24.0",
3
3
  "manifestVersion": 1,
4
4
  "pi": {
5
5
  "package": "@earendil-works/pi-coding-agent",
@@ -10,9 +10,9 @@ import {
10
10
  selectRail,
11
11
  uncertainPurchases,
12
12
  withdrawalHatch
13
- } from "./chunk-CAJH6AVP.js";
14
- import "./chunk-FSK3D3S5.js";
15
- import "./chunk-OGYFQL45.js";
13
+ } from "./chunk-X5CLHJXJ.js";
14
+ import "./chunk-D6ODOHET.js";
15
+ import "./chunk-H554XEEE.js";
16
16
  import "./chunk-XJOB4NMV.js";
17
17
  import "./chunk-YM4S6IE4.js";
18
18
  import "./chunk-S7SJMJ2I.js";
@@ -1,11 +1,11 @@
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
  x402FeePost
4
- } from "./chunk-YXCEPGO4.js";
4
+ } from "./chunk-MLFKB6XH.js";
5
5
  import {
6
6
  createWalletAccountFromKeystore,
7
7
  signMessage
8
- } from "./chunk-FSK3D3S5.js";
8
+ } from "./chunk-D6ODOHET.js";
9
9
  import {
10
10
  READ_AUTH_ADDRESS_HEADER,
11
11
  READ_AUTH_SIGNATURE_HEADER,
@@ -19,7 +19,7 @@ import {
19
19
  getTaskmarketHome,
20
20
  isRecordingPendingResponse,
21
21
  loadKeystore
22
- } from "./chunk-OGYFQL45.js";
22
+ } from "./chunk-H554XEEE.js";
23
23
 
24
24
  // src/lib/read-auth.ts
25
25
  async function signReadAuth() {
@@ -11,7 +11,7 @@ import {
11
11
  loadKeystore,
12
12
  mppAttributionMemo,
13
13
  parseMppChallenge
14
- } from "./chunk-OGYFQL45.js";
14
+ } from "./chunk-H554XEEE.js";
15
15
 
16
16
  // ../../packages/x402-payer/dist/api.js
17
17
  var X402_PAYER_API_VERSION = 1;
@@ -6,14 +6,14 @@ import {
6
6
  loadDeliverableRecord,
7
7
  readComputeView,
8
8
  taskStage
9
- } from "./chunk-HGTLUZBR.js";
9
+ } from "./chunk-QRSYWACU.js";
10
10
  import {
11
11
  activeClaim,
12
12
  captureProblem,
13
13
  killedSession,
14
14
  loadSyncState,
15
15
  orphanOf
16
- } from "./chunk-SXPG3I34.js";
16
+ } from "./chunk-KO37PSQJ.js";
17
17
  import {
18
18
  allocationViews,
19
19
  channelView,
@@ -21,12 +21,12 @@ import {
21
21
  openAgentChannels,
22
22
  uncertainPurchases,
23
23
  withdrawalHatch
24
- } from "./chunk-CAJH6AVP.js";
24
+ } from "./chunk-X5CLHJXJ.js";
25
25
  import {
26
26
  SandboxListOutputSchema,
27
27
  apiUrl,
28
28
  selectedNetwork
29
- } from "./chunk-OGYFQL45.js";
29
+ } from "./chunk-H554XEEE.js";
30
30
  import {
31
31
  AGENT_VIEW_VERSION,
32
32
  blockingPurchases,
@@ -575,6 +575,38 @@ var HookAttachmentConfigurationSchema = z6.object({
575
575
  // The chain's effective taskLimits().maxHooks (8 below rev025 or until the owner sets it).
576
576
  maxHooks: z6.number().int().positive()
577
577
  });
578
+ var HookListingReasonSchema = z6.enum(["registry", "protocol-default"]);
579
+ var HookRegistryEntrySchema = z6.object({
580
+ address: HookAddressSchema,
581
+ chainId: z6.number().int().positive(),
582
+ listed: z6.literal(true),
583
+ listingReasons: z6.array(HookListingReasonSchema).min(1),
584
+ // Null for a protocol default that has no merged manifest on this chain yet.
585
+ name: z6.string().nullable(),
586
+ slug: z6.string().nullable(),
587
+ version: z6.string().nullable(),
588
+ description: z6.string().nullable(),
589
+ manifestPath: z6.string().nullable(),
590
+ sourceVerificationStatus: z6.string().nullable(),
591
+ // The onchain usage for this address on this chain, or null when no task has attached it.
592
+ observed: HookIndexEntrySchema.nullable()
593
+ });
594
+ var HookUnlistedEntrySchema = z6.object({
595
+ address: HookAddressSchema,
596
+ chainId: z6.number().int().positive(),
597
+ listed: z6.literal(false),
598
+ observed: HookIndexEntrySchema
599
+ });
600
+ var HookRegistryInputSchema = z6.object({
601
+ address: HookAddressSchema.optional()
602
+ });
603
+ var HookRegistryResponseSchema = z6.object({
604
+ chainId: z6.number().int().positive(),
605
+ listed: z6.array(HookRegistryEntrySchema),
606
+ unlisted: z6.array(HookUnlistedEntrySchema).max(100),
607
+ // False when the diamond's protocol defaults could not be read, so `listed` may lack them.
608
+ protocolDefaultsKnown: z6.boolean()
609
+ });
578
610
 
579
611
  // ../../packages/shared/dist/schemas/sponsored-task-vault.schemas.js
580
612
  import { z as z7 } from "zod";
@@ -4989,6 +5021,10 @@ var TASKMARKET_CHAINS = Object.freeze({
4989
5021
  defaultPlatformFeeBps: 0,
4990
5022
  indexer: { head: "latest", logRangeBlocks: 1e4 },
4991
5023
  erc8004: { ...ERC8004_MAINNET },
5024
+ sponsoredTasks: {
5025
+ factory: "0x92076c62558b4f77Bddd3ca8E00271128AfeD818",
5026
+ feeBank: "0x407852432810342e77FEd378bE6C1D3336b0913A"
5027
+ },
4992
5028
  wallets: { coinbase: true },
4993
5029
  features: baseFeatures(8453)
4994
5030
  }),
@@ -5014,6 +5050,10 @@ var TASKMARKET_CHAINS = Object.freeze({
5014
5050
  defaultPlatformFeeBps: 0,
5015
5051
  indexer: { head: "latest", logRangeBlocks: 1e4 },
5016
5052
  erc8004: { ...ERC8004_TESTNET },
5053
+ sponsoredTasks: {
5054
+ factory: "0xec2b7e70edB7738199549A4e45c2d34EA2B9b929",
5055
+ feeBank: "0xbCC7D52B0661C866D6087b41B302c37b0B193761"
5056
+ },
5017
5057
  wallets: { coinbase: true },
5018
5058
  features: baseFeatures(84532)
5019
5059
  }),
@@ -1,7 +1,7 @@
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
  getTaskmarketHome
4
- } from "./chunk-OGYFQL45.js";
4
+ } from "./chunk-H554XEEE.js";
5
5
  import {
6
6
  AgentLaunchError
7
7
  } from "./chunk-YM4S6IE4.js";
@@ -16,7 +16,7 @@ import {
16
16
  readMppTempoChallenge,
17
17
  reconcileX402Payment,
18
18
  withX402FileLock
19
- } from "./chunk-FSK3D3S5.js";
19
+ } from "./chunk-D6ODOHET.js";
20
20
  import {
21
21
  ApiError,
22
22
  ComputeCreditBuyOutputSchema,
@@ -39,7 +39,7 @@ import {
39
39
  selectedNetwork,
40
40
  withChainId,
41
41
  withIdempotentWrite
42
- } from "./chunk-OGYFQL45.js";
42
+ } from "./chunk-H554XEEE.js";
43
43
 
44
44
  // src/lib/x402-fee.ts
45
45
  import { randomUUID as randomUUID3 } from "crypto";
@@ -8,7 +8,7 @@ import {
8
8
  unsafeHostPath,
9
9
  withFileLock,
10
10
  writeAtomic
11
- } from "./chunk-SXPG3I34.js";
11
+ } from "./chunk-KO37PSQJ.js";
12
12
  import {
13
13
  buyComputeCredit,
14
14
  fetchComputePricing,
@@ -16,10 +16,10 @@ import {
16
16
  loadComputeCreditConfig,
17
17
  onComputeBalanceObserved,
18
18
  readComputeCreditStatus
19
- } from "./chunk-YXCEPGO4.js";
19
+ } from "./chunk-MLFKB6XH.js";
20
20
  import {
21
21
  getTaskmarketHome
22
- } from "./chunk-OGYFQL45.js";
22
+ } from "./chunk-H554XEEE.js";
23
23
  import {
24
24
  burnRate,
25
25
  computeLow
@@ -22,7 +22,7 @@ import {
22
22
  unresolvedCount,
23
23
  updateSyncState,
24
24
  uploadWorkspace
25
- } from "./chunk-SXPG3I34.js";
25
+ } from "./chunk-KO37PSQJ.js";
26
26
  import {
27
27
  AgentLaunchError
28
28
  } from "./chunk-YM4S6IE4.js";
@@ -11,12 +11,12 @@ import {
11
11
  listX402Payments,
12
12
  loadX402Policy,
13
13
  rpcUrlForNetwork
14
- } from "./chunk-FSK3D3S5.js";
14
+ } from "./chunk-D6ODOHET.js";
15
15
  import {
16
16
  getTaskmarketHome,
17
17
  keystoreExists,
18
18
  loadKeystore
19
- } from "./chunk-OGYFQL45.js";
19
+ } from "./chunk-H554XEEE.js";
20
20
  import {
21
21
  failureDetail,
22
22
  failureDetailOf,
@@ -6,26 +6,26 @@ import {
6
6
  } from "./chunk-4ZC6SH7H.js";
7
7
  import {
8
8
  listSandboxes
9
- } from "./chunk-RYJKYQ6P.js";
10
- import "./chunk-HGTLUZBR.js";
11
- import "./chunk-SXPG3I34.js";
12
- import "./chunk-YXCEPGO4.js";
9
+ } from "./chunk-FIMQQTFU.js";
10
+ import "./chunk-QRSYWACU.js";
11
+ import "./chunk-KO37PSQJ.js";
12
+ import "./chunk-MLFKB6XH.js";
13
13
  import {
14
14
  channelView,
15
15
  loadAgentPolicy,
16
16
  openAgentChannels
17
- } from "./chunk-CAJH6AVP.js";
17
+ } from "./chunk-X5CLHJXJ.js";
18
18
  import {
19
19
  getX402PolicyPath,
20
20
  loadX402Policy,
21
21
  rpcUrlForNetwork
22
- } from "./chunk-FSK3D3S5.js";
22
+ } from "./chunk-D6ODOHET.js";
23
23
  import {
24
24
  apiUrl,
25
25
  keystoreExists,
26
26
  loadKeystore,
27
27
  withChainId
28
- } from "./chunk-OGYFQL45.js";
28
+ } from "./chunk-H554XEEE.js";
29
29
  import {
30
30
  AGENT_VIEW_VERSION
31
31
  } from "./chunk-XJOB4NMV.js";
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ import {
14
14
  signReadAuth,
15
15
  submitTaskFiles,
16
16
  taskAccessGrantHeaders
17
- } from "./chunk-4SZBEOE7.js";
17
+ } from "./chunk-4WQPXCKL.js";
18
18
  import {
19
19
  ComputeCreditError,
20
20
  applyComputeCreditSetup,
@@ -36,7 +36,7 @@ import {
36
36
  refusedPaidWrite,
37
37
  releasePendingComputePurchase,
38
38
  resolvePendingComputePurchases
39
- } from "./chunk-YXCEPGO4.js";
39
+ } from "./chunk-MLFKB6XH.js";
40
40
  import {
41
41
  MPP_TEMPO_DEFAULT_VALIDITY_SECONDS,
42
42
  X402PayError,
@@ -59,7 +59,7 @@ import {
59
59
  signSponsoredTempoTransfer,
60
60
  signTaskmarketFeePayment,
61
61
  signTypedData
62
- } from "./chunk-FSK3D3S5.js";
62
+ } from "./chunk-D6ODOHET.js";
63
63
  import {
64
64
  ActivityFeedInputSchema,
65
65
  ActivityHeatmapInputSchema,
@@ -197,7 +197,7 @@ import {
197
197
  withChainId,
198
198
  withErrorContext,
199
199
  withIdempotentWrite
200
- } from "./chunk-OGYFQL45.js";
200
+ } from "./chunk-H554XEEE.js";
201
201
  import {
202
202
  channelLines
203
203
  } from "./chunk-XJOB4NMV.js";
@@ -282,10 +282,19 @@ function readLastError() {
282
282
  }
283
283
 
284
284
  // src/lib/output.ts
285
+ function cliWarning(code, message, details) {
286
+ return { ...details, code, message };
287
+ }
285
288
  function printResult(data, options) {
286
289
  const idempotencyKey = options?.idempotencyKey;
290
+ const warnings = options?.warnings ?? [];
287
291
  console.log(
288
- JSON.stringify({ ok: true, data, ...idempotencyKey !== void 0 ? { idempotencyKey } : {} })
292
+ JSON.stringify({
293
+ ok: true,
294
+ data,
295
+ ...idempotencyKey !== void 0 ? { idempotencyKey } : {},
296
+ ...warnings.length > 0 ? { warnings } : {}
297
+ })
289
298
  );
290
299
  }
291
300
  function x402FailureFields(error) {
@@ -334,9 +343,6 @@ function renderFailure(error, options) {
334
343
  function printError(message, options) {
335
344
  return renderFailure(new Error(message), options);
336
345
  }
337
- function printWarning(message) {
338
- process.stderr.write(JSON.stringify({ ok: false, error: message }) + "\n");
339
- }
340
346
 
341
347
  // src/lib/agent.ts
342
348
  function legacyAgentIdChain(keystore) {
@@ -651,7 +657,7 @@ function sanitizeEmailUsername(agentId, suffix) {
651
657
  const candidate = `${base}-${suffix}`;
652
658
  return /^[a-z0-9][a-z0-9-]{1,28}[a-z0-9]$/.test(candidate) ? candidate : null;
653
659
  }
654
- async function tryRegisterEmail(deviceId, apiToken, username, explicit) {
660
+ async function tryRegisterEmail(deviceId, apiToken, username, explicit, warnings) {
655
661
  try {
656
662
  const { data: reg } = await apiPost("/api/emails/register", {
657
663
  deviceId,
@@ -662,8 +668,12 @@ async function tryRegisterEmail(deviceId, apiToken, username, explicit) {
662
668
  } catch (err) {
663
669
  if (explicit) {
664
670
  const msg = err instanceof Error ? err.message : String(err);
665
- printWarning(
666
- `Email registration failed: ${msg}. Run: taskmarket email register --username ${username}`
671
+ warnings.push(
672
+ cliWarning(
673
+ "email_registration_failed",
674
+ `Email registration failed: ${msg}. Run: taskmarket email register --username ${username}`,
675
+ { username, retryCommand: `taskmarket email register --username ${username}` }
676
+ )
667
677
  );
668
678
  }
669
679
  return null;
@@ -781,7 +791,8 @@ var initCommand = new Command2("init").description(
781
791
  } catch {
782
792
  }
783
793
  const username = opts.email ?? (agentId && networkInfo ? sanitizeEmailUsername(agentId, String(selectedNetwork().chainId)) : null);
784
- const emailAddress = username ? await tryRegisterEmail(deviceId, apiToken, username, !!opts.email) : null;
794
+ const warnings = [];
795
+ const emailAddress = username ? await tryRegisterEmail(deviceId, apiToken, username, !!opts.email, warnings) : null;
785
796
  let chain;
786
797
  try {
787
798
  chain = chainInfoFor(networkInfo, selectedNetwork().chainId);
@@ -789,15 +800,18 @@ var initCommand = new Command2("init").description(
789
800
  renderFailure(err);
790
801
  return;
791
802
  }
792
- printResult({
793
- address,
794
- agentId,
795
- network: chain?.networkName ?? networkInfo?.networkName,
796
- chainId: chain?.chainId ?? networkInfo?.chainId,
797
- paymentMethod: chain?.paymentMethod,
798
- feeModel: chain?.feeModel,
799
- emailAddress
800
- });
803
+ printResult(
804
+ {
805
+ address,
806
+ agentId,
807
+ network: chain?.networkName ?? networkInfo?.networkName,
808
+ chainId: chain?.chainId ?? networkInfo?.chainId,
809
+ paymentMethod: chain?.paymentMethod,
810
+ feeModel: chain?.feeModel,
811
+ emailAddress
812
+ },
813
+ { warnings }
814
+ );
801
815
  });
802
816
 
803
817
  // src/commands/address.ts
@@ -1539,6 +1553,42 @@ async function x402Post(path3, body, options) {
1539
1553
  });
1540
1554
  }
1541
1555
 
1556
+ // src/lib/hook-registry.ts
1557
+ async function fetchHookRegistry(address) {
1558
+ const query3 = address ? `?address=${address}` : "";
1559
+ return await apiGet(withChainId(`/api/hooks/registry${query3}`));
1560
+ }
1561
+ async function describeHookListings(hooks, alwaysListed = []) {
1562
+ if (hooks.length === 0) return { hooks: [], warnings: [] };
1563
+ let registry;
1564
+ try {
1565
+ registry = await fetchHookRegistry();
1566
+ if (!registry || !Array.isArray(registry.listed)) return null;
1567
+ } catch {
1568
+ return null;
1569
+ }
1570
+ const listed = new Map(registry.listed.map((entry) => [entry.address.toLowerCase(), entry]));
1571
+ const implicit = new Set(alwaysListed.map((address) => address.toLowerCase()));
1572
+ const listings = [];
1573
+ const warnings = [];
1574
+ for (const raw of hooks) {
1575
+ const address = raw.toLowerCase();
1576
+ const entry = listed.get(address);
1577
+ const isListed = entry !== void 0 || implicit.has(address);
1578
+ listings.push({ address, listed: isListed, name: entry?.name ?? null });
1579
+ if (!isListed) {
1580
+ warnings.push(
1581
+ cliWarning(
1582
+ "hook_unlisted",
1583
+ `Hook ${address} is not listed in the hook registry for chain ${registry.chainId}. It was attached as given; run \`taskmarket hooks list\` for listed hooks.`,
1584
+ { address, chainId: registry.chainId }
1585
+ )
1586
+ );
1587
+ }
1588
+ }
1589
+ return { hooks: listings, warnings };
1590
+ }
1591
+
1542
1592
  // src/lib/settlement-terms.ts
1543
1593
  var TERM_FLAGS = {
1544
1594
  stakeRequired: "--stake-required",
@@ -1692,6 +1742,51 @@ function parseStakeOptions(opts) {
1692
1742
  }
1693
1743
  return { stakeRequired: true, stakeBps };
1694
1744
  }
1745
+ var METRIC_DESCRIPTION_MAX = 500;
1746
+ var METRIC_TARGET_MAX = 200;
1747
+ var TASK_DROP_NAME_MAX = 80;
1748
+ var TASK_DROP_DESCRIPTION_MAX = 500;
1749
+ function parseMetricAndDropOptions(opts) {
1750
+ const fields = {};
1751
+ for (const [flag, value, max, key] of [
1752
+ ["--metric-description", opts.metricDescription, METRIC_DESCRIPTION_MAX, "metricDescription"],
1753
+ ["--metric-target", opts.metricTarget, METRIC_TARGET_MAX, "metricTarget"]
1754
+ ]) {
1755
+ if (value === void 0) continue;
1756
+ if (opts.mode !== "benchmark") {
1757
+ return { error: `${flag} is only valid with --mode benchmark` };
1758
+ }
1759
+ if (!value.trim()) return { error: `${flag} must not be empty` };
1760
+ if (value.length > max) return { error: `${flag} must be at most ${max} characters` };
1761
+ fields[key] = value;
1762
+ }
1763
+ if (opts.taskDrop !== void 0 && opts.newTaskDrop !== void 0) {
1764
+ return { error: "--task-drop and --new-task-drop cannot be combined" };
1765
+ }
1766
+ if (opts.newTaskDropDescription !== void 0 && opts.newTaskDrop === void 0) {
1767
+ return { error: "--new-task-drop-description requires --new-task-drop" };
1768
+ }
1769
+ if (opts.taskDrop !== void 0) {
1770
+ const taskDropId = opts.taskDrop.trim();
1771
+ if (!taskDropId) return { error: "--task-drop must not be empty" };
1772
+ fields.taskDropId = taskDropId;
1773
+ }
1774
+ if (opts.newTaskDrop !== void 0) {
1775
+ const name = opts.newTaskDrop.trim();
1776
+ if (!name) return { error: "--new-task-drop must not be empty" };
1777
+ if (name.length > TASK_DROP_NAME_MAX) {
1778
+ return { error: `--new-task-drop must be at most ${TASK_DROP_NAME_MAX} characters` };
1779
+ }
1780
+ const description = opts.newTaskDropDescription?.trim();
1781
+ if (description && description.length > TASK_DROP_DESCRIPTION_MAX) {
1782
+ return {
1783
+ error: `--new-task-drop-description must be at most ${TASK_DROP_DESCRIPTION_MAX} characters`
1784
+ };
1785
+ }
1786
+ fields.taskDropCreate = description ? { name, description } : { name };
1787
+ }
1788
+ return { fields };
1789
+ }
1695
1790
  var createCmd = new Command8("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(
1696
1791
  "--task-visibility <mode>",
1697
1792
  "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.",
@@ -1706,7 +1801,22 @@ var createCmd = new Command8("create").description("Create a new task (costs the
1706
1801
  "--submission-visibility <mode>",
1707
1802
  "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.",
1708
1803
  "public"
1709
- ).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(
1804
+ ).option("--tags <tags>", "Comma-separated tags").option(
1805
+ "--metric-description <text>",
1806
+ 'Benchmark metric workers are ranked on, e.g. "Test suite pass rate" (benchmark mode only, max 500 characters)'
1807
+ ).option(
1808
+ "--metric-target <value>",
1809
+ "Target value for the benchmark metric, e.g. 98 (benchmark mode only, max 200 characters)"
1810
+ ).option(
1811
+ "--task-drop <dropId>",
1812
+ "Add the task to a Task Drop you own; its subscribers are emailed when the task is published. See `taskmarket drops`."
1813
+ ).option(
1814
+ "--new-task-drop <name>",
1815
+ "Create a new Task Drop with this name (max 80 characters) and add the task to it. Cannot be combined with --task-drop."
1816
+ ).option(
1817
+ "--new-task-drop-description <text>",
1818
+ "Description for the --new-task-drop drop (optional, max 500 characters)"
1819
+ ).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(
1710
1820
  "--max-price <amount>",
1711
1821
  "Maximum bid price in the payment token (required for auction mode)"
1712
1822
  ).option(
@@ -1720,7 +1830,7 @@ var createCmd = new Command8("create").description("Create a new task (costs the
1720
1830
  "Floor price in the payment token for dutch clock (required for dutch)"
1721
1831
  ).option(
1722
1832
  "--hook <address>",
1723
- "Custom ITMPHook contract address (repeat in execution order; protocol defaults run first)",
1833
+ "Custom ITMPHook contract address (repeat in execution order; protocol defaults run first). Run `taskmarket hooks list` for hooks listed (verified) in the hook registry; an unlisted address is still attached, with a hook_unlisted warning",
1724
1834
  (value, previous = []) => [...previous, value],
1725
1835
  []
1726
1836
  ).option(
@@ -1870,6 +1980,10 @@ var createCmd = new Command8("create").description("Create a new task (costs the
1870
1980
  );
1871
1981
  }
1872
1982
  }
1983
+ const metricAndDrop = parseMetricAndDropOptions(opts);
1984
+ if ("error" in metricAndDrop) {
1985
+ return void printError(metricAndDrop.error);
1986
+ }
1873
1987
  const stakeFlags = parseStakeOptions(opts);
1874
1988
  if ("error" in stakeFlags) {
1875
1989
  return void printError(stakeFlags.error);
@@ -1895,6 +2009,7 @@ var createCmd = new Command8("create").description("Create a new task (costs the
1895
2009
  if (opts.accessPassword) {
1896
2010
  body.accessPassword = opts.accessPassword;
1897
2011
  }
2012
+ Object.assign(body, metricAndDrop.fields);
1898
2013
  if (opts.pitchDeadline) {
1899
2014
  body.pitchDeadline = parseInt(opts.pitchDeadline, 10) * 3600;
1900
2015
  }
@@ -2092,6 +2207,10 @@ var createCmd = new Command8("create").description("Create a new task (costs the
2092
2207
  } catch {
2093
2208
  }
2094
2209
  }
2210
+ const hookListings = await describeHookListings(
2211
+ hooks,
2212
+ sponsoredTaskHookAddress ? [sponsoredTaskHookAddress] : []
2213
+ );
2095
2214
  let feeBps;
2096
2215
  if (opts.evaluator) {
2097
2216
  if (!ethAddrRe.test(opts.evaluator)) {
@@ -2133,9 +2252,14 @@ var createCmd = new Command8("create").description("Create a new task (costs the
2133
2252
  taskId: result.taskId,
2134
2253
  terms,
2135
2254
  termsPreset: termsPresetLabel(terms),
2136
- ...evaluatorStaked ? { evaluatorStake: evaluatorStakeBaseUnits } : {}
2255
+ ...result.taskDropId ? { taskDropId: result.taskDropId } : {},
2256
+ ...evaluatorStaked ? { evaluatorStake: evaluatorStakeBaseUnits } : {},
2257
+ ...hookListings && hookListings.hooks.length > 0 ? { hooks: hookListings.hooks } : {}
2137
2258
  },
2138
- { idempotencyKey }
2259
+ {
2260
+ idempotencyKey,
2261
+ ...hookListings && hookListings.warnings.length > 0 ? { warnings: hookListings.warnings } : {}
2262
+ }
2139
2263
  );
2140
2264
  }
2141
2265
  );
@@ -3693,7 +3817,7 @@ async function runAgentCommand(options) {
3693
3817
  try {
3694
3818
  const { assertAgentCompatibility } = await import("./compatibility-636WJOEX.js");
3695
3819
  const pi = assertAgentCompatibility();
3696
- const { runAgent } = await import("./launch-VZ5JBM5R.js");
3820
+ const { runAgent } = await import("./launch-LJPPWU53.js");
3697
3821
  result = await runAgent({
3698
3822
  model: options.model,
3699
3823
  pi,
@@ -3752,13 +3876,13 @@ function agentManagementCommands() {
3752
3876
  const status = new Command48("status").description(
3753
3877
  "Show the agent channels (locked, charged, refundable), purchases with an unknown outcome, the sandbox and compute credit. Reads only."
3754
3878
  ).option("--json", "Print the versioned JSON envelope").action(async (options) => {
3755
- const { collectAgentStatus, statusLines } = await import("./status-RHVQJID5.js");
3879
+ const { collectAgentStatus, statusLines } = await import("./status-I2JO7G7X.js");
3756
3880
  await run(options, () => collectAgentStatus(), statusLines);
3757
3881
  });
3758
3882
  const doctor = new Command48("doctor").description(
3759
3883
  "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."
3760
3884
  ).option("--json", "Print the versioned JSON envelope").action(async (options) => {
3761
- const { runDoctor, doctorLines } = await import("./doctor-YP2Z6WNE.js");
3885
+ const { runDoctor, doctorLines } = await import("./doctor-VD2X6DWP.js");
3762
3886
  const report = await run(options, () => runDoctor(), doctorLines);
3763
3887
  if (report && !report.ok) process.exitCode = 1;
3764
3888
  });
@@ -3769,7 +3893,7 @@ function agentManagementCommands() {
3769
3893
  "Reconcile the open purchases of this channel, as status lists it; also reaches retired channels"
3770
3894
  ).option("--json", "Print the versioned JSON envelope").action(
3771
3895
  async (invocationId, options) => {
3772
- const { reconcileChannelPurchases, reconcileInvocation } = await import("./reconcile-VVNBTJRJ.js");
3896
+ const { reconcileChannelPurchases, reconcileInvocation } = await import("./reconcile-MW5A3PCQ.js");
3773
3897
  const choice = { rail: options.rail, channel: options.channel };
3774
3898
  if (invocationId !== void 0) {
3775
3899
  await run(
@@ -3827,7 +3951,7 @@ function agentManagementCommands() {
3827
3951
  `Not a USDC amount: ${options.amount} (digits, at most 6 decimals)`
3828
3952
  );
3829
3953
  }
3830
- const { openAgentChannels, requestTopUp, selectRail, withdrawalHatch } = await import("./channels-Z52MJ5YT.js");
3954
+ const { openAgentChannels, requestTopUp, selectRail, withdrawalHatch } = await import("./channels-2CFKY3AB.js");
3831
3955
  const { rails } = await openAgentChannels();
3832
3956
  const result = await requestTopUp(selectRail(rails, options.rail), amount);
3833
3957
  return {
@@ -3851,8 +3975,8 @@ function agentManagementCommands() {
3851
3975
  async () => {
3852
3976
  await requireExperimental();
3853
3977
  const { AGENT_VIEW_VERSION } = await import("./budget-view-J6L7X6EY.js");
3854
- const { closeChannel, openAgentChannels, selectChannel } = await import("./channels-Z52MJ5YT.js");
3855
- const { reconcileLeasedPurchase } = await import("./reconcile-VVNBTJRJ.js");
3978
+ const { closeChannel, openAgentChannels, selectChannel } = await import("./channels-2CFKY3AB.js");
3979
+ const { reconcileLeasedPurchase } = await import("./reconcile-MW5A3PCQ.js");
3856
3980
  const opened = await openAgentChannels();
3857
3981
  const { rail, retired } = selectChannel(opened, options);
3858
3982
  const result = await closeChannel(
@@ -3923,7 +4047,7 @@ function agentManagementCommands() {
3923
4047
  options,
3924
4048
  async () => {
3925
4049
  await requireExperimental();
3926
- const { runPull } = await import("./sync-pull-C3VA3C26.js");
4050
+ const { runPull } = await import("./sync-pull-OEIMF2XX.js");
3927
4051
  const { terminalPrompter } = await import("./prompter-LSICEYSQ.js");
3928
4052
  return runPull(options, {
3929
4053
  interactive: Boolean(process.stdin.isTTY && process.stdout.isTTY) && !options.json,
@@ -4430,14 +4554,17 @@ var walletImportCommand = new Command55("import").description("Import an existin
4430
4554
  );
4431
4555
  }
4432
4556
  }
4433
- if (keySource === "flag") {
4434
- process.stderr.write(
4435
- JSON.stringify({
4436
- warning: "Private key was passed via --key flag and may be visible in shell history and ps aux."
4437
- }) + "\n"
4438
- );
4439
- }
4440
- printResult({ address, agentId });
4557
+ printResult(
4558
+ { address, agentId },
4559
+ {
4560
+ warnings: keySource === "flag" ? [
4561
+ cliWarning(
4562
+ "private_key_in_argv",
4563
+ "Private key was passed via --key flag and may be visible in shell history and ps aux."
4564
+ )
4565
+ ] : []
4566
+ }
4567
+ );
4441
4568
  });
4442
4569
 
4443
4570
  // src/commands/wallet/set-withdrawal-address.ts
@@ -4480,12 +4607,16 @@ async function fetchWithdrawalAddress(address, chainId) {
4480
4607
  function noWithdrawalAddressMessage(chainId) {
4481
4608
  return `No withdrawal address set on chain ${chainId}. The withdrawal address is per chain; run: ${taskmarketCommandFor(chainId)} wallet set-withdrawal-address <address>`;
4482
4609
  }
4483
- async function verifyWithdrawalAddress(keystore, chainId, serverAddress, log = (line) => process.stderr.write(line + "\n")) {
4610
+ async function verifyWithdrawalAddress(keystore, chainId, serverAddress, warnings) {
4484
4611
  const pinned = pinnedWithdrawalAddress(keystore, chainId);
4485
4612
  if (!pinned) {
4486
4613
  await pinWithdrawalAddress(keystore, chainId, serverAddress);
4487
- log(
4488
- `Note: pinned withdrawal address ${serverAddress} for chain ${chainId} in the local keystore.`
4614
+ warnings.push(
4615
+ cliWarning(
4616
+ "withdrawal_address_pinned",
4617
+ `Pinned withdrawal address ${serverAddress} for chain ${chainId} in the local keystore.`,
4618
+ { chainId, withdrawalAddress: serverAddress }
4619
+ )
4489
4620
  );
4490
4621
  return serverAddress;
4491
4622
  }
@@ -4560,10 +4691,18 @@ var setWithdrawalAddressCommand = new Command56("set-withdrawal-address").descri
4560
4691
  {
4561
4692
  chainId: actedOn,
4562
4693
  withdrawalAddress: result.withdrawalAddress,
4563
- accountRecoveryCode: result.accountRecoveryCode,
4564
- warning: `SAVE THIS ACCOUNT RECOVERY CODE NOW. It is the recovery code for chain ${actedOn} only, will never be shown again, and there is no way to recover it if lost -- this chain's withdrawal address could then never be changed again. Save it in more than one independent place (e.g. a password manager entry AND a printed copy).`
4694
+ accountRecoveryCode: result.accountRecoveryCode
4565
4695
  },
4566
- { idempotencyKey }
4696
+ {
4697
+ idempotencyKey,
4698
+ warnings: [
4699
+ cliWarning(
4700
+ "recovery_code_shown_once",
4701
+ `SAVE THIS ACCOUNT RECOVERY CODE NOW. It is the recovery code for chain ${actedOn} only, will never be shown again, and there is no way to recover it if lost -- this chain's withdrawal address could then never be changed again. Save it in more than one independent place (e.g. a password manager entry AND a printed copy).`,
4702
+ { chainId: actedOn }
4703
+ )
4704
+ ]
4705
+ }
4567
4706
  );
4568
4707
  });
4569
4708
 
@@ -4628,10 +4767,18 @@ var changeWithdrawalAddressCommand = new Command58("change-withdrawal-address").
4628
4767
  {
4629
4768
  chainId: actedOn,
4630
4769
  withdrawalAddress: result.withdrawalAddress,
4631
- accountRecoveryCode: result.accountRecoveryCode,
4632
- warning: `SAVE THIS NEW ACCOUNT RECOVERY CODE NOW. It is the recovery code for chain ${actedOn} only. The code you just used is no longer valid on this chain. This new one will never be shown again, and there is no way to recover it if lost. Save it in more than one independent place (e.g. a password manager entry AND a printed copy).`
4770
+ accountRecoveryCode: result.accountRecoveryCode
4633
4771
  },
4634
- { idempotencyKey }
4772
+ {
4773
+ idempotencyKey,
4774
+ warnings: [
4775
+ cliWarning(
4776
+ "recovery_code_shown_once",
4777
+ `SAVE THIS NEW ACCOUNT RECOVERY CODE NOW. It is the recovery code for chain ${actedOn} only. The code you just used is no longer valid on this chain. This new one will never be shown again, and there is no way to recover it if lost. Save it in more than one independent place (e.g. a password manager entry AND a printed copy).`,
4778
+ { chainId: actedOn }
4779
+ )
4780
+ ]
4781
+ }
4635
4782
  );
4636
4783
  });
4637
4784
 
@@ -4694,10 +4841,18 @@ var revealRecoveryCodeCommand = new Command60("reveal-recovery-code").descriptio
4694
4841
  printResult(
4695
4842
  {
4696
4843
  chainId: actedOn,
4697
- accountRecoveryCode: result.accountRecoveryCode,
4698
- warning: `SAVE THIS ACCOUNT RECOVERY CODE NOW. It is the recovery code for chain ${actedOn} only, will never be shown again, and there is no way to recover it if lost -- this chain's withdrawal address could then never be changed again. Save it in more than one independent place (e.g. a password manager entry AND a printed copy).`
4844
+ accountRecoveryCode: result.accountRecoveryCode
4699
4845
  },
4700
- { idempotencyKey }
4846
+ {
4847
+ idempotencyKey,
4848
+ warnings: [
4849
+ cliWarning(
4850
+ "recovery_code_shown_once",
4851
+ `SAVE THIS ACCOUNT RECOVERY CODE NOW. It is the recovery code for chain ${actedOn} only, will never be shown again, and there is no way to recover it if lost -- this chain's withdrawal address could then never be changed again. Save it in more than one independent place (e.g. a password manager entry AND a printed copy).`,
4852
+ { chainId: actedOn }
4853
+ )
4854
+ ]
4855
+ }
4701
4856
  );
4702
4857
  });
4703
4858
 
@@ -4760,6 +4915,7 @@ var withdrawDreamsCommand = new Command62("withdraw-dreams").description("Withdr
4760
4915
  );
4761
4916
  return;
4762
4917
  }
4918
+ const warnings = [];
4763
4919
  if (!destination) {
4764
4920
  let addressResponse;
4765
4921
  try {
@@ -4776,7 +4932,8 @@ var withdrawDreamsCommand = new Command62("withdraw-dreams").description("Withdr
4776
4932
  destination = await verifyWithdrawalAddress(
4777
4933
  keystore,
4778
4934
  balance.chainId,
4779
- addressResponse.withdrawalAddress
4935
+ addressResponse.withdrawalAddress,
4936
+ warnings
4780
4937
  );
4781
4938
  } catch (err) {
4782
4939
  renderFailure(err);
@@ -4814,7 +4971,7 @@ var withdrawDreamsCommand = new Command62("withdraw-dreams").description("Withdr
4814
4971
  dreamsPerUsdc: result.dreamsPerUsdc,
4815
4972
  usdEquivalent: result.usdEquivalent
4816
4973
  },
4817
- { idempotencyKey }
4974
+ { idempotencyKey, warnings }
4818
4975
  );
4819
4976
  });
4820
4977
 
@@ -5086,11 +5243,13 @@ var withdrawCommand = new Command65("withdraw").description(
5086
5243
  return;
5087
5244
  }
5088
5245
  let withdrawalAddress;
5246
+ const warnings = [];
5089
5247
  try {
5090
5248
  withdrawalAddress = await verifyWithdrawalAddress(
5091
5249
  keystore,
5092
5250
  chainId,
5093
- addressResponse.withdrawalAddress
5251
+ addressResponse.withdrawalAddress,
5252
+ warnings
5094
5253
  );
5095
5254
  } catch (err) {
5096
5255
  renderFailure(err);
@@ -5103,7 +5262,7 @@ var withdrawCommand = new Command65("withdraw").description(
5103
5262
  withdrawalAddress,
5104
5263
  amountBaseUnits
5105
5264
  });
5106
- printResult(withdrawOutput(result2, chainId), { idempotencyKey: idempotencyKey2 });
5265
+ printResult(withdrawOutput(result2, chainId), { idempotencyKey: idempotencyKey2, warnings });
5107
5266
  return;
5108
5267
  }
5109
5268
  let domain;
@@ -5141,7 +5300,7 @@ var withdrawCommand = new Command65("withdraw").description(
5141
5300
  signature
5142
5301
  }
5143
5302
  );
5144
- printResult(withdrawOutput(result, chainId), { idempotencyKey });
5303
+ printResult(withdrawOutput(result, chainId), { idempotencyKey, warnings });
5145
5304
  });
5146
5305
 
5147
5306
  // src/commands/encrypt.ts
@@ -11243,11 +11402,13 @@ var sponsoredTaskClaimCommand = new Command108("claim").description("Claim your
11243
11402
  return;
11244
11403
  }
11245
11404
  let destination;
11405
+ const warnings = [];
11246
11406
  try {
11247
11407
  destination = await verifyWithdrawalAddress(
11248
11408
  keystore,
11249
11409
  vault.chainId,
11250
- addressResponse.withdrawalAddress
11410
+ addressResponse.withdrawalAddress,
11411
+ warnings
11251
11412
  );
11252
11413
  } catch (err) {
11253
11414
  renderFailure(err);
@@ -11306,7 +11467,7 @@ var sponsoredTaskClaimCommand = new Command108("claim").description("Claim your
11306
11467
  proof: entitlement.proof
11307
11468
  }
11308
11469
  );
11309
- printResult(result, { idempotencyKey });
11470
+ printResult(result, { idempotencyKey, warnings });
11310
11471
  });
11311
11472
 
11312
11473
  // src/commands/sponsored-task/rewards.ts
@@ -11447,20 +11608,35 @@ var dropsCommand = new Command111("drops").description("Browse Task Drops and ma
11447
11608
 
11448
11609
  // src/commands/hooks.ts
11449
11610
  import { Command as Command112 } from "commander";
11450
- var listCommand5 = new Command112("list").description("List observed hooks and their active-phase task counts on the selected --network").option("--limit <n>", "Maximum hooks to return (1-100)", "50").action(async (opts) => {
11611
+ var listCommand5 = new Command112("list").description(
11612
+ "List hooks listed (verified) in the hook registry on the selected --network, then observed hooks that are not listed"
11613
+ ).option("--limit <n>", "Maximum unlisted observed hooks to return (1-100)", "50").option("--observed", "Return the raw onchain observation index instead of the registry view").action(async (opts) => {
11451
11614
  try {
11452
11615
  const input = parseInput(HookIndexInputSchema, { limit: optionalInt(opts.limit) });
11453
- printResult(await apiGet(withChainId(`/api/hooks?limit=${input.limit}`)));
11616
+ if (opts.observed) {
11617
+ printResult(await apiGet(withChainId(`/api/hooks?limit=${input.limit}`)));
11618
+ return;
11619
+ }
11620
+ const registry = await fetchHookRegistry();
11621
+ printResult({ ...registry, unlisted: registry.unlisted.slice(0, input.limit) });
11454
11622
  } catch (err) {
11455
11623
  renderFailure(err);
11456
11624
  }
11457
11625
  });
11458
- var showCommand3 = new Command112("show").description("Show one observed hook by address on the selected --network").argument("<address>", "Hook contract address").action(async (address) => {
11626
+ var showCommand3 = new Command112("show").description(
11627
+ "Show one hook on the selected --network: its registry listing, or its onchain observation marked unlisted"
11628
+ ).argument("<address>", "Hook contract address").action(async (address) => {
11459
11629
  try {
11460
11630
  const input = parseInput(HookGetInputSchema, { address });
11461
- const result = await apiGet(withChainId(`/api/hooks/${input.address}`));
11462
- if (result === null || result === void 0) {
11463
- throw new Error(`Hook ${input.address} has not been observed on this network`);
11631
+ const registry = await fetchHookRegistry(input.address.toLowerCase());
11632
+ const wanted = input.address.toLowerCase();
11633
+ const listed = registry.listed.find((hook) => hook.address.toLowerCase() === wanted);
11634
+ const unlisted = registry.unlisted.find((hook) => hook.address.toLowerCase() === wanted);
11635
+ const result = listed ?? unlisted;
11636
+ if (!result) {
11637
+ throw new Error(
11638
+ `Hook ${input.address} is not listed in the hook registry and has not been observed on this network`
11639
+ );
11464
11640
  }
11465
11641
  printResult(result);
11466
11642
  } catch (err) {
@@ -7,7 +7,7 @@ import {
7
7
  recordSessionEnd,
8
8
  recordSessionStart,
9
9
  uploadPlan
10
- } from "./chunk-PKUB7FZE.js";
10
+ } from "./chunk-WWENRXXT.js";
11
11
  import {
12
12
  TaskOperationError,
13
13
  authorizeUploads,
@@ -28,7 +28,7 @@ import {
28
28
  submitUploadedArtifacts,
29
29
  taskAccessGrantHeaders,
30
30
  taskAwardsOf
31
- } from "./chunk-4SZBEOE7.js";
31
+ } from "./chunk-4WQPXCKL.js";
32
32
  import {
33
33
  terminalPrompter
34
34
  } from "./chunk-ZIC2YCLV.js";
@@ -68,7 +68,7 @@ import {
68
68
  sha256Hex,
69
69
  specHash,
70
70
  taskStage
71
- } from "./chunk-HGTLUZBR.js";
71
+ } from "./chunk-QRSYWACU.js";
72
72
  import {
73
73
  BrokerConnector,
74
74
  OutputLimitError,
@@ -80,7 +80,7 @@ import {
80
80
  serveSandboxChannel,
81
81
  withFileLock,
82
82
  writeAtomic
83
- } from "./chunk-SXPG3I34.js";
83
+ } from "./chunk-KO37PSQJ.js";
84
84
  import {
85
85
  applyComputeCreditSetup,
86
86
  atomicToUsd,
@@ -90,7 +90,7 @@ import {
90
90
  planComputeCreditSetup,
91
91
  readComputeCreditBalance,
92
92
  usdToAtomic
93
- } from "./chunk-YXCEPGO4.js";
93
+ } from "./chunk-MLFKB6XH.js";
94
94
  import {
95
95
  MAX_RETIRED_RAILS,
96
96
  WORKSPACE_CONSENT_VERSION,
@@ -110,7 +110,7 @@ import {
110
110
  routeOfCatalogRow,
111
111
  saveAgentPolicy,
112
112
  settledRetiredRails
113
- } from "./chunk-CAJH6AVP.js";
113
+ } from "./chunk-X5CLHJXJ.js";
114
114
  import {
115
115
  BASE_CHANNEL_RAIL_ID,
116
116
  createBaseChannelPayer,
@@ -124,7 +124,7 @@ import {
124
124
  rpcUrlForNetwork,
125
125
  saveX402Policy,
126
126
  x402SpendWindowAvailability
127
- } from "./chunk-FSK3D3S5.js";
127
+ } from "./chunk-D6ODOHET.js";
128
128
  import {
129
129
  IntentStatusResponseSchema,
130
130
  NetworkChainInfoSchema,
@@ -137,7 +137,7 @@ import {
137
137
  piCodingAgentTools,
138
138
  selectedNetwork,
139
139
  taskmarketChain
140
- } from "./chunk-OGYFQL45.js";
140
+ } from "./chunk-H554XEEE.js";
141
141
  import {
142
142
  AGENT_VIEW_VERSION,
143
143
  describeFailureDetail,
@@ -30890,6 +30890,38 @@ var HookAttachmentConfigurationSchema = external_exports.object({
30890
30890
  // The chain's effective taskLimits().maxHooks (8 below rev025 or until the owner sets it).
30891
30891
  maxHooks: external_exports.number().int().positive()
30892
30892
  });
30893
+ var HookListingReasonSchema = external_exports.enum(["registry", "protocol-default"]);
30894
+ var HookRegistryEntrySchema = external_exports.object({
30895
+ address: HookAddressSchema,
30896
+ chainId: external_exports.number().int().positive(),
30897
+ listed: external_exports.literal(true),
30898
+ listingReasons: external_exports.array(HookListingReasonSchema).min(1),
30899
+ // Null for a protocol default that has no merged manifest on this chain yet.
30900
+ name: external_exports.string().nullable(),
30901
+ slug: external_exports.string().nullable(),
30902
+ version: external_exports.string().nullable(),
30903
+ description: external_exports.string().nullable(),
30904
+ manifestPath: external_exports.string().nullable(),
30905
+ sourceVerificationStatus: external_exports.string().nullable(),
30906
+ // The onchain usage for this address on this chain, or null when no task has attached it.
30907
+ observed: HookIndexEntrySchema.nullable()
30908
+ });
30909
+ var HookUnlistedEntrySchema = external_exports.object({
30910
+ address: HookAddressSchema,
30911
+ chainId: external_exports.number().int().positive(),
30912
+ listed: external_exports.literal(false),
30913
+ observed: HookIndexEntrySchema
30914
+ });
30915
+ var HookRegistryInputSchema = external_exports.object({
30916
+ address: HookAddressSchema.optional()
30917
+ });
30918
+ var HookRegistryResponseSchema = external_exports.object({
30919
+ chainId: external_exports.number().int().positive(),
30920
+ listed: external_exports.array(HookRegistryEntrySchema),
30921
+ unlisted: external_exports.array(HookUnlistedEntrySchema).max(100),
30922
+ // False when the diamond's protocol defaults could not be read, so `listed` may lack them.
30923
+ protocolDefaultsKnown: external_exports.boolean()
30924
+ });
30893
30925
 
30894
30926
  // ../../packages/shared/dist/schemas/sponsored-task-vault.schemas.js
30895
30927
  init_cjs_shims();
@@ -50247,6 +50279,10 @@ var TASKMARKET_CHAINS = Object.freeze({
50247
50279
  defaultPlatformFeeBps: 0,
50248
50280
  indexer: { head: "latest", logRangeBlocks: 1e4 },
50249
50281
  erc8004: { ...ERC8004_MAINNET },
50282
+ sponsoredTasks: {
50283
+ factory: "0x92076c62558b4f77Bddd3ca8E00271128AfeD818",
50284
+ feeBank: "0x407852432810342e77FEd378bE6C1D3336b0913A"
50285
+ },
50250
50286
  wallets: { coinbase: true },
50251
50287
  features: baseFeatures(8453)
50252
50288
  }),
@@ -50272,6 +50308,10 @@ var TASKMARKET_CHAINS = Object.freeze({
50272
50308
  defaultPlatformFeeBps: 0,
50273
50309
  indexer: { head: "latest", logRangeBlocks: 1e4 },
50274
50310
  erc8004: { ...ERC8004_TESTNET },
50311
+ sponsoredTasks: {
50312
+ factory: "0xec2b7e70edB7738199549A4e45c2d34EA2B9b929",
50313
+ feeBank: "0xbCC7D52B0661C866D6087b41B302c37b0B193761"
50314
+ },
50275
50315
  wallets: { coinbase: true },
50276
50316
  features: baseFeatures(84532)
50277
50317
  }),
@@ -3,14 +3,14 @@ import {
3
3
  channelView,
4
4
  openAgentChannels,
5
5
  selectChannel
6
- } from "./chunk-CAJH6AVP.js";
6
+ } from "./chunk-X5CLHJXJ.js";
7
7
  import {
8
8
  BASE_CHANNEL_RAIL_ID,
9
9
  X402_INVOCATION_ID_PATTERN,
10
10
  getX402JournalPath,
11
11
  listX402Payments
12
- } from "./chunk-FSK3D3S5.js";
13
- import "./chunk-OGYFQL45.js";
12
+ } from "./chunk-D6ODOHET.js";
13
+ import "./chunk-H554XEEE.js";
14
14
  import {
15
15
  AGENT_VIEW_VERSION,
16
16
  LOST_RESPONSE_TEXT,
@@ -7,13 +7,13 @@ import {
7
7
  statusLines,
8
8
  syncLines,
9
9
  taskLines
10
- } from "./chunk-RYJKYQ6P.js";
11
- import "./chunk-HGTLUZBR.js";
12
- import "./chunk-SXPG3I34.js";
13
- import "./chunk-YXCEPGO4.js";
14
- import "./chunk-CAJH6AVP.js";
15
- import "./chunk-FSK3D3S5.js";
16
- import "./chunk-OGYFQL45.js";
10
+ } from "./chunk-FIMQQTFU.js";
11
+ import "./chunk-QRSYWACU.js";
12
+ import "./chunk-KO37PSQJ.js";
13
+ import "./chunk-MLFKB6XH.js";
14
+ import "./chunk-X5CLHJXJ.js";
15
+ import "./chunk-D6ODOHET.js";
16
+ import "./chunk-H554XEEE.js";
17
17
  import "./chunk-XJOB4NMV.js";
18
18
  import "./chunk-YM4S6IE4.js";
19
19
  import "./chunk-S7SJMJ2I.js";
@@ -11,7 +11,7 @@ import {
11
11
  savedWorkspace,
12
12
  summarize,
13
13
  unsavedPaths
14
- } from "./chunk-PKUB7FZE.js";
14
+ } from "./chunk-WWENRXXT.js";
15
15
  import {
16
16
  BrokerConnector,
17
17
  SandboxUnavailableError,
@@ -27,11 +27,11 @@ import {
27
27
  releaseClaim,
28
28
  unresolvedCount,
29
29
  updateSyncState
30
- } from "./chunk-SXPG3I34.js";
30
+ } from "./chunk-KO37PSQJ.js";
31
31
  import {
32
32
  apiUrl,
33
33
  loadKeystore
34
- } from "./chunk-OGYFQL45.js";
34
+ } from "./chunk-H554XEEE.js";
35
35
  import {
36
36
  AgentLaunchError
37
37
  } from "./chunk-YM4S6IE4.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lucid-agents/taskmarket",
3
- "version": "1.23.0",
3
+ "version": "1.24.0",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "taskmarket": "./dist/index.js"
@@ -28,13 +28,13 @@
28
28
  "tsx": "^4.7.0",
29
29
  "typescript": "^5.3.3",
30
30
  "vitest": "^2.0.0",
31
- "@taskmarket/agent-host": "0.0.1",
32
31
  "@taskmarket/contracts": "0.0.0",
32
+ "@taskmarket/agent-host": "0.0.1",
33
33
  "@taskmarket/eslint-config": "0.0.0",
34
+ "@taskmarket/remote-tools": "0.0.1",
34
35
  "@taskmarket/prettier-config": "0.0.0",
35
36
  "@taskmarket/shared": "2.0.0",
36
- "@taskmarket/x402-payer": "0.1.0",
37
- "@taskmarket/remote-tools": "0.0.1"
37
+ "@taskmarket/x402-payer": "0.1.0"
38
38
  },
39
39
  "files": [
40
40
  "dist",