@dopemarkets/agent 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.
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ // `dope mcp {install,start,status}` — writes/inspects the MCP client
3
+ // config that points Claude Desktop / Cursor at our local MCP server.
4
+ //
5
+ // `dope mcp install` writes the config (with --print to stdout instead).
6
+ // `dope mcp start` execs dope-mcp directly (rarely useful; MCP servers
7
+ // are started by the client, not by the user).
8
+ // `dope mcp status` reports whether the config file is wired up.
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.runMcpInstall = runMcpInstall;
44
+ exports.runMcpStart = runMcpStart;
45
+ exports.runMcpStatus = runMcpStatus;
46
+ const fs = __importStar(require("node:fs"));
47
+ const path = __importStar(require("node:path"));
48
+ const os = __importStar(require("node:os"));
49
+ const node_child_process_1 = require("node:child_process");
50
+ const output_js_1 = require("../output.js");
51
+ const util_js_1 = require("../util.js");
52
+ const SERVER_KEY = 'dope-agent';
53
+ function configPathFor(target) {
54
+ const home = os.homedir();
55
+ if (target === 'claude') {
56
+ if (process.platform === 'darwin') {
57
+ return path.join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');
58
+ }
59
+ if (process.platform === 'win32') {
60
+ return path.join(process.env.APPDATA ?? path.join(home, 'AppData', 'Roaming'), 'Claude', 'claude_desktop_config.json');
61
+ }
62
+ return path.join(home, '.config', 'Claude', 'claude_desktop_config.json');
63
+ }
64
+ // cursor — same JSON shape, different path
65
+ return path.join(home, '.cursor', 'mcp.json');
66
+ }
67
+ function resolveServerCommand() {
68
+ // Prefer `dope-mcp` on PATH (installed via npm install -g). Fall back
69
+ // to the dev path inside the dope-agent repo so we work pre-publish.
70
+ const which = (0, node_child_process_1.spawnSync)(process.platform === 'win32' ? 'where' : 'which', ['dope-mcp']);
71
+ if (which.status === 0 && which.stdout.toString().trim()) {
72
+ return { command: 'dope-mcp', args: [] };
73
+ }
74
+ const repoBin = path.resolve(__dirname, '..', '..', '..', 'mcp', 'bin', 'dope-mcp.js');
75
+ if (fs.existsSync(repoBin)) {
76
+ return { command: 'node', args: [repoBin] };
77
+ }
78
+ // Last resort: assume install will happen.
79
+ return { command: 'dope-mcp', args: [] };
80
+ }
81
+ function runMcpInstall(rest, out) {
82
+ const { flags } = (0, util_js_1.parseArgs)(rest);
83
+ const target = (typeof flags['target'] === 'string' ? flags['target'] : 'claude');
84
+ if (target !== 'claude' && target !== 'cursor') {
85
+ return (0, output_js_1.emitError)(out, {
86
+ error_code: 'INVALID_REQUEST',
87
+ message: '--target must be "claude" or "cursor"',
88
+ });
89
+ }
90
+ const printOnly = flags['print'] === true;
91
+ const configPath = configPathFor(target);
92
+ const server = resolveServerCommand();
93
+ const entry = { command: server.command, args: server.args };
94
+ if (printOnly) {
95
+ // Just print the snippet the user should paste into their MCP client config.
96
+ (0, output_js_1.printHuman)(JSON.stringify({ mcpServers: { [SERVER_KEY]: entry } }, null, 2));
97
+ return;
98
+ }
99
+ // Merge into existing config if present; create with parents otherwise.
100
+ let existing = {};
101
+ if (fs.existsSync(configPath)) {
102
+ try {
103
+ existing = JSON.parse(fs.readFileSync(configPath, 'utf8'));
104
+ }
105
+ catch {
106
+ return (0, output_js_1.emitError)(out, {
107
+ error_code: 'SERVICE_UNAVAILABLE',
108
+ message: `Existing config at ${configPath} is not valid JSON. Refusing to overwrite. Run with --print and merge manually.`,
109
+ });
110
+ }
111
+ }
112
+ else {
113
+ fs.mkdirSync(path.dirname(configPath), { recursive: true });
114
+ }
115
+ existing.mcpServers = existing.mcpServers ?? {};
116
+ existing.mcpServers[SERVER_KEY] = entry;
117
+ fs.writeFileSync(configPath, JSON.stringify(existing, null, 2) + '\n');
118
+ (0, output_js_1.emitOk)(out, {
119
+ ok: true,
120
+ target,
121
+ config_path: configPath,
122
+ server: entry,
123
+ }, () => [
124
+ `MCP server registered as "${SERVER_KEY}" in ${target} config.`,
125
+ (0, output_js_1.row)('Config file:', configPath),
126
+ (0, output_js_1.row)('Command:', `${entry.command} ${entry.args.join(' ')}`.trim()),
127
+ '',
128
+ target === 'claude'
129
+ ? 'Restart Claude Desktop for the change to take effect.'
130
+ : 'Restart Cursor (or reload the MCP servers list) for the change to take effect.',
131
+ ].join('\n'));
132
+ }
133
+ function runMcpStart(_rest, out) {
134
+ // `mcp start` is mostly a debug command — normally Claude/Cursor spawn
135
+ // the MCP server themselves. Running it here just execs dope-mcp.
136
+ const server = resolveServerCommand();
137
+ if (!out.json) {
138
+ process.stderr.write(`Running ${server.command} ${server.args.join(' ')}\n`);
139
+ process.stderr.write('Press Ctrl-C to stop.\n');
140
+ }
141
+ const child = (0, node_child_process_1.spawnSync)(server.command, server.args, { stdio: 'inherit' });
142
+ if (child.status != null)
143
+ process.exit(child.status);
144
+ process.exit(0);
145
+ }
146
+ function runMcpStatus(_rest, out) {
147
+ const results = [];
148
+ for (const target of ['claude', 'cursor']) {
149
+ const configPath = configPathFor(target);
150
+ let installed = false;
151
+ let server = null;
152
+ if (fs.existsSync(configPath)) {
153
+ try {
154
+ const parsed = JSON.parse(fs.readFileSync(configPath, 'utf8'));
155
+ if (parsed.mcpServers && parsed.mcpServers[SERVER_KEY]) {
156
+ installed = true;
157
+ server = parsed.mcpServers[SERVER_KEY];
158
+ }
159
+ }
160
+ catch {
161
+ /* ignore parse errors; treat as not installed */
162
+ }
163
+ }
164
+ results.push({ target, config_path: configPath, installed, server });
165
+ }
166
+ const resolved = resolveServerCommand();
167
+ (0, output_js_1.emitOk)(out, { ok: true, server_command: resolved, clients: results }, () => {
168
+ const lines = [
169
+ (0, output_js_1.row)('Server command:', `${resolved.command} ${resolved.args.join(' ')}`.trim()),
170
+ '',
171
+ ];
172
+ for (const r of results) {
173
+ lines.push((0, output_js_1.row)(`${r.target}:`, r.installed
174
+ ? `installed (${r.config_path})`
175
+ : `not installed (${r.config_path})`));
176
+ }
177
+ return lines.join('\n');
178
+ });
179
+ }
180
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { type CliOutput } from '../output.js';
2
+ export declare function runStackQuote(rest: string[], out: CliOutput): Promise<void>;
3
+ export declare function runStackActivate(rest: string[], out: CliOutput): Promise<void>;
4
+ export declare function runStackList(rest: string[], out: CliOutput): Promise<void>;
5
+ export declare function runStackShow(rest: string[], out: CliOutput): Promise<void>;
6
+ export declare function runStackCandidates(rest: string[], out: CliOutput): Promise<void>;
@@ -0,0 +1,295 @@
1
+ "use strict";
2
+ // `dope stack {quote,activate,list,show,candidates}`.
3
+ //
4
+ // `activate` orchestrates the full multi-step flow: build → long-poll
5
+ // for unsigned tx → Turnkey sign via the Agent Key's API authenticator →
6
+ // submit. Each step has its own error surface, and we surface them
7
+ // individually so the user sees exactly where things went wrong.
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.runStackQuote = runStackQuote;
43
+ exports.runStackActivate = runStackActivate;
44
+ exports.runStackList = runStackList;
45
+ exports.runStackShow = runStackShow;
46
+ exports.runStackCandidates = runStackCandidates;
47
+ const crypto = __importStar(require("node:crypto"));
48
+ const agent_client_1 = require("@dopemarkets/agent-client");
49
+ const client_factory_js_1 = require("../client_factory.js");
50
+ const output_js_1 = require("../output.js");
51
+ const util_js_1 = require("../util.js");
52
+ async function runStackQuote(rest, out) {
53
+ const { flags } = (0, util_js_1.parseArgs)(rest);
54
+ const legsRaw = typeof flags['legs'] === 'string' ? flags['legs'] : '';
55
+ const premiumRaw = typeof flags['premium'] === 'string' ? flags['premium'] : '';
56
+ if (!legsRaw || !premiumRaw) {
57
+ return (0, output_js_1.emitError)(out, {
58
+ error_code: 'INVALID_REQUEST',
59
+ message: 'Usage: dope stack quote --legs <market_id:YES,market_id:NO> --premium <usdc>',
60
+ });
61
+ }
62
+ const legs = legsRaw.split(',').map((spec) => {
63
+ const idx = spec.lastIndexOf(':');
64
+ if (idx === -1)
65
+ throw new Error(`Bad leg: "${spec}". Expected <market_id>:<YES|NO>.`);
66
+ return { market_id: spec.slice(0, idx), outcome: spec.slice(idx + 1) };
67
+ });
68
+ const { client } = (0, client_factory_js_1.authedClient)(out);
69
+ try {
70
+ const quote = await client.quoteStack({ legs, premium_usdc: Number(premiumRaw) });
71
+ (0, output_js_1.emitOk)(out, quote, () => [
72
+ '',
73
+ 'Stack Quote',
74
+ (0, output_js_1.row)('Premium:', (0, output_js_1.usd)(quote.premium_usdc)),
75
+ (0, output_js_1.row)('Max payout:', (0, output_js_1.usd)(quote.max_payout_usdc)),
76
+ (0, output_js_1.row)('Multiplier:', `${quote.multiplier}x`),
77
+ (0, output_js_1.row)('Expires:', quote.expires_at),
78
+ (0, output_js_1.row)('Quote ID:', quote.quote_id),
79
+ '',
80
+ quote.disclosure_text,
81
+ '',
82
+ quote.activation_allowed_by_agent_key
83
+ ? `Activate:\n dope stack activate ${quote.quote_id}`
84
+ : 'This Agent Key cannot activate Stacks. Run `dope login --allow-activation`.',
85
+ ].join('\n'));
86
+ }
87
+ catch (err) {
88
+ handleApiError(err, out);
89
+ }
90
+ }
91
+ async function runStackActivate(rest, out) {
92
+ const { positionals, flags } = (0, util_js_1.parseArgs)(rest);
93
+ const quoteId = positionals[0];
94
+ if (!quoteId) {
95
+ return (0, output_js_1.emitError)(out, {
96
+ error_code: 'INVALID_REQUEST',
97
+ message: 'Usage: dope stack activate <quote_id> [--idempotency-key <key>]',
98
+ });
99
+ }
100
+ const idempotencyKey = (typeof flags['idempotency-key'] === 'string' ? flags['idempotency-key'] : '') ||
101
+ crypto.randomBytes(8).toString('hex');
102
+ const { client, cred } = (0, client_factory_js_1.authedClient)(out);
103
+ // Step 1: build phase.
104
+ let build;
105
+ try {
106
+ build = await client.activateStack({ quote_id: quoteId, idempotency_key: idempotencyKey });
107
+ }
108
+ catch (err) {
109
+ return handleApiError(err, out);
110
+ }
111
+ if (!out.json) {
112
+ process.stderr.write(`Activating stack ${build.stack_id}…\n`);
113
+ process.stderr.write(`Building transaction (activation_id=${build.activation_id})…\n`);
114
+ }
115
+ // Step 2: long-poll for the unsigned tx.
116
+ let txResp;
117
+ const pollMs = Math.max(1, build.poll_interval_seconds) * 1000;
118
+ const deadline = Date.now() + 60_000; // 60s overall budget for build
119
+ while (true) {
120
+ if (Date.now() > deadline) {
121
+ return (0, output_js_1.emitError)(out, {
122
+ error_code: 'TRANSACTION_PENDING',
123
+ message: 'Activation build timed out. Try again.',
124
+ });
125
+ }
126
+ try {
127
+ txResp = await client.getActivationTx(build.activation_id);
128
+ break;
129
+ }
130
+ catch (err) {
131
+ if (err instanceof agent_client_1.DopeAgentError && err.code === 'TRANSACTION_PENDING') {
132
+ await (0, util_js_1.sleep)(pollMs);
133
+ continue;
134
+ }
135
+ return handleApiError(err, out);
136
+ }
137
+ }
138
+ // Step 3: Turnkey sign.
139
+ if (!cred.turnkey) {
140
+ return (0, output_js_1.emitError)(out, {
141
+ error_code: 'AUTH_REQUIRED',
142
+ message: 'Turnkey credential not configured on this install. Re-run `dope login` to upgrade the local credential to include Turnkey signing material.',
143
+ });
144
+ }
145
+ if (!out.json)
146
+ process.stderr.write('Signing with Turnkey…\n');
147
+ let signedTxBase64;
148
+ try {
149
+ signedTxBase64 = await (0, agent_client_1.signSolanaTransaction)({
150
+ credential: {
151
+ sub_org_id: cred.turnkey.sub_org_id,
152
+ wallet_address: cred.turnkey.wallet_address,
153
+ api_public_key_hex: cred.public_key_hex,
154
+ api_private_key_hex: cred.private_key_hex,
155
+ },
156
+ unsignedTxBase64: txResp.unsigned_tx_base64,
157
+ });
158
+ }
159
+ catch (err) {
160
+ return (0, output_js_1.emitError)(out, {
161
+ error_code: 'ACTIVATION_FAILED',
162
+ message: `Turnkey signing failed: ${err.message}`,
163
+ });
164
+ }
165
+ // Step 4: submit.
166
+ if (!out.json)
167
+ process.stderr.write('Submitting to chain…\n');
168
+ let submitResult;
169
+ try {
170
+ submitResult = await client.submitActivation({
171
+ stack_id: build.stack_id,
172
+ activation_id: build.activation_id,
173
+ signed_tx_base64: signedTxBase64,
174
+ });
175
+ }
176
+ catch (err) {
177
+ return handleApiError(err, out);
178
+ }
179
+ (0, output_js_1.emitOk)(out, submitResult, () => [
180
+ '',
181
+ 'Stack activated.',
182
+ (0, output_js_1.row)('Stack ID:', submitResult.stack_id),
183
+ (0, output_js_1.row)('Tx signature:', submitResult.transaction_signature ?? '(pending)'),
184
+ (0, output_js_1.row)('Activated at:', submitResult.activated_at),
185
+ '',
186
+ `View: dope stack show ${submitResult.stack_id}`,
187
+ ].join('\n'));
188
+ }
189
+ async function runStackList(rest, out) {
190
+ const { flags } = (0, util_js_1.parseArgs)(rest);
191
+ const status = typeof flags['status'] === 'string' ? flags['status'] : undefined;
192
+ const limit = typeof flags['limit'] === 'string' ? Number(flags['limit']) : undefined;
193
+ const cursor = typeof flags['cursor'] === 'string' ? flags['cursor'] : undefined;
194
+ const { client } = (0, client_factory_js_1.authedClient)(out);
195
+ try {
196
+ const result = await client.listStacks({
197
+ status: status,
198
+ limit,
199
+ cursor,
200
+ });
201
+ (0, output_js_1.emitOk)(out, result, () => {
202
+ if (result.stacks.length === 0)
203
+ return 'No stacks.';
204
+ const rows = result.stacks.map((s) => `${s.stack_id.slice(0, 8)}… ${s.status.padEnd(8)} ${s.leg_count} legs ${(0, output_js_1.usd)(s.premium_usdc).padStart(8)} → ${(0, output_js_1.usd)(s.max_payout_usdc).padStart(10)} ${s.multiplier ?? '—'}x ${s.outcome || ''}`);
205
+ const footer = result.next_cursor
206
+ ? `\n\nMore: dope stack list --cursor "${result.next_cursor}"`
207
+ : '';
208
+ return rows.join('\n') + footer;
209
+ });
210
+ }
211
+ catch (err) {
212
+ handleApiError(err, out);
213
+ }
214
+ }
215
+ async function runStackShow(rest, out) {
216
+ const { positionals } = (0, util_js_1.parseArgs)(rest);
217
+ const stackId = positionals[0];
218
+ if (!stackId) {
219
+ return (0, output_js_1.emitError)(out, { error_code: 'INVALID_REQUEST', message: 'Missing stack_id' });
220
+ }
221
+ const { client } = (0, client_factory_js_1.authedClient)(out);
222
+ try {
223
+ const result = await client.getStack(stackId);
224
+ (0, output_js_1.emitOk)(out, result, () => {
225
+ const s = result.stack;
226
+ const head = [
227
+ (0, output_js_1.row)('Stack:', s.stack_id),
228
+ (0, output_js_1.row)('Title:', s.title),
229
+ (0, output_js_1.row)('Status:', s.status),
230
+ (0, output_js_1.row)('Premium:', (0, output_js_1.usd)(s.premium_usdc)),
231
+ (0, output_js_1.row)('Max payout:', (0, output_js_1.usd)(s.max_payout_usdc)),
232
+ (0, output_js_1.row)('Multiplier:', s.multiplier ? `${s.multiplier}x` : '—'),
233
+ (0, output_js_1.row)('Outcome:', s.outcome ?? '—'),
234
+ (0, output_js_1.row)('Created:', s.created_at),
235
+ (0, output_js_1.row)('Resolved:', s.resolved_at ?? '—'),
236
+ ].join('\n');
237
+ const legs = s.legs
238
+ .map((l, i) => ` ${i + 1}. ${l.market_id.slice(0, 14)}… ${l.outcome.padEnd(4)} ${l.status} ${l.resolution ?? ''}\n ${l.title ?? ''}`)
239
+ .join('\n');
240
+ const tx = [
241
+ (0, output_js_1.row)('Activation tx:', s.transaction_signatures.activation ?? '—'),
242
+ (0, output_js_1.row)('Settlement tx:', s.transaction_signatures.settlement ?? '—'),
243
+ (0, output_js_1.row)('Cash-out tx:', s.transaction_signatures.cash_out ?? '—'),
244
+ ].join('\n');
245
+ return `${head}\n\nLegs (${s.legs.length}):\n${legs}\n\n${tx}`;
246
+ });
247
+ }
248
+ catch (err) {
249
+ handleApiError(err, out);
250
+ }
251
+ }
252
+ async function runStackCandidates(rest, out) {
253
+ const { flags } = (0, util_js_1.parseArgs)(rest);
254
+ const tMin = Number(flags['target-min']);
255
+ const tMax = Number(flags['target-max']);
256
+ const maxPremium = Number(flags['max-premium']);
257
+ if (!Number.isFinite(tMin) || !Number.isFinite(tMax) || !Number.isFinite(maxPremium)) {
258
+ return (0, output_js_1.emitError)(out, {
259
+ error_code: 'INVALID_REQUEST',
260
+ message: 'Usage: dope stack candidates --target-min <X> --target-max <Y> --max-premium <usdc> [--categories crypto,macro] [--legs-min 2] [--legs-max 4] [--limit 5]',
261
+ });
262
+ }
263
+ const categories = typeof flags['categories'] === 'string'
264
+ ? flags['categories'].split(',').map((s) => s.trim()).filter(Boolean)
265
+ : undefined;
266
+ const { client } = (0, client_factory_js_1.authedClient)(out);
267
+ try {
268
+ const result = await client.findCandidates({
269
+ target_multiplier_min: tMin,
270
+ target_multiplier_max: tMax,
271
+ max_premium_usdc: maxPremium,
272
+ categories,
273
+ leg_count_min: typeof flags['legs-min'] === 'string' ? Number(flags['legs-min']) : undefined,
274
+ leg_count_max: typeof flags['legs-max'] === 'string' ? Number(flags['legs-max']) : undefined,
275
+ limit: typeof flags['limit'] === 'string' ? Number(flags['limit']) : undefined,
276
+ });
277
+ (0, output_js_1.emitOk)(out, result, () => {
278
+ if (result.candidates.length === 0)
279
+ return 'No candidates match the constraints.';
280
+ return result.candidates
281
+ .map((c) => `${c.candidate_id} ${c.indicative_multiplier}x premium=${c.indicative_premium_usdc} payout=${c.indicative_max_payout_usdc}\n ${c.title}\n ${c.blurb}`)
282
+ .join('\n\n');
283
+ });
284
+ }
285
+ catch (err) {
286
+ handleApiError(err, out);
287
+ }
288
+ }
289
+ function handleApiError(err, out) {
290
+ if (err instanceof agent_client_1.DopeAgentError) {
291
+ return (0, output_js_1.emitError)(out, { error_code: err.code, message: err.message, details: err.body });
292
+ }
293
+ return (0, output_js_1.emitError)(out, { error_code: 'SERVICE_UNAVAILABLE', message: err.message });
294
+ }
295
+ //# sourceMappingURL=stack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack.js","sourceRoot":"","sources":["../../src/commands/stack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type CliOutput } from '../output.js';
2
+ export declare function runWhoami(out: CliOutput): Promise<void>;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ // `dope whoami` — show the current Agent Key's identity and limits.
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.runWhoami = runWhoami;
5
+ const agent_client_1 = require("@dopemarkets/agent-client");
6
+ const credentials_js_1 = require("../credentials.js");
7
+ const output_js_1 = require("../output.js");
8
+ async function runWhoami(out) {
9
+ const cred = (0, credentials_js_1.loadCredential)();
10
+ if (!cred) {
11
+ return (0, output_js_1.emitError)(out, { error_code: 'AUTH_REQUIRED', message: 'Not logged in. Run `dope login` first.' }, 2);
12
+ }
13
+ const client = new agent_client_1.DopeClient({
14
+ baseUrl: cred.base_url,
15
+ credential: {
16
+ agent_key_id: cred.agent_key_id,
17
+ wallet_pubkey: cred.wallet_pubkey,
18
+ public_key_hex: cred.public_key_hex,
19
+ private_key_hex: cred.private_key_hex,
20
+ },
21
+ clientVersion: 'dope-cli/0.1.0',
22
+ });
23
+ try {
24
+ const status = await client.getAgentKeyStatus();
25
+ (0, output_js_1.emitOk)(out, status, () => [
26
+ (0, output_js_1.row)('Name:', cred.name),
27
+ (0, output_js_1.row)('Wallet:', cred.wallet_pubkey),
28
+ (0, output_js_1.row)('Agent Key:', status.agent_key.agent_key_id),
29
+ (0, output_js_1.row)('Status:', status.agent_key.status),
30
+ (0, output_js_1.row)('Permissions:', status.agent_key.permissions.join(', ')),
31
+ (0, output_js_1.row)('Limits:', `${(0, output_js_1.usd)(status.agent_key.limits.max_premium_usdc)}/stack · ${(0, output_js_1.usd)(status.agent_key.limits.max_daily_premium_usdc)}/day`),
32
+ (0, output_js_1.row)('Expires:', status.agent_key.expires_at),
33
+ ].join('\n'));
34
+ }
35
+ catch (err) {
36
+ if (err instanceof agent_client_1.DopeAgentError) {
37
+ return (0, output_js_1.emitError)(out, { error_code: err.code, message: err.message, details: err.body });
38
+ }
39
+ return (0, output_js_1.emitError)(out, { error_code: 'SERVICE_UNAVAILABLE', message: err.message });
40
+ }
41
+ }
42
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":";AAAA,oEAAoE;;AAMpE,8BA2CC;AA/CD,4DAAuE;AACvE,sDAAmD;AACnD,4CAA2E;AAEpE,KAAK,UAAU,SAAS,CAAC,GAAc;IAC5C,MAAM,IAAI,GAAG,IAAA,+BAAc,GAAE,CAAC;IAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAA,qBAAS,EACd,GAAG,EACH,EAAE,UAAU,EAAE,eAAe,EAAE,OAAO,EAAE,wCAAwC,EAAE,EAClF,CAAC,CACF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,yBAAU,CAAC;QAC5B,OAAO,EAAE,IAAI,CAAC,QAAQ;QACtB,UAAU,EAAE;YACV,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,eAAe,EAAE,IAAI,CAAC,eAAe;SACtC;QACD,aAAa,EAAE,gBAAgB;KAChC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAChD,IAAA,kBAAM,EAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CACvB;YACE,IAAA,eAAG,EAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;YACvB,IAAA,eAAG,EAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC;YAClC,IAAA,eAAG,EAAC,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC;YAChD,IAAA,eAAG,EAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;YACvC,IAAA,eAAG,EAAC,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAA,eAAG,EACD,SAAS,EACT,GAAG,IAAA,eAAG,EAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,YAAY,IAAA,eAAG,EAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CACtH;YACD,IAAA,eAAG,EAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;SAC7C,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,6BAAc,EAAE,CAAC;YAClC,OAAO,IAAA,qBAAS,EAAC,GAAG,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3F,CAAC;QACD,OAAO,IAAA,qBAAS,EAAC,GAAG,EAAE,EAAE,UAAU,EAAE,qBAAqB,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAChG,CAAC;AACH,CAAC"}
@@ -0,0 +1,39 @@
1
+ export interface StoredCredential {
2
+ /** Friendly name (e.g. "default", "claude", "cursor"). User-set. */
3
+ name: string;
4
+ /** The Agent Key id as issued by the DOPE backend. */
5
+ agent_key_id: string;
6
+ /** The user's Solana wallet pubkey on devnet/mainnet. */
7
+ wallet_pubkey: string;
8
+ /** P-256 compressed public key, hex (66 chars). */
9
+ public_key_hex: string;
10
+ /** P-256 private scalar, hex (64 chars). The thing that must not leak. */
11
+ private_key_hex: string;
12
+ /** Turnkey-side material (sub-org id + addresses) needed for activate signing. */
13
+ turnkey?: {
14
+ sub_org_id: string;
15
+ wallet_address: string;
16
+ };
17
+ /** Base URL of the DOPE backend (e.g. devnet). */
18
+ base_url: string;
19
+ /** ISO timestamp of when this credential expires (from agent_keys.expires_at). */
20
+ expires_at: string | null;
21
+ /** ISO timestamp this credential was first stored locally. */
22
+ created_at: string;
23
+ }
24
+ export interface CredentialFile {
25
+ version: 1;
26
+ default_name: string | null;
27
+ credentials: Record<string, StoredCredential>;
28
+ }
29
+ export declare function saveCredential(cred: StoredCredential, { makeDefault }?: {
30
+ makeDefault?: boolean | undefined;
31
+ }): void;
32
+ export declare function loadCredential(name?: string): StoredCredential | null;
33
+ export declare function listCredentials(): {
34
+ default_name: string | null;
35
+ credentials: StoredCredential[];
36
+ };
37
+ export declare function deleteCredential(name: string): boolean;
38
+ export declare function setDefaultCredential(name: string): boolean;
39
+ export declare const credentialsPath: string;