proofscan 0.8.2 → 0.9.1

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,461 @@
1
+ /**
2
+ * Shell inscribe commands (Phase 4.3)
3
+ *
4
+ * Inscribes RPC call details to an external inscribe-mcp server.
5
+ *
6
+ * Usage:
7
+ * - inscribe @rpc:<id> Inscribe a specific RPC call
8
+ * - inscribe @ref:<name> Inscribe from saved reference
9
+ * - inscribe @last Inscribe the latest RPC call
10
+ * - show @rpc:<id> --json | inscribe Inscribe from piped JSON
11
+ *
12
+ * Options:
13
+ * - --dry-run Show payload without sending
14
+ * - --json Output receipt as JSON
15
+ */
16
+ import { printSuccess, printError, printInfo, dimText } from './prompt.js';
17
+ import { ConfigManager } from '../config/index.js';
18
+ import { EventsStore } from '../db/events-store.js';
19
+ import { RefResolver, createRefDataProvider, parseRef, isRef, } from './ref-resolver.js';
20
+ import { getConnector, listTools, callTool, } from '../tools/adapter.js';
21
+ import { redactDeep } from '../secrets/redaction.js';
22
+ /** Default inscriber connector ID */
23
+ const DEFAULT_INSCRIBER_CONNECTOR = 'inscribe';
24
+ /** Default inscriber tool name */
25
+ const DEFAULT_INSCRIBER_TOOL = 'inscribe';
26
+ /** Default inscription type */
27
+ const DEFAULT_INSCRIPTION_TYPE = 'proofscan.rpc';
28
+ /** Custom redaction placeholder for inscribe payloads */
29
+ const INSCRIBE_REDACTED = '***';
30
+ /**
31
+ * Redact secrets in an object for inscription
32
+ * Uses existing redactDeep but with "***" as the redaction placeholder
33
+ *
34
+ * @param value - Value to redact
35
+ * @returns Redacted value and count
36
+ */
37
+ export function redactForInscribe(value) {
38
+ // Use redactDeep with custom options for "***" placeholder
39
+ const result = redactDeep(value, {
40
+ redactSecretKeys: true,
41
+ redactSecretRefs: true,
42
+ redactedValue: INSCRIBE_REDACTED,
43
+ redactedRef: INSCRIBE_REDACTED,
44
+ });
45
+ return result;
46
+ }
47
+ /**
48
+ * Build inscribe payload from RPC data
49
+ */
50
+ function buildPayload(ref, rpcData) {
51
+ // Parse request/response JSON
52
+ let requestJson = null;
53
+ let responseJson = null;
54
+ if (rpcData.request?.raw_json) {
55
+ try {
56
+ requestJson = JSON.parse(rpcData.request.raw_json);
57
+ }
58
+ catch {
59
+ requestJson = rpcData.request.raw_json;
60
+ }
61
+ }
62
+ if (rpcData.response?.raw_json) {
63
+ try {
64
+ responseJson = JSON.parse(rpcData.response.raw_json);
65
+ }
66
+ catch {
67
+ responseJson = rpcData.response.raw_json;
68
+ }
69
+ }
70
+ // Build payload
71
+ const rawPayload = {
72
+ ref: {
73
+ kind: ref.kind,
74
+ connector: ref.connector,
75
+ session: ref.session,
76
+ rpc: ref.rpc,
77
+ proto: ref.proto,
78
+ level: ref.level,
79
+ captured_at: ref.captured_at,
80
+ },
81
+ rpc: {
82
+ request: requestJson,
83
+ response: responseJson,
84
+ method: rpcData.rpc.method,
85
+ },
86
+ meta: {
87
+ source: 'proofscan',
88
+ proto: ref.proto || 'mcp',
89
+ captured_at: ref.captured_at || rpcData.rpc.request_ts,
90
+ replay: false,
91
+ },
92
+ };
93
+ // Redact secrets
94
+ const { value: redactedPayload, count } = redactForInscribe(rawPayload);
95
+ return {
96
+ payload: redactedPayload,
97
+ redactedCount: count,
98
+ };
99
+ }
100
+ /**
101
+ * Build payload from stdin JSON (show --json output)
102
+ *
103
+ * Expected format: RPC detail JSON with request_json/response_json
104
+ */
105
+ function buildPayloadFromStdin(stdinJson) {
106
+ let parsed;
107
+ try {
108
+ parsed = JSON.parse(stdinJson);
109
+ }
110
+ catch {
111
+ return { error: 'Invalid JSON input' };
112
+ }
113
+ if (!parsed || typeof parsed !== 'object') {
114
+ return { error: 'Input must be a JSON object' };
115
+ }
116
+ const data = parsed;
117
+ // Check if this is RPC detail JSON (has request_json/response_json)
118
+ if (!('request_json' in data)) {
119
+ // Check if it's a RefStruct (only has kind, connector, session, etc.)
120
+ if ('kind' in data && !('rpc' in data && typeof data.rpc === 'object')) {
121
+ return {
122
+ error: 'RefStruct input not supported for inscribe. Use: show @rpc:<id> --json | inscribe',
123
+ };
124
+ }
125
+ return { error: 'Input must be RPC detail JSON (use: show @rpc:<id> --json)' };
126
+ }
127
+ // Extract required fields
128
+ const rpcId = data.rpc_id;
129
+ const sessionId = data.session_id;
130
+ const connectorId = data.connector_id;
131
+ const method = data.method;
132
+ const requestTs = data.request_ts;
133
+ if (!method) {
134
+ return { error: 'Missing method in RPC detail JSON' };
135
+ }
136
+ // Build ref
137
+ const ref = {
138
+ kind: 'rpc',
139
+ connector: connectorId,
140
+ session: sessionId,
141
+ rpc: rpcId,
142
+ proto: 'mcp',
143
+ captured_at: requestTs || new Date().toISOString(),
144
+ };
145
+ // Build payload
146
+ const rawPayload = {
147
+ ref,
148
+ rpc: {
149
+ request: data.request_json,
150
+ response: data.response_json ?? null,
151
+ method,
152
+ },
153
+ meta: {
154
+ source: 'proofscan',
155
+ proto: 'mcp',
156
+ captured_at: requestTs || new Date().toISOString(),
157
+ replay: false,
158
+ },
159
+ };
160
+ // Redact secrets
161
+ const { value: redactedPayload, count } = redactForInscribe(rawPayload);
162
+ return {
163
+ payload: redactedPayload,
164
+ redactedCount: count,
165
+ };
166
+ }
167
+ /**
168
+ * Parse inscribe receipt from MCP response
169
+ *
170
+ * inscribe-mcp returns: { content: [{ type: 'text', text: JSON.stringify(result) }] }
171
+ */
172
+ function parseReceipt(content) {
173
+ if (!content || !Array.isArray(content) || content.length === 0) {
174
+ return { receipt: { success: false }, raw: 'Empty response' };
175
+ }
176
+ const firstItem = content[0];
177
+ if (firstItem?.type !== 'text' || !firstItem.text) {
178
+ return { receipt: { success: false }, raw: JSON.stringify(content) };
179
+ }
180
+ try {
181
+ const parsed = JSON.parse(firstItem.text);
182
+ return { receipt: parsed };
183
+ }
184
+ catch {
185
+ return { receipt: { success: false }, raw: firstItem.text };
186
+ }
187
+ }
188
+ /**
189
+ * Handle 'inscribe' command
190
+ */
191
+ export async function handleInscribe(args, context, configPath, stdinData) {
192
+ const isJson = args.includes('--json');
193
+ const isDryRun = args.includes('--dry-run');
194
+ const target = args.find(a => !a.startsWith('-'));
195
+ // Handle stdin input (pipe mode)
196
+ if (stdinData) {
197
+ await handleInscribeFromStdin(stdinData, configPath, isJson, isDryRun);
198
+ return;
199
+ }
200
+ // Require target reference
201
+ if (!target) {
202
+ printInfo('Usage: inscribe <@ref> [options]');
203
+ printInfo('');
204
+ printInfo('Inscribe RPC call details to blockchain:');
205
+ printInfo(' inscribe @rpc:<id> Inscribe specific RPC');
206
+ printInfo(' inscribe @ref:<name> Inscribe from saved reference');
207
+ printInfo(' inscribe @last Inscribe latest RPC');
208
+ printInfo('');
209
+ printInfo('Pipe mode:');
210
+ printInfo(' show @rpc:<id> --json | inscribe');
211
+ printInfo('');
212
+ printInfo('Options:');
213
+ printInfo(' --dry-run Show payload without sending');
214
+ printInfo(' --json Output receipt as JSON');
215
+ return;
216
+ }
217
+ // Validate target is a reference
218
+ if (!isRef(target)) {
219
+ printError(`Not a valid reference: ${target}`);
220
+ printInfo('Use: @rpc:<id>, @ref:<name>, or @last');
221
+ return;
222
+ }
223
+ await handleInscribeFromRef(target, context, configPath, isJson, isDryRun);
224
+ }
225
+ /**
226
+ * Handle inscribe from reference target
227
+ */
228
+ async function handleInscribeFromRef(refString, context, configPath, isJson, isDryRun) {
229
+ const manager = new ConfigManager(configPath);
230
+ const eventsStore = new EventsStore(manager.getConfigDir());
231
+ const dataProvider = createRefDataProvider(eventsStore);
232
+ const resolver = new RefResolver(dataProvider);
233
+ // Resolve the reference
234
+ const parsed = parseRef(refString);
235
+ let rpcId;
236
+ let sessionId;
237
+ let connectorId;
238
+ if (parsed.type === 'last') {
239
+ const result = resolver.resolveLast(context);
240
+ if (!result.success || !result.ref) {
241
+ printError(result.error || 'Failed to resolve @last');
242
+ return;
243
+ }
244
+ if (result.ref.kind !== 'rpc' || !result.ref.rpc) {
245
+ printError('@last did not resolve to an RPC call');
246
+ printInfo('Only RPC references can be inscribed. Use: show @rpc:<id> to locate an RPC');
247
+ return;
248
+ }
249
+ rpcId = result.ref.rpc;
250
+ sessionId = result.ref.session;
251
+ connectorId = result.ref.connector;
252
+ }
253
+ else if (parsed.type === 'rpc' && parsed.id) {
254
+ rpcId = parsed.id;
255
+ sessionId = context.session;
256
+ connectorId = context.connector;
257
+ }
258
+ else if (parsed.type === 'ref' && parsed.id) {
259
+ const result = resolver.resolveUserRef(parsed.id);
260
+ if (!result.success || !result.ref) {
261
+ printError(result.error || `Failed to resolve @ref:${parsed.id}`);
262
+ return;
263
+ }
264
+ if (result.ref.kind !== 'rpc' || !result.ref.rpc) {
265
+ printError(`Reference @ref:${parsed.id} is not an RPC reference`);
266
+ printInfo('Only RPC references can be inscribed.');
267
+ return;
268
+ }
269
+ rpcId = result.ref.rpc;
270
+ sessionId = result.ref.session;
271
+ connectorId = result.ref.connector;
272
+ }
273
+ else if (parsed.type === 'session') {
274
+ printError('Cannot inscribe a session directly');
275
+ printInfo('Only RPC references can be inscribed. Hint: use show to locate an RPC, then inscribe @rpc:<id>');
276
+ return;
277
+ }
278
+ else {
279
+ printError(`Cannot inscribe from reference: ${refString}`);
280
+ printInfo('Supported: @last, @rpc:<id>, @ref:<name>');
281
+ return;
282
+ }
283
+ // Validate rpcId is set
284
+ if (!rpcId) {
285
+ printError('Failed to resolve RPC ID from reference');
286
+ return;
287
+ }
288
+ // Get RPC data
289
+ const rpcData = eventsStore.getRpcWithEvents(rpcId, sessionId);
290
+ if (!rpcData) {
291
+ printError(`RPC not found: ${rpcId}`);
292
+ return;
293
+ }
294
+ // Build ref structure
295
+ const ref = {
296
+ kind: 'rpc',
297
+ connector: connectorId,
298
+ session: rpcData.rpc.session_id,
299
+ rpc: rpcId,
300
+ proto: context.proto || 'mcp',
301
+ captured_at: rpcData.rpc.request_ts,
302
+ };
303
+ // Build payload
304
+ const { payload, redactedCount } = buildPayload(ref, rpcData);
305
+ console.log();
306
+ printInfo(`Inscribing: ${rpcData.rpc.method}`);
307
+ printInfo(`RPC: ${rpcId.slice(0, 8)}`);
308
+ if (redactedCount > 0) {
309
+ printInfo(`Secrets redacted: ${redactedCount}`);
310
+ }
311
+ if (isDryRun) {
312
+ console.log();
313
+ printInfo('Dry run - payload:');
314
+ console.log(JSON.stringify(payload, null, 2));
315
+ return;
316
+ }
317
+ // Send to inscriber
318
+ await sendToInscriber(payload, configPath, eventsStore, isJson);
319
+ }
320
+ /**
321
+ * Handle inscribe from stdin JSON
322
+ */
323
+ async function handleInscribeFromStdin(stdinJson, configPath, isJson, isDryRun) {
324
+ const result = buildPayloadFromStdin(stdinJson);
325
+ if ('error' in result) {
326
+ printError(result.error);
327
+ return;
328
+ }
329
+ const { payload, redactedCount } = result;
330
+ console.log();
331
+ printInfo(`Inscribing: ${payload.rpc.method}`);
332
+ if (payload.ref.rpc) {
333
+ printInfo(`RPC: ${payload.ref.rpc.slice(0, 8)}`);
334
+ }
335
+ if (redactedCount > 0) {
336
+ printInfo(`Secrets redacted: ${redactedCount}`);
337
+ }
338
+ if (isDryRun) {
339
+ console.log();
340
+ printInfo('Dry run - payload:');
341
+ console.log(JSON.stringify(payload, null, 2));
342
+ return;
343
+ }
344
+ const manager = new ConfigManager(configPath);
345
+ const eventsStore = new EventsStore(manager.getConfigDir());
346
+ await sendToInscriber(payload, configPath, eventsStore, isJson);
347
+ }
348
+ /**
349
+ * Send payload to inscriber connector
350
+ */
351
+ async function sendToInscriber(payload, configPath, eventsStore, isJson) {
352
+ const manager = new ConfigManager(configPath);
353
+ const config = await manager.load();
354
+ // Get inscriber config
355
+ const inscriberConfig = config.inscriber || {};
356
+ const inscriberConnectorId = inscriberConfig.connectorId || DEFAULT_INSCRIBER_CONNECTOR;
357
+ const inscriberToolName = inscriberConfig.toolName || DEFAULT_INSCRIBER_TOOL;
358
+ const inscriptionType = inscriberConfig.type || DEFAULT_INSCRIPTION_TYPE;
359
+ // Get inscriber connector
360
+ const connector = await getConnector(configPath, inscriberConnectorId);
361
+ if (!connector) {
362
+ printError(`Inscriber connector not found: ${inscriberConnectorId}`);
363
+ printInfo('Configure inscriber in config file:');
364
+ printInfo(' inscriber:');
365
+ printInfo(' connectorId: inscribe');
366
+ printInfo('Or add a connector with id "inscribe"');
367
+ return;
368
+ }
369
+ if (!connector.enabled) {
370
+ printError(`Inscriber connector is disabled: ${inscriberConnectorId}`);
371
+ printInfo(`Enable it with: pfscan connectors enable --id ${inscriberConnectorId}`);
372
+ return;
373
+ }
374
+ const ctx = {
375
+ connectorId: inscriberConnectorId,
376
+ configDir: manager.getConfigDir(),
377
+ };
378
+ // Check if tool exists
379
+ printInfo('Connecting to inscriber...');
380
+ const toolsResult = await listTools(ctx, connector, { timeout: 30 });
381
+ if (toolsResult.error) {
382
+ printError(`Failed to connect to inscriber: ${toolsResult.error}`);
383
+ return;
384
+ }
385
+ const tool = toolsResult.tools.find(t => t.name === inscriberToolName);
386
+ if (!tool) {
387
+ printError(`Tool not found on inscriber: ${inscriberToolName}`);
388
+ if (toolsResult.tools.length > 0) {
389
+ printInfo('Available tools:');
390
+ for (const t of toolsResult.tools) {
391
+ printInfo(` ${t.name}`);
392
+ }
393
+ }
394
+ return;
395
+ }
396
+ // Call inscribe tool
397
+ printInfo('Inscribing...');
398
+ // Record outgoing event (return value intentionally unused - event is persisted)
399
+ eventsStore.saveEvent(toolsResult.sessionId, 'client_to_server', 'request', {
400
+ summary: `inscribe: ${payload.rpc.method}`,
401
+ rawJson: JSON.stringify({
402
+ tool: inscriberToolName,
403
+ args: {
404
+ content: '<payload>',
405
+ type: inscriptionType,
406
+ },
407
+ }),
408
+ });
409
+ const callResult = await callTool(ctx, connector, inscriberToolName, {
410
+ content: JSON.stringify(payload),
411
+ type: inscriptionType,
412
+ });
413
+ if (!callResult.success) {
414
+ printError(`Inscription failed: ${callResult.error}`);
415
+ // Record error response
416
+ eventsStore.saveEvent(callResult.sessionId, 'server_to_client', 'response', {
417
+ summary: `inscribe error: ${callResult.error}`,
418
+ rawJson: JSON.stringify({ error: callResult.error }),
419
+ });
420
+ return;
421
+ }
422
+ // Parse receipt
423
+ const { receipt, raw } = parseReceipt(callResult.content || []);
424
+ // Record success response
425
+ eventsStore.saveEvent(callResult.sessionId, 'server_to_client', 'response', {
426
+ summary: `inscribe ${receipt.success ? 'success' : 'failed'}${receipt.inscription_id ? `: ${receipt.inscription_id}` : ''}`,
427
+ rawJson: JSON.stringify(receipt),
428
+ });
429
+ // Display result
430
+ console.log();
431
+ if (receipt.success) {
432
+ printSuccess('Inscription successful!');
433
+ }
434
+ else {
435
+ printError('Inscription returned non-success status');
436
+ }
437
+ if (isJson) {
438
+ console.log(JSON.stringify(receipt, null, 2));
439
+ }
440
+ else {
441
+ const isTTY = process.stdout.isTTY;
442
+ if (receipt.inscription_id) {
443
+ console.log(`${dimText('Inscription ID:', isTTY)} ${receipt.inscription_id}`);
444
+ }
445
+ if (receipt.verify_url) {
446
+ console.log(`${dimText('Verify URL:', isTTY)} ${receipt.verify_url}`);
447
+ }
448
+ if (raw) {
449
+ console.log(`${dimText('Raw response:', isTTY)} ${raw}`);
450
+ }
451
+ // Show other fields
452
+ for (const [key, value] of Object.entries(receipt)) {
453
+ if (!['success', 'inscription_id', 'verify_url'].includes(key)) {
454
+ console.log(`${dimText(key + ':', isTTY)} ${JSON.stringify(value)}`);
455
+ }
456
+ }
457
+ }
458
+ console.log();
459
+ printInfo(`Session: ${callResult.sessionId.slice(0, 8)}`);
460
+ }
461
+ //# sourceMappingURL=inscribe-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inscribe-commands.js","sourceRoot":"","sources":["../../src/shell/inscribe-commands.ts"],"names":[],"mappings":"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"}
@@ -79,9 +79,19 @@ export declare class ShellRepl {
79
79
  private parsePipe;
80
80
  /**
81
81
  * Handle piped commands
82
- * Currently supports: pwd --json | ref add <name>
82
+ * Supports:
83
+ * pwd --json | ref add <name>
84
+ * show @rpc:<id> --json | inscribe
83
85
  */
84
86
  private handlePipe;
87
+ /**
88
+ * Handle: show --json | inscribe
89
+ */
90
+ private handlePipeToInscribe;
91
+ /**
92
+ * Handle: pwd --json | ref add <name>
93
+ */
94
+ private handlePipeToRefAdd;
85
95
  /**
86
96
  * Execute a pfscan command
87
97
  */
@@ -1 +1 @@
1
- {"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../../src/shell/repl.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwCH;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAG/C;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAwBrF;AAUD;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,EAAE,CAAmC;IAC7C,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,aAAa,CAAgD;IACrE,OAAO,CAAC,SAAS,CAAgD;gBAErD,UAAU,EAAE,MAAM;IAY9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAMvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAwDvB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4D5B;;OAEG;YACW,WAAW;IA2DzB;;OAEG;YACW,mBAAmB;IAkBjC;;OAEG;YACW,aAAa;IAiC3B;;OAEG;IACH,OAAO,CAAC,QAAQ;IAgEhB;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;OAEG;YACW,SAAS;IA+IvB;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;;OAGG;YACW,UAAU;IAkDxB;;OAEG;YACW,cAAc;CAuE7B"}
1
+ {"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../../src/shell/repl.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyCH;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAG/C;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAwBrF;AAUD;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,EAAE,CAAmC;IAC7C,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,aAAa,CAAgD;IACrE,OAAO,CAAC,SAAS,CAAgD;gBAErD,UAAU,EAAE,MAAM;IAY9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAMvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAwDvB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4D5B;;OAEG;YACW,WAAW;IAiEzB;;OAEG;YACW,mBAAmB;IAkBjC;;OAEG;YACW,aAAa;IAiC3B;;OAEG;IACH,OAAO,CAAC,QAAQ;IAsEhB;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;OAEG;YACW,SAAS;IA+IvB;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;;;;OAKG;YACW,UAAU;IA8BxB;;OAEG;YACW,oBAAoB;IAmClC;;OAEG;YACW,kBAAkB;IAkChC;;OAEG;YACW,cAAc;CAuE7B"}
@@ -15,6 +15,7 @@ import { ConfigManager } from '../config/index.js';
15
15
  import { getCurrentSession, setCurrentSession, clearCurrentSession, } from '../utils/state.js';
16
16
  import { handleTool, handleSend } from './tool-commands.js';
17
17
  import { handleRef } from './ref-commands.js';
18
+ import { handleInscribe } from './inscribe-commands.js';
18
19
  // Cache TTL in milliseconds (5 seconds)
19
20
  const CACHE_TTL_MS = 5000;
20
21
  /**
@@ -238,6 +239,11 @@ export class ShellRepl {
238
239
  await handleRef(args, this.context, this.configPath);
239
240
  return;
240
241
  }
242
+ // Handle inscribe command (shell-native, Phase 4.3)
243
+ if (command === 'inscribe') {
244
+ await handleInscribe(args, this.context, this.configPath);
245
+ return;
246
+ }
241
247
  // Handle built-in commands
242
248
  if (SHELL_BUILTINS.includes(command)) {
243
249
  await this.handleBuiltin(command, args);
@@ -350,6 +356,12 @@ Tool Commands:
350
356
  send @last Replay last RPC call
351
357
  send @ref:<name> Replay from saved reference
352
358
 
359
+ Inscribe Commands:
360
+ inscribe @rpc:<id> Inscribe RPC to blockchain
361
+ inscribe @ref:<name> Inscribe from saved reference
362
+ inscribe @last Inscribe latest RPC
363
+ show @rpc:<id> --json | inscribe Inscribe via pipe
364
+
353
365
  Shell Commands:
354
366
  help [command] Show help
355
367
  clear Clear screen
@@ -520,7 +532,9 @@ Tips:
520
532
  }
521
533
  /**
522
534
  * Handle piped commands
523
- * Currently supports: pwd --json | ref add <name>
535
+ * Supports:
536
+ * pwd --json | ref add <name>
537
+ * show @rpc:<id> --json | inscribe
524
538
  */
525
539
  async handlePipe(leftCmd, rightCmd) {
526
540
  const leftTokens = leftCmd.split(/\s+/).filter(t => t !== '');
@@ -529,16 +543,61 @@ Tips:
529
543
  printError('Invalid pipe syntax');
530
544
  return;
531
545
  }
532
- // Currently only support: pwd --json | ref add <name>
533
546
  const leftCommand = leftTokens[0];
534
547
  const rightCommand = rightTokens[0];
535
- if (leftCommand !== 'pwd' || !leftTokens.includes('--json')) {
536
- printError('Pipe source must be: pwd --json');
537
- printInfo('Example: pwd --json | ref add myref');
548
+ // Handle: show --json | inscribe
549
+ if (rightCommand === 'inscribe') {
550
+ await this.handlePipeToInscribe(leftTokens, rightTokens);
551
+ return;
552
+ }
553
+ // Handle: pwd --json | ref add <name>
554
+ if (rightCommand === 'ref' && rightTokens[1] === 'add') {
555
+ await this.handlePipeToRefAdd(leftTokens, rightTokens);
556
+ return;
557
+ }
558
+ printError('Unsupported pipe command');
559
+ printInfo('Supported pipes:');
560
+ printInfo(' pwd --json | ref add <name>');
561
+ printInfo(' show @rpc:<id> --json | inscribe');
562
+ }
563
+ /**
564
+ * Handle: show --json | inscribe
565
+ */
566
+ async handlePipeToInscribe(leftTokens, rightTokens) {
567
+ const leftCommand = leftTokens[0];
568
+ // Validate left side is show --json
569
+ if (leftCommand !== 'show' || !leftTokens.includes('--json')) {
570
+ printError('Pipe to inscribe requires: show <@ref> --json');
571
+ printInfo('Example: show @rpc:1 --json | inscribe');
572
+ return;
573
+ }
574
+ // Get target reference from show command
575
+ const target = leftTokens.find(t => t.startsWith('@'));
576
+ if (!target) {
577
+ printError('show command requires a reference target');
578
+ printInfo('Example: show @rpc:1 --json | inscribe');
579
+ return;
580
+ }
581
+ // Get RPC detail JSON by calling show internally
582
+ const { getRpcDetailJson } = await import('./router-commands.js');
583
+ const { ConfigManager } = await import('../config/index.js');
584
+ const manager = new ConfigManager(this.configPath);
585
+ const jsonOutput = await getRpcDetailJson(target, this.context, manager.getConfigDir());
586
+ if (!jsonOutput) {
587
+ printError('Failed to get RPC detail for inscribe');
538
588
  return;
539
589
  }
540
- if (rightCommand !== 'ref' || rightTokens[1] !== 'add') {
541
- printError('Pipe target must be: ref add <name>');
590
+ // Call inscribe with JSON as stdin data
591
+ const inscribeArgs = rightTokens.slice(1); // args after 'inscribe'
592
+ await handleInscribe(inscribeArgs, this.context, this.configPath, jsonOutput);
593
+ }
594
+ /**
595
+ * Handle: pwd --json | ref add <name>
596
+ */
597
+ async handlePipeToRefAdd(leftTokens, rightTokens) {
598
+ const leftCommand = leftTokens[0];
599
+ if (leftCommand !== 'pwd' || !leftTokens.includes('--json')) {
600
+ printError('Pipe source must be: pwd --json');
542
601
  printInfo('Example: pwd --json | ref add myref');
543
602
  return;
544
603
  }