@cryptocadet/cli -本地签名者+策略引擎(v4指令01)
CryptoCadet v4的买方支出组件。持有 专用代理热 钱包 对于有界浮点数,强制a 当地的政策 随着 唯一的 支出 控制(没有智能账户,没有链上警告执行者),并签署ERC-20付款 基地. 用户的 主钱包密钥从未进入此包 在任何代码路径中。
这是CLIENT包。的cryptocadet 服务器不持有密钥,并且永远不能 导入该模块。
安装
macOS: brew install thetechjd/cryptocadet-cli/cryptocadet
Linux: curl -fsSL https://cryptocadet.app/install.sh | sh
Node (any): npm i -g @cryptocadet/cli
Then: cryptocadet init
brew和curl工件是自包含的二进制文件(嵌入了Node 24)——没有节点,
npm,或 node_modules 在用户的机器上。npm通道需要Node≥22.5(内置)
node:sqlite). Windows: 4.0版本使用npm通道。curl安装程序为 install.sh
在回购根(从 https://cryptocadet.app/install.sh); 构建脚本,Homebrew
公式,以及发布清单 包装/.
承载保证
每个签署决定都通过了 evaluate() ——纯粹的,
同步的, fail-closed (任何错误/缺少字段/不可解析的金额⇒DENY)。有
是 一个 签名呼叫站点为座席支付路径,并对其进行了门控
gate.allow === true:
- 大门+单播直播中
PaymentSigner.pay(). - 真正的密钥签名原语(
sendTransfer)被固定在一个地方,liveBroadcaster的生产尾 单门控路径。 test/single-gate.test.ts通过来源证明了这一点 检查-添加第二个支付签名路径,失败。
唯一的其他事务签名路径是 sweep - - -
仅限人类撤销,从未在特工运输上登记。
信任模型和爆炸半径
被分离的签名者将代理密钥从 操作系统的钥匙链 (一个操作系统 授权),并且只在会话的进程内存中保存明文-永远不会 在磁盘上。任何可以在进程运行时读取其内存的程序都可以获得代理 关键。 这就是为什么浮动是有界的:爆炸半径是浮动,而不是主要的 钱包。 从主钱包充值永远是人类的行为;没有什么会自动耗尽它。
锁的决定
- 网络: 仅限基地(8453主网/ 84532 Sepolia)。 资产: USDC默认,其他 根据本地允许列表的erc -20。 从来没有原生代币支出。
- 转账收费令牌:在allowlist时间被拒绝 (
edit_allowlist拒绝 他们;evaluate()拒绝他们作为担保)。解决方案 难度。 - 订阅楼: 可使用的=
balance − subscriptionReserve. 按支付 可能永远不会越过保护区(evaluate()步骤6)。 pay接受服务器发布的quoteId只有 -从来没有一个原始的收件人/金额。一个 有毒的“支付0xattack”指令没有引用,而且是伪造的引用 收件人允许列表失败。- 取消=
rotate+sweep. 扫描是 balance-discovery-driven (入站 传输日志扫描),因此被遗忘的长尾令牌也会被清除;天然气是 排最后。
表面
客户端是一个二进制(cryptocadet、别名 ccx)同时担任两个角色-一个帐户可以
同时做买家和卖家。命令按两个轴分组:local-vs-remote状态和
agent-exposed-vs-human-only。
面向agent的MCP(准确地说是四个动词) AGENT_TOOL_NAMES):
check_balance, quote_payment, pay, dry_run. 《连线》杂志在 runtime.ts
通过 buildAgentTools 只有; 测试/ command-surface.test.ts
证明两个曲面是不相交的。
本地状态-仅限人工(密钥+策略,永远不会离开机器): init,
wallet:show, policy:show, policy:set (帽/储备/升级), allowlist:add/
allowlist:remove (令牌+收件人), topup:request (人工审批,无自动排水)
checkout (支付由商户提供的签名报价-见下文), rotate (--and-sweep --to),
sweep --to <addr>, reserve:check.
checkout --quote-json <json> | --quote-file <path> [--allowlist-recipient] [--approve|--yes]
-人类一次性支付动词,用于商家结账流程(例如主机工具充值)
贷方余额)。商人开出了一份报价 自己的 服务器账户,所以买方
不能通过id (GET /v4/quotes/:id account-scoped);相反,商人
举手示意 SignedQuote 这个动词通过 相同的
PaymentSigner.pay() 代理传输使用-根据
在单次广播之前,固定了pubkey并根据本地政策重新检查了每个字段,
所以报价的传输不需要被信任。 --allowlist-recipient 添加引号
首先支付给接收者allowlist(失败关闭策略不发送);
--approve 确认超出阈值(升级)的带外报价。下面是引用自
--quote-json, --quote-file,或管道stdin。
远程状态服务器postgres通过认证API(卖方/买方,无关键风险):
login/logout, product:list|create|update|disable, payout:set,
subs:list|create|cancel, history.
mcp:serve [--detach|--stop|--status] —RDK分离模式:PID文件下
~/.cryptocadet,钥匙链解锁分离启动,清洁停止/状态。
两个秘密,两个钥匙链条目
这个 代理钱包密钥 (keychainRef)及 服务器证书 (serverAuthRef,
API密钥或JWT)是不同的秘密,具有不同的爆炸半径和驻留位置 单独的
OS-keychain条目。服务器凭证永远不会写入明文dotfile。
重/原生/可选深度(例如: keytar)安装 首次使用时 通过
requireDep,而不是在包安装时。
磁盘布局— ~/.cryptocadet/
agent.key.enc (AES-256-GCM, OS密钥链中的数据密钥 policy.json (独家
执行)。 ledger.sqlite (幂等+ pending-tx)· config.json (非机密的)。
构建/测试
pnpm install
pnpm typecheck # tsc --noEmit, strict
pnpm test # vitest — adversarial diagnostics 1–14
pnpm build # emits dist/, bin: cryptocadet
要求节点≥22.5(内置) node:sqlite). 没有本地模块;操作系统密钥链为
达到通过 keytar 如果存在,则平台CLI (secret-tool/security)。