@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.
- package/README.md +4 -6
- package/dist/{chunk-QSITA6GU.js → chunk-3YV35WUN.js} +876 -1709
- package/dist/chunk-3YV35WUN.js.map +1 -0
- package/dist/{chunk-F2KFMF7W.js → chunk-RHEUNSVF.js} +42 -4
- package/dist/{chunk-F2KFMF7W.js.map → chunk-RHEUNSVF.js.map} +1 -1
- package/dist/{dist-WNY2TO7E.js → dist-3WU6OGLY.js} +2 -2
- package/dist/{dist-7RYTY436.js → dist-VOMEYPJS.js} +3 -3
- package/dist/index.js +106 -117
- package/dist/index.js.map +1 -1
- package/package.json +3 -4
- package/dist/chunk-QSITA6GU.js.map +0 -1
- package/dist/dist-26EILMT5.js +0 -147534
- package/dist/dist-26EILMT5.js.map +0 -1
- /package/dist/{dist-7RYTY436.js.map → dist-3WU6OGLY.js.map} +0 -0
- /package/dist/{dist-WNY2TO7E.js.map → dist-VOMEYPJS.js.map} +0 -0
|
@@ -171,7 +171,7 @@ import {
|
|
|
171
171
|
processEndpoint,
|
|
172
172
|
processFlattenRoutes,
|
|
173
173
|
restituteMsafeFastRouterSwapParams
|
|
174
|
-
} from "./chunk-
|
|
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-
|
|
354
|
+
//# sourceMappingURL=dist-3WU6OGLY.js.map
|
|
@@ -211,10 +211,10 @@ import {
|
|
|
211
211
|
verifyReceipt,
|
|
212
212
|
walletExists,
|
|
213
213
|
writeLimitsFile
|
|
214
|
-
} from "./chunk-
|
|
214
|
+
} from "./chunk-RHEUNSVF.js";
|
|
215
215
|
import "./chunk-634W6JCI.js";
|
|
216
216
|
import "./chunk-3ZUWXUSN.js";
|
|
217
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
35
|
+
} from "./chunk-RHEUNSVF.js";
|
|
36
36
|
import "./chunk-634W6JCI.js";
|
|
37
37
|
import "./chunk-3ZUWXUSN.js";
|
|
38
|
-
import "./chunk-
|
|
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
|
|
21881
|
+
async function staleStdioClients() {
|
|
21895
21882
|
const platforms = getPlatformConfigs();
|
|
21896
|
-
|
|
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
|
|
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,
|
|
21891
|
+
const [agentResult, staleStdio] = await Promise.all([
|
|
21904
21892
|
tryWithAgent({ keyPath: opts.key }),
|
|
21905
|
-
|
|
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,
|
|
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
|
-
|
|
21956
|
-
|
|
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.
|
|
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-
|
|
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
|
|
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("
|
|
23188
|
-
|
|
23189
|
-
|
|
23190
|
-
|
|
23191
|
-
|
|
23192
|
-
|
|
23193
|
-
|
|
23194
|
-
|
|
23195
|
-
|
|
23196
|
-
|
|
23197
|
-
|
|
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
|
|
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("(
|
|
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
|
|
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
|
-
|
|
23555
|
-
|
|
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
|
|
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
|
|
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({
|
|
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
|
|
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 :
|
|
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
|
-
|
|
24040
|
-
if (
|
|
24041
|
-
|
|
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",
|
|
24044
|
-
printInfo(`Buyers pay it with: t2 pay ${
|
|
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
|
-
|
|
25192
|
-
|
|
25193
|
-
no key in the client,
|
|
25194
|
-
|
|
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):
|