@intent-engine/cli 0.0.0-stage → 0.1.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/LICENSE +202 -0
- package/dist/src/accounts.d.ts +112 -0
- package/dist/src/accounts.js +162 -0
- package/dist/src/accounts.js.map +1 -0
- package/dist/src/agent/actions.d.ts +45 -0
- package/dist/src/agent/actions.js +43 -0
- package/dist/src/agent/actions.js.map +1 -0
- package/dist/src/agent/budget.d.ts +22 -0
- package/dist/src/agent/budget.js +31 -0
- package/dist/src/agent/budget.js.map +1 -0
- package/dist/src/agent/claims.d.ts +15 -0
- package/dist/src/agent/claims.js +47 -0
- package/dist/src/agent/claims.js.map +1 -0
- package/dist/src/agent/create.d.ts +56 -0
- package/dist/src/agent/create.js +118 -0
- package/dist/src/agent/create.js.map +1 -0
- package/dist/src/agent/mandate.d.ts +30 -0
- package/dist/src/agent/mandate.js +478 -0
- package/dist/src/agent/mandate.js.map +1 -0
- package/dist/src/agent/mcp.d.ts +17 -0
- package/dist/src/agent/mcp.js +53 -0
- package/dist/src/agent/mcp.js.map +1 -0
- package/dist/src/agent/names.d.ts +1 -0
- package/dist/src/agent/names.js +3 -0
- package/dist/src/agent/names.js.map +1 -0
- package/dist/src/agent/owner.d.ts +40 -0
- package/dist/src/agent/owner.js +123 -0
- package/dist/src/agent/owner.js.map +1 -0
- package/dist/src/agent/prepare.d.ts +14 -0
- package/dist/src/agent/prepare.js +32 -0
- package/dist/src/agent/prepare.js.map +1 -0
- package/dist/src/agent/problems.d.ts +120 -0
- package/dist/src/agent/problems.js +189 -0
- package/dist/src/agent/problems.js.map +1 -0
- package/dist/src/agent/read.d.ts +13 -0
- package/dist/src/agent/read.js +210 -0
- package/dist/src/agent/read.js.map +1 -0
- package/dist/src/agent/registry.d.ts +2 -0
- package/dist/src/agent/registry.js +24 -0
- package/dist/src/agent/registry.js.map +1 -0
- package/dist/src/agent/relay.d.ts +20 -0
- package/dist/src/agent/relay.js +43 -0
- package/dist/src/agent/relay.js.map +1 -0
- package/dist/src/agent/schema.d.ts +68 -0
- package/dist/src/agent/schema.js +210 -0
- package/dist/src/agent/schema.js.map +1 -0
- package/dist/src/agent/settle.d.ts +5 -0
- package/dist/src/agent/settle.js +144 -0
- package/dist/src/agent/settle.js.map +1 -0
- package/dist/src/agent/shapes.d.ts +165 -0
- package/dist/src/agent/shapes.js +162 -0
- package/dist/src/agent/shapes.js.map +1 -0
- package/dist/src/agent/signed.d.ts +21 -0
- package/dist/src/agent/signed.js +360 -0
- package/dist/src/agent/signed.js.map +1 -0
- package/dist/src/agent/wallet.d.ts +18 -0
- package/dist/src/agent/wallet.js +186 -0
- package/dist/src/agent/wallet.js.map +1 -0
- package/dist/src/args.d.ts +491 -0
- package/dist/src/args.js +1124 -0
- package/dist/src/args.js.map +1 -0
- package/dist/src/bin.d.ts +2 -0
- package/dist/src/bin.js +4 -0
- package/dist/src/bin.js.map +1 -0
- package/dist/src/commands.d.ts +51 -0
- package/dist/src/commands.js +451 -0
- package/dist/src/commands.js.map +1 -0
- package/dist/src/compute.d.ts +19 -0
- package/dist/src/compute.js +81 -0
- package/dist/src/compute.js.map +1 -0
- package/dist/src/crank.d.ts +39 -0
- package/dist/src/crank.js +171 -0
- package/dist/src/crank.js.map +1 -0
- package/dist/src/events.d.ts +8 -0
- package/dist/src/events.js +43 -0
- package/dist/src/events.js.map +1 -0
- package/dist/src/flows.d.ts +23 -0
- package/dist/src/flows.js +128 -0
- package/dist/src/flows.js.map +1 -0
- package/dist/src/main.d.ts +32 -0
- package/dist/src/main.js +99 -0
- package/dist/src/main.js.map +1 -0
- package/dist/src/render.d.ts +5 -0
- package/dist/src/render.js +46 -0
- package/dist/src/render.js.map +1 -0
- package/dist/src/tokens.d.ts +6 -0
- package/dist/src/tokens.js +15 -0
- package/dist/src/tokens.js.map +1 -0
- package/dist/src/transport.d.ts +155 -0
- package/dist/src/transport.js +173 -0
- package/dist/src/transport.js.map +1 -0
- package/dist/src/treasury.d.ts +27 -0
- package/dist/src/treasury.js +85 -0
- package/dist/src/treasury.js.map +1 -0
- package/dist/src/version.d.ts +1 -0
- package/dist/src/version.js +2 -0
- package/dist/src/version.js.map +1 -0
- package/dist/src/wallet.d.ts +29 -0
- package/dist/src/wallet.js +108 -0
- package/dist/src/wallet.js.map +1 -0
- package/package.json +37 -3
- package/README.md +0 -3
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { createNoopSigner } from "@solana/kit";
|
|
2
|
+
import { getTokenDecoder } from "@solana-program/token";
|
|
3
|
+
import { formatAmount, getIntentDecoder } from "@intent-engine/core";
|
|
4
|
+
import { createdAccount, loadConfig, mintOf, rentExemptMinimum } from "./accounts.js";
|
|
5
|
+
import { prepare } from "./agent/prepare.js";
|
|
6
|
+
import { tokenAccountIfMissing } from "./agent/owner.js";
|
|
7
|
+
import { SOL_DECIMALS } from "./agent/read.js";
|
|
8
|
+
import { preparedView } from "./agent/shapes.js";
|
|
9
|
+
import { finish } from "./flows.js";
|
|
10
|
+
export { SOL_DECIMALS };
|
|
11
|
+
export const TREASURY_IS_PROGRAM = "the treasury is a program account, which cannot receive SOL, so the engine withholds every create fee; point fee_recipient at a wallet or multisig vault";
|
|
12
|
+
export const treasuryTooEmpty = (fee, short) => `the treasury holds too little SOL to take a ${fee} lamport create fee and stay rent-exempt, so the engine withholds that fee; send it at least ${short} lamports`;
|
|
13
|
+
async function createFeeWarnings(transport, owner, createFee) {
|
|
14
|
+
const account = await transport.getAccount(owner);
|
|
15
|
+
if (account?.executable === true) {
|
|
16
|
+
return [TREASURY_IS_PROGRAM];
|
|
17
|
+
}
|
|
18
|
+
if (createFee === 0) {
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
const held = account?.lamports ?? 0n;
|
|
22
|
+
const minimum = await rentExemptMinimum(transport, account?.data.length ?? 0);
|
|
23
|
+
const short = minimum - held - BigInt(createFee);
|
|
24
|
+
return short > 0n ? [treasuryTooEmpty(createFee, short)] : [];
|
|
25
|
+
}
|
|
26
|
+
export async function intentInputMints(transport) {
|
|
27
|
+
const mints = new Set();
|
|
28
|
+
for (const { data } of await transport.intents()) {
|
|
29
|
+
try {
|
|
30
|
+
mints.add(getIntentDecoder().decode(data).inputMint);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return [...mints].sort();
|
|
37
|
+
}
|
|
38
|
+
export async function treasuryView(transport, mints) {
|
|
39
|
+
const { config } = await loadConfig(transport);
|
|
40
|
+
const owner = config.feeRecipient;
|
|
41
|
+
const lamports = (await transport.getAccount(owner))?.lamports ?? 0n;
|
|
42
|
+
const tokens = [];
|
|
43
|
+
for (const mint of mints) {
|
|
44
|
+
const token = await mintOf(transport, mint);
|
|
45
|
+
const { address } = await tokenAccountIfMissing(transport, createNoopSigner(owner), owner, mint, token.tokenProgram);
|
|
46
|
+
const view = await createdAccount(transport, address);
|
|
47
|
+
const balance = view === null ? 0n : getTokenDecoder().decode(view.data).amount;
|
|
48
|
+
tokens.push({
|
|
49
|
+
mint,
|
|
50
|
+
token_program: token.tokenProgram,
|
|
51
|
+
decimals: token.decimals,
|
|
52
|
+
account: address,
|
|
53
|
+
exists: view !== null,
|
|
54
|
+
balance,
|
|
55
|
+
balance_tokens: formatAmount(balance, token.decimals),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
fee_recipient: owner,
|
|
60
|
+
lamports,
|
|
61
|
+
sol: formatAmount(lamports, SOL_DECIMALS),
|
|
62
|
+
tokens,
|
|
63
|
+
missing: tokens.filter((t) => !t.exists).map((t) => t.mint),
|
|
64
|
+
warnings: await createFeeWarnings(transport, owner, config.createFee),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export const NOTHING_TO_CREATE = "nothing to create: the treasury already holds an account for every token listed";
|
|
68
|
+
export async function createTreasuryAccounts(transport, view, payer, yes) {
|
|
69
|
+
const absent = view.tokens.filter((t) => !t.exists);
|
|
70
|
+
if (absent.length === 0) {
|
|
71
|
+
return { ...view, sent: false, next: NOTHING_TO_CREATE };
|
|
72
|
+
}
|
|
73
|
+
const instructions = [];
|
|
74
|
+
for (const t of absent) {
|
|
75
|
+
const { create } = await tokenAccountIfMissing(transport, createNoopSigner(payer.address), view.fee_recipient, t.mint, t.token_program);
|
|
76
|
+
instructions.push(...create);
|
|
77
|
+
}
|
|
78
|
+
const prepared = preparedView(await prepare(transport, instructions, payer.address));
|
|
79
|
+
return finish(transport, {
|
|
80
|
+
...view,
|
|
81
|
+
summary: absent.map((t) => `Creates the treasury's account ${t.account} for ${t.mint}, so fills can pay protocol fees in it (${payer.address} pays its rent)`),
|
|
82
|
+
prepared,
|
|
83
|
+
}, payer, yes);
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=treasury.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"treasury.js","sourceRoot":"","sources":["../../src/treasury.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const VERSION = "0.1.0";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type Address, type KeyPairSigner } from "@solana/kit";
|
|
2
|
+
import { type Env } from "./args.js";
|
|
3
|
+
import type { Transport } from "./transport.js";
|
|
4
|
+
export declare const LAMPORTS_PER_SOL = 1000000000n;
|
|
5
|
+
export declare const FUND_BELOW: bigint;
|
|
6
|
+
export declare const AIRDROP = 1000000000n;
|
|
7
|
+
export type Settings = {
|
|
8
|
+
url: string;
|
|
9
|
+
keypair: string;
|
|
10
|
+
};
|
|
11
|
+
export type Files = {
|
|
12
|
+
home: string;
|
|
13
|
+
readText(path: string): Promise<string>;
|
|
14
|
+
saveText(path: string, text: string, secret: boolean): Promise<void>;
|
|
15
|
+
loadSigner(path: string): Promise<KeyPairSigner>;
|
|
16
|
+
};
|
|
17
|
+
export declare const settingsDir: (home: string) => string;
|
|
18
|
+
export declare const settingsPath: (home: string) => string;
|
|
19
|
+
export declare const defaultWallet: (home: string) => string;
|
|
20
|
+
export declare const settingsBroken: (path: string) => string;
|
|
21
|
+
export declare const FAUCET = "https://github.com/MerlijnW70/solive/issues/new?template=faucet.yml";
|
|
22
|
+
export declare const FUNDED = "your wallet is ready; try offering 0.05 SOL for at least 5 TEST";
|
|
23
|
+
export declare const AIRDROP_REFUSED = "the devnet airdrop is rate-limited right now; request devnet SOL for this address at https://github.com/MerlijnW70/solive/issues/new?template=faucet.yml or https://faucet.solana.com, then set up again";
|
|
24
|
+
export declare const SEND_SOL = "send SOL to this address, then run setup again";
|
|
25
|
+
export declare function withSettings(files: Files, given: Env): Promise<Env>;
|
|
26
|
+
export declare function setup(transport: Transport, files: Files, url: string, keypair: string | undefined): Promise<object>;
|
|
27
|
+
export declare function defaultMints(url: string): Address[];
|
|
28
|
+
export declare const TOKEN_LABELS: Readonly<Record<string, string>>;
|
|
29
|
+
export declare function balances(transport: Transport, owner: Address, mints: readonly Address[]): Promise<object>;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { createKeyPairSignerFromPrivateKeyBytes, getAddressEncoder } from "@solana/kit";
|
|
2
|
+
import { getTokenDecoder } from "@solana-program/token";
|
|
3
|
+
import { findAssociatedTokenAddress, formatAmount, PRODUCT_REPOSITORY } from "@intent-engine/core";
|
|
4
|
+
import { createdAccount, mintOf } from "./accounts.js";
|
|
5
|
+
import { CLUSTERS, ENV_KEYPAIR, ENV_URL, UsageError } from "./args.js";
|
|
6
|
+
import { SOL_DECIMALS } from "./agent/read.js";
|
|
7
|
+
import { DEVNET_URL, NATIVE_MINT, TEST_TOKEN } from "./tokens.js";
|
|
8
|
+
export const LAMPORTS_PER_SOL = 1000000000n;
|
|
9
|
+
export const FUND_BELOW = LAMPORTS_PER_SOL / 2n;
|
|
10
|
+
export const AIRDROP = LAMPORTS_PER_SOL;
|
|
11
|
+
export const settingsDir = (home) => `${home}/.config/intent-engine`;
|
|
12
|
+
export const settingsPath = (home) => `${settingsDir(home)}/config.json`;
|
|
13
|
+
export const defaultWallet = (home) => `${settingsDir(home)}/wallet.json`;
|
|
14
|
+
export const settingsBroken = (path) => `${path} is not a settings file this CLI wrote; delete it and run setup again`;
|
|
15
|
+
export const FAUCET = `${PRODUCT_REPOSITORY}/issues/new?template=faucet.yml`;
|
|
16
|
+
export const FUNDED = "your wallet is ready; try offering 0.05 SOL for at least 5 TEST";
|
|
17
|
+
export const AIRDROP_REFUSED = `the devnet airdrop is rate-limited right now; request devnet SOL for this address at ${FAUCET} or https://faucet.solana.com, then set up again`;
|
|
18
|
+
export const SEND_SOL = "send SOL to this address, then run setup again";
|
|
19
|
+
const set = (value) => (value === "" ? undefined : value);
|
|
20
|
+
export async function withSettings(files, given) {
|
|
21
|
+
const env = { ...given, [ENV_URL]: set(given[ENV_URL]), [ENV_KEYPAIR]: set(given[ENV_KEYPAIR]) };
|
|
22
|
+
const path = settingsPath(files.home);
|
|
23
|
+
let text;
|
|
24
|
+
try {
|
|
25
|
+
text = await files.readText(path);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return env;
|
|
29
|
+
}
|
|
30
|
+
let saved;
|
|
31
|
+
try {
|
|
32
|
+
saved = JSON.parse(text);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
throw new UsageError(settingsBroken(path));
|
|
36
|
+
}
|
|
37
|
+
if (saved === null ||
|
|
38
|
+
typeof saved !== "object" ||
|
|
39
|
+
typeof saved.url !== "string" ||
|
|
40
|
+
typeof saved.keypair !== "string") {
|
|
41
|
+
throw new UsageError(settingsBroken(path));
|
|
42
|
+
}
|
|
43
|
+
const { url, keypair } = saved;
|
|
44
|
+
return { ...env, [ENV_URL]: env[ENV_URL] ?? url, [ENV_KEYPAIR]: env[ENV_KEYPAIR] ?? keypair };
|
|
45
|
+
}
|
|
46
|
+
async function walletAt(files, path) {
|
|
47
|
+
try {
|
|
48
|
+
await files.readText(path);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
const seed = crypto.getRandomValues(new Uint8Array(32));
|
|
52
|
+
const signer = await createKeyPairSignerFromPrivateKeyBytes(seed);
|
|
53
|
+
await files.saveText(path, JSON.stringify([...seed, ...getAddressEncoder().encode(signer.address)]), true);
|
|
54
|
+
return { signer: await files.loadSigner(path), created: true };
|
|
55
|
+
}
|
|
56
|
+
return { signer: await files.loadSigner(path), created: false };
|
|
57
|
+
}
|
|
58
|
+
const lamportsOf = async (transport, owner) => (await transport.getAccount(owner))?.lamports ?? 0n;
|
|
59
|
+
export async function setup(transport, files, url, keypair) {
|
|
60
|
+
const path = keypair ?? defaultWallet(files.home);
|
|
61
|
+
const { signer, created } = await walletAt(files, path);
|
|
62
|
+
await files.saveText(settingsPath(files.home), `${JSON.stringify({ url, keypair: path }, null, 2)}\n`, false);
|
|
63
|
+
let held = await lamportsOf(transport, signer.address);
|
|
64
|
+
let next = FUNDED;
|
|
65
|
+
if (held < FUND_BELOW) {
|
|
66
|
+
if (url === CLUSTERS["mainnet-beta"]) {
|
|
67
|
+
next = SEND_SOL;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
try {
|
|
71
|
+
await transport.airdrop(signer.address, AIRDROP);
|
|
72
|
+
held = await lamportsOf(transport, signer.address);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
next = AIRDROP_REFUSED;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
address: signer.address,
|
|
81
|
+
keypair: path,
|
|
82
|
+
created,
|
|
83
|
+
url,
|
|
84
|
+
sol: formatAmount(held, SOL_DECIMALS),
|
|
85
|
+
next,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
export function defaultMints(url) {
|
|
89
|
+
return url === DEVNET_URL ? [NATIVE_MINT, TEST_TOKEN] : [NATIVE_MINT];
|
|
90
|
+
}
|
|
91
|
+
export const TOKEN_LABELS = { [NATIVE_MINT]: "wrapped SOL", [TEST_TOKEN]: "TEST" };
|
|
92
|
+
export async function balances(transport, owner, mints) {
|
|
93
|
+
const tokens = [];
|
|
94
|
+
for (const mint of mints) {
|
|
95
|
+
const token = await mintOf(transport, mint);
|
|
96
|
+
const account = await findAssociatedTokenAddress({ owner, mint, tokenProgram: token.tokenProgram });
|
|
97
|
+
const view = await createdAccount(transport, account);
|
|
98
|
+
const raw = view === null ? 0n : getTokenDecoder().decode(view.data).amount;
|
|
99
|
+
tokens.push({
|
|
100
|
+
mint,
|
|
101
|
+
...(TOKEN_LABELS[mint] === undefined ? {} : { name: TOKEN_LABELS[mint] }),
|
|
102
|
+
account,
|
|
103
|
+
balance: formatAmount(raw, token.decimals),
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
return { address: owner, sol: formatAmount(await lamportsOf(transport, owner), SOL_DECIMALS), tokens };
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=wallet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/wallet.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,40 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@intent-engine/cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Command line and MCP server for the intent engine on Solana",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist/src"
|
|
9
|
+
],
|
|
10
|
+
"engines": {
|
|
11
|
+
"node": ">=22.12.0"
|
|
12
|
+
},
|
|
13
|
+
"publishConfig": {
|
|
14
|
+
"access": "public"
|
|
15
|
+
},
|
|
16
|
+
"bin": {
|
|
17
|
+
"intent-engine": "./dist/src/bin.js"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@modelcontextprotocol/server": "2.3.1",
|
|
21
|
+
"@solana-program/system": "0.14.1",
|
|
22
|
+
"@solana-program/token": "0.16.1",
|
|
23
|
+
"@solana/kit": "8.4.0",
|
|
24
|
+
"@intent-engine/core": "0.1.0",
|
|
25
|
+
"@intent-engine/solver": "0.1.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@modelcontextprotocol/client": "2.3.1",
|
|
29
|
+
"@types/node": "26.6.4",
|
|
30
|
+
"fast-check": "4.10.2",
|
|
31
|
+
"litesvm": "1.5.0",
|
|
32
|
+
"typescript": "7.0.2",
|
|
33
|
+
"vitest": "5.0.3"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsc -p tsconfig.build.json",
|
|
37
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
38
|
+
"test": "vitest run --fsModuleCache"
|
|
39
|
+
}
|
|
6
40
|
}
|
package/README.md
DELETED