@t2000/cli 10.17.4 → 10.19.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.
@@ -171,7 +171,7 @@ import {
171
171
  processEndpoint,
172
172
  processFlattenRoutes,
173
173
  restituteMsafeFastRouterSwapParams
174
- } from "./chunk-QSITA6GU.js";
174
+ } from "./chunk-3YV35WUN.js";
175
175
  import "./chunk-WHUYPKGH.js";
176
176
  import "./chunk-OCLKPYUU.js";
177
177
  import "./chunk-XE63VG7O.js";
@@ -351,4 +351,4 @@ export {
351
351
  processFlattenRoutes,
352
352
  restituteMsafeFastRouterSwapParams
353
353
  };
354
- //# sourceMappingURL=dist-WNY2TO7E.js.map
354
+ //# sourceMappingURL=dist-3WU6OGLY.js.map
@@ -211,10 +211,10 @@ import {
211
211
  verifyReceipt,
212
212
  walletExists,
213
213
  writeLimitsFile
214
- } from "./chunk-F2KFMF7W.js";
214
+ } from "./chunk-RHEUNSVF.js";
215
215
  import "./chunk-634W6JCI.js";
216
216
  import "./chunk-3ZUWXUSN.js";
217
- import "./chunk-QSITA6GU.js";
217
+ import "./chunk-3YV35WUN.js";
218
218
  import "./chunk-WHUYPKGH.js";
219
219
  import "./chunk-OCLKPYUU.js";
220
220
  import "./chunk-XE63VG7O.js";
@@ -437,4 +437,4 @@ export {
437
437
  walletExists,
438
438
  writeLimitsFile
439
439
  };
440
- //# sourceMappingURL=dist-7RYTY436.js.map
440
+ //# sourceMappingURL=dist-VOMEYPJS.js.map
package/dist/index.js CHANGED
@@ -32,10 +32,10 @@ import {
32
32
  validateAddress,
33
33
  verifyJobForSeller,
34
34
  walletExists
35
- } from "./chunk-F2KFMF7W.js";
35
+ } from "./chunk-RHEUNSVF.js";
36
36
  import "./chunk-634W6JCI.js";
37
37
  import "./chunk-3ZUWXUSN.js";
38
- import "./chunk-QSITA6GU.js";
38
+ import "./chunk-3YV35WUN.js";
39
39
  import "./chunk-WHUYPKGH.js";
40
40
  import "./chunk-OCLKPYUU.js";
41
41
  import "./chunk-XE63VG7O.js";
@@ -21823,10 +21823,6 @@ import { readFile, writeFile, mkdir } from "fs/promises";
21823
21823
  import { join, dirname } from "path";
21824
21824
  import { homedir } from "os";
21825
21825
  import { existsSync } from "fs";
21826
- var MCP_SERVER_ENTRY = {
21827
- command: "t2000",
21828
- args: ["mcp", "start"]
21829
- };
21830
21826
  var MCP_SERVER_KEY = "t2000";
21831
21827
  function getPlatformConfigs() {
21832
21828
  const home = homedir();
@@ -21863,15 +21859,6 @@ async function writeJsonFile(path2, data) {
21863
21859
  }
21864
21860
  await writeFile(path2, JSON.stringify(data, null, 2) + "\n", "utf-8");
21865
21861
  }
21866
- function withMcpEntry(config) {
21867
- return {
21868
- ...config,
21869
- mcpServers: {
21870
- ...config.mcpServers ?? {},
21871
- [MCP_SERVER_KEY]: { ...MCP_SERVER_ENTRY }
21872
- }
21873
- };
21874
- }
21875
21862
  function hasMcpEntry(config) {
21876
21863
  return typeof config.mcpServers === "object" && config.mcpServers !== null && MCP_SERVER_KEY in config.mcpServers;
21877
21864
  }
@@ -21891,18 +21878,19 @@ var { version: CLI_VERSION } = (() => {
21891
21878
  return require2("../../package.json");
21892
21879
  }
21893
21880
  })();
21894
- async function checkMcpClients() {
21881
+ async function staleStdioClients() {
21895
21882
  const platforms = getPlatformConfigs();
21896
- return Promise.all(
21883
+ const wired = await Promise.all(
21897
21884
  platforms.map(async (p) => ({ name: p.name, wired: hasMcpEntry(await readJsonFile(p.path)) }))
21898
21885
  );
21886
+ return wired.filter((c) => c.wired).map((c) => c.name);
21899
21887
  }
21900
21888
  function registerStatus(program3) {
21901
- program3.command("status").description("Health check: wallet, balances, limits, MCP wiring").option("--key <path>", "Custom wallet path (default ~/.t2000/wallet.key)").action(async (opts) => {
21889
+ program3.command("status").description("Health check: wallet, balances, limits").option("--key <path>", "Custom wallet path (default ~/.t2000/wallet.key)").action(async (opts) => {
21902
21890
  try {
21903
- const [agentResult, mcpClients] = await Promise.all([
21891
+ const [agentResult, staleStdio] = await Promise.all([
21904
21892
  tryWithAgent({ keyPath: opts.key }),
21905
- checkMcpClients()
21893
+ staleStdioClients()
21906
21894
  ]);
21907
21895
  let wallet = { created: false };
21908
21896
  let balance = null;
@@ -21924,7 +21912,7 @@ function registerStatus(program3) {
21924
21912
  };
21925
21913
  }
21926
21914
  if (isJsonMode()) {
21927
- printJson({ cliVersion: CLI_VERSION, wallet, balance, limits, mcpClients });
21915
+ printJson({ cliVersion: CLI_VERSION, wallet, balance, limits, staleStdio });
21928
21916
  return;
21929
21917
  }
21930
21918
  printBlank();
@@ -21952,14 +21940,10 @@ function registerStatus(program3) {
21952
21940
  } else {
21953
21941
  printKeyValue("Wallet", `${import_picocolors5.default.yellow("not created")} ${import_picocolors5.default.dim("\u2014 run `t2 init`")}`);
21954
21942
  }
21955
- const mcpSummary = mcpClients.map((c) => `${c.name} ${c.wired ? import_picocolors5.default.green("\u2713") : import_picocolors5.default.dim("\u2717")}`).join(" \xB7 ");
21956
- printKeyValue("MCP wired", mcpSummary);
21957
- if (!mcpClients.some((c) => c.wired)) {
21943
+ printKeyValue("MCP", "https://mcp.t2000.ai/mcp " + import_picocolors5.default.dim("(hosted \u2014 add as a connector in any MCP client)"));
21944
+ if (staleStdio.length > 0) {
21958
21945
  printLine(
21959
- import_picocolors5.default.dim(" Hosted: add https://mcp.t2000.ai/mcp as a custom connector in Claude.")
21960
- );
21961
- printLine(
21962
- import_picocolors5.default.dim(" Local: `t2 mcp install` wires the stdio server (advanced \u2014 keypair you hold).")
21946
+ import_picocolors5.default.yellow(` Stale stdio config in ${staleStdio.join(", ")} \u2014 the local server is retired; run \`t2 mcp uninstall\`.`)
21963
21947
  );
21964
21948
  }
21965
21949
  printBlank();
@@ -22271,7 +22255,7 @@ async function runEstimate(url, opts) {
22271
22255
  let req = accepts.find((a) => a.scheme === "exact" && a.network?.startsWith("sui:")) ?? accepts[0];
22272
22256
  let dialect = "x402";
22273
22257
  if (!req) {
22274
- const { parseMppSuiChallenge } = await import("./dist-7RYTY436.js");
22258
+ const { parseMppSuiChallenge } = await import("./dist-VOMEYPJS.js");
22275
22259
  const challenge = await parseMppSuiChallenge(response);
22276
22260
  if (!challenge) {
22277
22261
  throw new Error(
@@ -23084,61 +23068,6 @@ Subcommands:
23084
23068
  registerLimitReset(group);
23085
23069
  }
23086
23070
 
23087
- // src/commands/mcp/start.ts
23088
- function registerMcpStart(parent) {
23089
- parent.command("start", { isDefault: true }).description("Start MCP server (stdio transport \u2014 for AI client integration)").option("--key <path>", "Custom wallet path (default ~/.t2000/wallet.key)").action(async (opts) => {
23090
- let mod;
23091
- try {
23092
- mod = await import("./dist-26EILMT5.js");
23093
- } catch {
23094
- console.error("MCP server not installed. Run:\n npm install -g @t2000/mcp");
23095
- process.exit(1);
23096
- }
23097
- await mod.startMcpServer({ keyPath: opts.key });
23098
- });
23099
- }
23100
-
23101
- // src/commands/mcp/install.ts
23102
- async function runInstall() {
23103
- const platforms = getPlatformConfigs();
23104
- const results = [];
23105
- for (const platform of platforms) {
23106
- const config = await readJsonFile(platform.path);
23107
- if (hasMcpEntry(config)) {
23108
- results.push({ name: platform.name, slug: platform.slug, status: "exists" });
23109
- continue;
23110
- }
23111
- await writeJsonFile(platform.path, withMcpEntry(config));
23112
- results.push({ name: platform.name, slug: platform.slug, status: "added" });
23113
- }
23114
- return results;
23115
- }
23116
- function registerMcpInstall(parent) {
23117
- parent.command("install").description("Auto-configure the MCP server in Claude Desktop, Cursor, and Windsurf").action(async () => {
23118
- try {
23119
- const results = await runInstall();
23120
- if (isJsonMode()) {
23121
- printJson({ installed: results });
23122
- return;
23123
- }
23124
- printBlank();
23125
- for (const r of results) {
23126
- if (r.status === "exists") {
23127
- printInfo(`${r.name} already configured`);
23128
- } else {
23129
- printSuccess(`${r.name} configured`);
23130
- }
23131
- }
23132
- printBlank();
23133
- printInfo("Restart your AI platform to activate.");
23134
- printInfo(`Then ask: "what's my t2000 balance?"`);
23135
- printBlank();
23136
- } catch (error) {
23137
- handleError(error);
23138
- }
23139
- });
23140
- }
23141
-
23142
23071
  // src/commands/mcp/uninstall.ts
23143
23072
  import { existsSync as existsSync3 } from "fs";
23144
23073
  async function runUninstall() {
@@ -23160,7 +23089,7 @@ async function runUninstall() {
23160
23089
  return results;
23161
23090
  }
23162
23091
  function registerMcpUninstall(parent) {
23163
- parent.command("uninstall").description("Remove the t2000 MCP server entry from Claude Desktop, Cursor, and Windsurf").action(async () => {
23092
+ parent.command("uninstall").description("Remove the retired stdio server entry from Claude Desktop, Cursor, and Windsurf configs").action(async () => {
23164
23093
  try {
23165
23094
  const results = await runUninstall();
23166
23095
  if (isJsonMode()) {
@@ -23183,19 +23112,41 @@ function registerMcpUninstall(parent) {
23183
23112
  }
23184
23113
 
23185
23114
  // src/commands/mcp/index.ts
23115
+ var CONNECT_SNIPPET = `{
23116
+ "mcpServers": {
23117
+ "t2000": {
23118
+ "url": "https://mcp.t2000.ai/mcp"
23119
+ }
23120
+ }
23121
+ }`;
23122
+ function printRetired() {
23123
+ printBlank();
23124
+ printInfo("The local stdio MCP server is retired.");
23125
+ printLine("");
23126
+ printLine("Connect any MCP client to the hosted server instead \u2014 one URL,");
23127
+ printLine("OAuth sign-in, spend limits you set in the console:");
23128
+ printLine("");
23129
+ for (const line of CONNECT_SNIPPET.split("\n")) {
23130
+ printLine(` ${line}`);
23131
+ }
23132
+ printLine("");
23133
+ printLine("Docs: https://docs.t2000.ai/passport-connect");
23134
+ printLine("Terminal workflows: use the t2 CLI itself.");
23135
+ printLine("Old client configs: clean up with `t2 mcp uninstall`.");
23136
+ printBlank();
23137
+ }
23186
23138
  function registerMcp(program3) {
23187
- const group = program3.command("mcp").description("MCP server + AI-client integration").addHelpText(
23188
- "after",
23189
- `
23190
- Subcommands:
23191
- $ t2 mcp Start the MCP stdio server (default)
23192
- $ t2 mcp start Same as above (explicit)
23193
- $ t2 mcp install Auto-configure Claude / Cursor / Windsurf
23194
- $ t2 mcp uninstall Remove t2000 from every AI-client config
23195
- `
23196
- );
23197
- registerMcpStart(group);
23198
- registerMcpInstall(group);
23139
+ const group = program3.command("mcp", { hidden: true }).description("Retired \u2014 connect clients to https://mcp.t2000.ai/mcp instead");
23140
+ group.action(() => {
23141
+ printRetired();
23142
+ process.exitCode = 1;
23143
+ });
23144
+ for (const retired of ["start", "install"]) {
23145
+ group.command(retired, { hidden: true }).description("Retired \u2014 connect clients to https://mcp.t2000.ai/mcp instead").action(() => {
23146
+ printRetired();
23147
+ process.exitCode = 1;
23148
+ });
23149
+ }
23199
23150
  registerMcpUninstall(group);
23200
23151
  }
23201
23152
 
@@ -23377,7 +23328,7 @@ function registerSkillsCheck(parent) {
23377
23328
  printInfo(
23378
23329
  "No installed skills found (checked ./ and ~/ for .agents/skills, .cursor/rules, .claude/skills)."
23379
23330
  );
23380
- printInfo("Install: t2 skills install \xB7 MCP clients: t2 mcp install (no files, always fresh)");
23331
+ printInfo("Install: t2 skills install \xB7 MCP clients get skills via mcp.t2000.ai (no files, always fresh)");
23381
23332
  printBlank();
23382
23333
  return;
23383
23334
  }
@@ -23470,7 +23421,7 @@ function registerSkillsInstall(parent) {
23470
23421
  printBlank();
23471
23422
  printInfo("Reload your AI client to pick up the new skill files.");
23472
23423
  if (target !== "cursor") {
23473
- printInfo("(For an MCP-aware client, prefer `t2 mcp install` \u2014 same skills, zero local files.)");
23424
+ printInfo("(Clients connected to mcp.t2000.ai already have these as /skill-<name> prompts.)");
23474
23425
  }
23475
23426
  printBlank();
23476
23427
  } catch (err) {
@@ -23540,7 +23491,7 @@ function registerSkillsUninstall(parent) {
23540
23491
 
23541
23492
  // src/commands/skills/index.ts
23542
23493
  function registerSkills(program3) {
23543
- const group = program3.command("skills").description("Install agent SKILL.md playbooks locally (alternative to `t2 mcp install`)").addHelpText(
23494
+ const group = program3.command("skills").description("Install agent SKILL.md playbooks locally").addHelpText(
23544
23495
  "after",
23545
23496
  `
23546
23497
  Subcommands:
@@ -23551,8 +23502,8 @@ Subcommands:
23551
23502
  $ t2 skills check Are installed skills current? (agents: run at session start)
23552
23503
  $ t2 skills uninstall Remove installed skills
23553
23504
 
23554
- For MCP-aware clients (Claude Desktop, Cursor, Windsurf), prefer
23555
- \`t2 mcp install\` \u2014 same skills, no local files.
23505
+ MCP clients connected to https://mcp.t2000.ai/mcp get every skill as a
23506
+ \`/skill-<name>\` prompt automatically \u2014 no local files needed.
23556
23507
  `
23557
23508
  );
23558
23509
  registerSkillsList(group);
@@ -23978,10 +23929,13 @@ Subcommands:
23978
23929
  );
23979
23930
  group.command("sell").argument(
23980
23931
  "[endpoint]",
23981
- "Your x402 endpoint URL (https). Omit with --remove to clear the listing."
23932
+ "Your API origin (https://api.example.com \u2014 every paid route in its openapi.json gets listed) or one x402 route URL. Omit with --remove to clear the listing."
23982
23933
  ).description(
23983
- 'List your x402 endpoint on your public Agent ID profile. The endpoint is live-probed (must answer 402 with a Sui payment challenge), then set on-chain \u2014 sponsored, gasless. Same flow as the console\u2019s "Sell your API".'
23934
+ 'List your x402 API on your public Agent ID profile. An origin expands via {origin}/openapi.json \u2014 every paid route is live-probed (must answer 402 with a Sui payment challenge) and becomes a store card; a single 402 URL lists just that route. Then set on-chain \u2014 sponsored, gasless. Same flow as the console\u2019s "Sell your API".'
23984
23935
  ).option("--remove", "Remove the listing instead").option(
23936
+ "--primary <path>",
23937
+ "Route to record as the on-chain primary endpoint (default: the cheapest paid route)"
23938
+ ).option(
23985
23939
  "--category <category>",
23986
23940
  `Directory category for your listing: ${AGENT_CATEGORIES.join(" | ")} (required unless already set on your profile)`
23987
23941
  ).option("--key <path>", "Custom wallet path (default ~/.t2000/wallet.key)").option("--api <url>", `API base URL (default ${DEFAULT_API_BASE3})`).action(
@@ -24003,13 +23957,27 @@ Subcommands:
24003
23957
  const prepRes = await fetch(`${base}/agent/endpoint/prepare`, {
24004
23958
  method: "POST",
24005
23959
  headers: { "Content-Type": "application/json" },
24006
- body: JSON.stringify({ address, endpoint: target })
23960
+ body: JSON.stringify({
23961
+ address,
23962
+ endpoint: target,
23963
+ ...opts.primary ? { primary: opts.primary } : {}
23964
+ })
24007
23965
  });
24008
23966
  const prep = await prepRes.json().catch(() => ({}));
24009
23967
  if (!prepRes.ok) {
24010
- const issues = prep.probe?.issues ?? [];
24011
23968
  const msg = typeof prep.error === "string" ? prep.error : prep.error?.message ?? `HTTP ${prepRes.status}`;
24012
- const detail = issues.map((i) => ` \u2717 ${i.message ?? i.code}`).join("\n");
23969
+ const lines = (prep.probe?.issues ?? []).map(
23970
+ (i) => ` \u2717 ${i.message ?? i.code}`
23971
+ );
23972
+ for (const r of prep.routes ?? []) {
23973
+ if (r.probeOk === false) {
23974
+ lines.push(` \u2717 ${r.method ?? "POST"} ${r.path}`);
23975
+ for (const i of r.issues ?? []) {
23976
+ lines.push(` ${i.message ?? i.code}`);
23977
+ }
23978
+ }
23979
+ }
23980
+ const detail = lines.join("\n");
24013
23981
  throw new Error(detail ? `${msg}
24014
23982
  ${detail}` : msg);
24015
23983
  }
@@ -24022,12 +23990,16 @@ ${detail}` : msg);
24022
23990
  method: "POST",
24023
23991
  body: { nonce: prep.nonce, address, signature }
24024
23992
  });
23993
+ const primaryUrl = prep.primary?.url ?? target;
24025
23994
  if (isJsonMode()) {
24026
23995
  printJson({
24027
23996
  address,
24028
- endpoint: opts.remove ? null : target,
23997
+ endpoint: opts.remove ? null : primaryUrl,
24029
23998
  listed: !opts.remove,
24030
23999
  probe: prep.probe ?? null,
24000
+ origin: prep.origin ?? null,
24001
+ primary: prep.primary ?? null,
24002
+ routes: prep.routes ?? [],
24031
24003
  digest: sub.digest
24032
24004
  });
24033
24005
  return;
@@ -24036,12 +24008,29 @@ ${detail}` : msg);
24036
24008
  if (opts.remove) {
24037
24009
  printSuccess("Listing removed.");
24038
24010
  } else {
24039
- printSuccess("Listed \u2014 your endpoint is live on your public profile.");
24040
- if (prep.probe?.amount) {
24041
- printKeyValue("Price", `${prep.probe.amount} USDC per call`);
24011
+ const routes = prep.routes ?? [];
24012
+ if (routes.length > 1) {
24013
+ printSuccess(
24014
+ `Listed \u2014 ${routes.length} paid routes are live on your public profile.`
24015
+ );
24016
+ for (const r of routes) {
24017
+ const mark = r.path === prep.primary?.path ? " (primary)" : "";
24018
+ const price = r.priceUsdc ? `${r.priceUsdc} USDC` : "?";
24019
+ printKeyValue(
24020
+ ` ${r.method ?? "POST"} ${r.path}`,
24021
+ `${price}${mark}`
24022
+ );
24023
+ }
24024
+ } else {
24025
+ printSuccess(
24026
+ "Listed \u2014 your endpoint is live on your public profile."
24027
+ );
24028
+ if (prep.probe?.amount) {
24029
+ printKeyValue("Price", `${prep.probe.amount} USDC per call`);
24030
+ }
24042
24031
  }
24043
- printKeyValue("Endpoint", target);
24044
- printInfo(`Buyers pay it with: t2 pay ${target}`);
24032
+ printKeyValue("Endpoint", primaryUrl);
24033
+ printInfo(`Buyers pay it with: t2 pay ${primaryUrl}`);
24045
24034
  printKeyValue("Profile", `https://t2000.ai/${address}`);
24046
24035
  }
24047
24036
  printKeyValue("Tx", String(sub.digest));
@@ -25188,10 +25177,10 @@ Wallet:
25188
25177
  $ t2 limit set --daily 100 Change the daily spend cap (default $100/day)
25189
25178
 
25190
25179
  Connect an AI client:
25191
- Hosted (recommended) Add https://mcp.t2000.ai/mcp as a custom connector
25192
- in Claude, then approve with Google \u2014 no install,
25193
- no key in the client, spend limits you set.
25194
- $ t2 mcp install Local stdio server (advanced) \u2014 for a keypair you hold
25180
+ One URL Add https://mcp.t2000.ai/mcp as a connector in
25181
+ Claude, Cursor, or any MCP client, then approve
25182
+ with Google \u2014 no install, no key in the client,
25183
+ spend limits you set.
25195
25184
  $ t2 skills install Install skills as local SKILL.md files
25196
25185
 
25197
25186
  Models (Audric \u2014 a separate product, billed in credit):