@jinn-network/client 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 +21 -0
- package/README.md +162 -0
- package/deployments/deployment-phase1a-l2-baseSepolia-fast.json +32 -0
- package/deployments/deployment-phase1a-token-baseSepolia-fast.json +27 -0
- package/deployments/deployment-phase1b-mech-baseSepolia-fast.json +26 -0
- package/deployments/deployment-stolas-l2-baseSepolia-fast.json +35 -0
- package/dist/adapters/adapter.d.ts +11 -0
- package/dist/adapters/adapter.js +2 -0
- package/dist/adapters/adapter.js.map +1 -0
- package/dist/adapters/local/adapter.d.ts +20 -0
- package/dist/adapters/local/adapter.js +146 -0
- package/dist/adapters/local/adapter.js.map +1 -0
- package/dist/adapters/mech/adapter.d.ts +29 -0
- package/dist/adapters/mech/adapter.js +332 -0
- package/dist/adapters/mech/adapter.js.map +1 -0
- package/dist/adapters/mech/claim-policy.d.ts +40 -0
- package/dist/adapters/mech/claim-policy.js +104 -0
- package/dist/adapters/mech/claim-policy.js.map +1 -0
- package/dist/adapters/mech/contracts.d.ts +44 -0
- package/dist/adapters/mech/contracts.js +323 -0
- package/dist/adapters/mech/contracts.js.map +1 -0
- package/dist/adapters/mech/ipfs.d.ts +43 -0
- package/dist/adapters/mech/ipfs.js +142 -0
- package/dist/adapters/mech/ipfs.js.map +1 -0
- package/dist/adapters/mech/safe.d.ts +15 -0
- package/dist/adapters/mech/safe.js +113 -0
- package/dist/adapters/mech/safe.js.map +1 -0
- package/dist/adapters/mech/types.d.ts +561 -0
- package/dist/adapters/mech/types.js +340 -0
- package/dist/adapters/mech/types.js.map +1 -0
- package/dist/api/balance-build.d.ts +22 -0
- package/dist/api/balance-build.js +37 -0
- package/dist/api/balance-build.js.map +1 -0
- package/dist/api/fleet-build.d.ts +62 -0
- package/dist/api/fleet-build.js +91 -0
- package/dist/api/fleet-build.js.map +1 -0
- package/dist/api/gather-status.d.ts +20 -0
- package/dist/api/gather-status.js +137 -0
- package/dist/api/gather-status.js.map +1 -0
- package/dist/api/history-build.d.ts +32 -0
- package/dist/api/history-build.js +48 -0
- package/dist/api/history-build.js.map +1 -0
- package/dist/api/peers.d.ts +27 -0
- package/dist/api/peers.js +94 -0
- package/dist/api/peers.js.map +1 -0
- package/dist/api/rewards-build.d.ts +20 -0
- package/dist/api/rewards-build.js +42 -0
- package/dist/api/rewards-build.js.map +1 -0
- package/dist/api/server.d.ts +34 -0
- package/dist/api/server.js +130 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/status-build.d.ts +92 -0
- package/dist/api/status-build.js +175 -0
- package/dist/api/status-build.js.map +1 -0
- package/dist/api/status-rollup-build.d.ts +36 -0
- package/dist/api/status-rollup-build.js +69 -0
- package/dist/api/status-rollup-build.js.map +1 -0
- package/dist/auth/erc8128.d.ts +43 -0
- package/dist/auth/erc8128.js +88 -0
- package/dist/auth/erc8128.js.map +1 -0
- package/dist/bin/jinn.d.ts +11 -0
- package/dist/bin/jinn.js +20 -0
- package/dist/bin/jinn.js.map +1 -0
- package/dist/build-meta.json +3 -0
- package/dist/chain-read-errors.d.ts +9 -0
- package/dist/chain-read-errors.js +43 -0
- package/dist/chain-read-errors.js.map +1 -0
- package/dist/cli/action.d.ts +26 -0
- package/dist/cli/action.js +56 -0
- package/dist/cli/action.js.map +1 -0
- package/dist/cli/command.d.ts +62 -0
- package/dist/cli/command.js +29 -0
- package/dist/cli/command.js.map +1 -0
- package/dist/cli/commands/balance.d.ts +3 -0
- package/dist/cli/commands/balance.js +46 -0
- package/dist/cli/commands/balance.js.map +1 -0
- package/dist/cli/commands/bootstrap.d.ts +3 -0
- package/dist/cli/commands/bootstrap.js +165 -0
- package/dist/cli/commands/bootstrap.js.map +1 -0
- package/dist/cli/commands/claim-rewards.d.ts +3 -0
- package/dist/cli/commands/claim-rewards.js +121 -0
- package/dist/cli/commands/claim-rewards.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.js +151 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/fleet-scale.d.ts +3 -0
- package/dist/cli/commands/fleet-scale.js +449 -0
- package/dist/cli/commands/fleet-scale.js.map +1 -0
- package/dist/cli/commands/fleet.d.ts +3 -0
- package/dist/cli/commands/fleet.js +45 -0
- package/dist/cli/commands/fleet.js.map +1 -0
- package/dist/cli/commands/fund-requirements.d.ts +3 -0
- package/dist/cli/commands/fund-requirements.js +139 -0
- package/dist/cli/commands/fund-requirements.js.map +1 -0
- package/dist/cli/commands/history.d.ts +3 -0
- package/dist/cli/commands/history.js +61 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.js +91 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/keys-backup.d.ts +3 -0
- package/dist/cli/commands/keys-backup.js +107 -0
- package/dist/cli/commands/keys-backup.js.map +1 -0
- package/dist/cli/commands/logs.d.ts +3 -0
- package/dist/cli/commands/logs.js +69 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/rewards.d.ts +3 -0
- package/dist/cli/commands/rewards.js +54 -0
- package/dist/cli/commands/rewards.js.map +1 -0
- package/dist/cli/commands/run.d.ts +3 -0
- package/dist/cli/commands/run.js +96 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/status.d.ts +3 -0
- package/dist/cli/commands/status.js +54 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +3 -0
- package/dist/cli/commands/stop.js +82 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/submit-intent.d.ts +3 -0
- package/dist/cli/commands/submit-intent.js +169 -0
- package/dist/cli/commands/submit-intent.js.map +1 -0
- package/dist/cli/commands/version.d.ts +3 -0
- package/dist/cli/commands/version.js +114 -0
- package/dist/cli/commands/version.js.map +1 -0
- package/dist/cli/commands/withdraw.d.ts +3 -0
- package/dist/cli/commands/withdraw.js +181 -0
- package/dist/cli/commands/withdraw.js.map +1 -0
- package/dist/cli/deployment-digest.d.ts +10 -0
- package/dist/cli/deployment-digest.js +25 -0
- package/dist/cli/deployment-digest.js.map +1 -0
- package/dist/cli/execution-context.d.ts +50 -0
- package/dist/cli/execution-context.js +154 -0
- package/dist/cli/execution-context.js.map +1 -0
- package/dist/cli/help.d.ts +3 -0
- package/dist/cli/help.js +37 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.js +132 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/introspection-context.d.ts +10 -0
- package/dist/cli/introspection-context.js +60 -0
- package/dist/cli/introspection-context.js.map +1 -0
- package/dist/cli/output.d.ts +36 -0
- package/dist/cli/output.js +35 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/password.d.ts +12 -0
- package/dist/cli/password.js +51 -0
- package/dist/cli/password.js.map +1 -0
- package/dist/config.d.ts +174 -0
- package/dist/config.js +252 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon/creator.d.ts +24 -0
- package/dist/daemon/creator.js +80 -0
- package/dist/daemon/creator.js.map +1 -0
- package/dist/daemon/daemon.d.ts +60 -0
- package/dist/daemon/daemon.js +158 -0
- package/dist/daemon/daemon.js.map +1 -0
- package/dist/daemon/delivery-watcher.d.ts +10 -0
- package/dist/daemon/delivery-watcher.js +37 -0
- package/dist/daemon/delivery-watcher.js.map +1 -0
- package/dist/daemon/restorer.d.ts +19 -0
- package/dist/daemon/restorer.js +82 -0
- package/dist/daemon/restorer.js.map +1 -0
- package/dist/daemon/reward-claim-loop.d.ts +38 -0
- package/dist/daemon/reward-claim-loop.js +48 -0
- package/dist/daemon/reward-claim-loop.js.map +1 -0
- package/dist/discovery/registry.d.ts +43 -0
- package/dist/discovery/registry.js +104 -0
- package/dist/discovery/registry.js.map +1 -0
- package/dist/discovery/subgraph.d.ts +37 -0
- package/dist/discovery/subgraph.js +87 -0
- package/dist/discovery/subgraph.js.map +1 -0
- package/dist/earning/bootstrap.d.ts +79 -0
- package/dist/earning/bootstrap.js +989 -0
- package/dist/earning/bootstrap.js.map +1 -0
- package/dist/earning/contracts.d.ts +431 -0
- package/dist/earning/contracts.js +518 -0
- package/dist/earning/contracts.js.map +1 -0
- package/dist/earning/evidence-simhash.d.ts +59 -0
- package/dist/earning/evidence-simhash.js +87 -0
- package/dist/earning/evidence-simhash.js.map +1 -0
- package/dist/earning/fleet-display-index.d.ts +8 -0
- package/dist/earning/fleet-display-index.js +12 -0
- package/dist/earning/fleet-display-index.js.map +1 -0
- package/dist/earning/fleet-retire.d.ts +28 -0
- package/dist/earning/fleet-retire.js +75 -0
- package/dist/earning/fleet-retire.js.map +1 -0
- package/dist/earning/jinn-rewards.d.ts +62 -0
- package/dist/earning/jinn-rewards.js +81 -0
- package/dist/earning/jinn-rewards.js.map +1 -0
- package/dist/earning/next-service-index.d.ts +4 -0
- package/dist/earning/next-service-index.js +7 -0
- package/dist/earning/next-service-index.js.map +1 -0
- package/dist/earning/orphan-sweep.d.ts +33 -0
- package/dist/earning/orphan-sweep.js +157 -0
- package/dist/earning/orphan-sweep.js.map +1 -0
- package/dist/earning/reconcile.d.ts +37 -0
- package/dist/earning/reconcile.js +216 -0
- package/dist/earning/reconcile.js.map +1 -0
- package/dist/earning/safe-adapter.d.ts +70 -0
- package/dist/earning/safe-adapter.js +228 -0
- package/dist/earning/safe-adapter.js.map +1 -0
- package/dist/earning/stolas-claim.d.ts +47 -0
- package/dist/earning/stolas-claim.js +115 -0
- package/dist/earning/stolas-claim.js.map +1 -0
- package/dist/earning/store.d.ts +36 -0
- package/dist/earning/store.js +156 -0
- package/dist/earning/store.js.map +1 -0
- package/dist/earning/types.d.ts +123 -0
- package/dist/earning/types.js +64 -0
- package/dist/earning/types.js.map +1 -0
- package/dist/earning/viem-clients.d.ts +9 -0
- package/dist/earning/viem-clients.js +22 -0
- package/dist/earning/viem-clients.js.map +1 -0
- package/dist/earning/wallet.d.ts +20 -0
- package/dist/earning/wallet.js +103 -0
- package/dist/earning/wallet.js.map +1 -0
- package/dist/errors/envelope.d.ts +41 -0
- package/dist/errors/envelope.js +48 -0
- package/dist/errors/envelope.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +32 -0
- package/dist/main.js +281 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/server.d.ts +14 -0
- package/dist/mcp/server.js +205 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/operator-errors.d.ts +16 -0
- package/dist/operator-errors.js +88 -0
- package/dist/operator-errors.js.map +1 -0
- package/dist/preflight/claude-binary.d.ts +19 -0
- package/dist/preflight/claude-binary.js +44 -0
- package/dist/preflight/claude-binary.js.map +1 -0
- package/dist/preflight/claude-invocation-envelope.d.ts +11 -0
- package/dist/preflight/claude-invocation-envelope.js +67 -0
- package/dist/preflight/claude-invocation-envelope.js.map +1 -0
- package/dist/runner/claude.d.ts +15 -0
- package/dist/runner/claude.js +193 -0
- package/dist/runner/claude.js.map +1 -0
- package/dist/runner/runner.d.ts +11 -0
- package/dist/runner/runner.js +2 -0
- package/dist/runner/runner.js.map +1 -0
- package/dist/runner/simple.d.ts +8 -0
- package/dist/runner/simple.js +11 -0
- package/dist/runner/simple.js.map +1 -0
- package/dist/store/store.d.ts +74 -0
- package/dist/store/store.js +168 -0
- package/dist/store/store.js.map +1 -0
- package/dist/tx-retry.d.ts +55 -0
- package/dist/tx-retry.js +214 -0
- package/dist/tx-retry.js.map +1 -0
- package/dist/types/desired-state.d.ts +41 -0
- package/dist/types/desired-state.js +16 -0
- package/dist/types/desired-state.js.map +1 -0
- package/dist/types/errors.d.ts +8 -0
- package/dist/types/errors.js +17 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/withdraw/args.d.ts +29 -0
- package/dist/withdraw/args.js +198 -0
- package/dist/withdraw/args.js.map +1 -0
- package/dist/withdraw/run-withdraw-plan.d.ts +21 -0
- package/dist/withdraw/run-withdraw-plan.js +257 -0
- package/dist/withdraw/run-withdraw-plan.js.map +1 -0
- package/dist/x402/acquire.d.ts +6 -0
- package/dist/x402/acquire.js +32 -0
- package/dist/x402/acquire.js.map +1 -0
- package/dist/x402/facilitator.d.ts +11 -0
- package/dist/x402/facilitator.js +52 -0
- package/dist/x402/facilitator.js.map +1 -0
- package/dist/x402/handler.d.ts +15 -0
- package/dist/x402/handler.js +40 -0
- package/dist/x402/handler.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP server for jinn-client — exposes tools to agent subprocesses.
|
|
3
|
+
*
|
|
4
|
+
* Spawned by ClaudeRunner as a subprocess via StdioServerTransport.
|
|
5
|
+
* Receives context via env vars:
|
|
6
|
+
* DESIRED_STATE_ID — ID of the current desired state
|
|
7
|
+
* DESIRED_STATE_DESCRIPTION — Human-readable description
|
|
8
|
+
* DESIRED_STATE_CONTEXT — JSON context (optional)
|
|
9
|
+
* REQUEST_ID — On-chain request ID
|
|
10
|
+
* RESTORATION_DELIVERY_DATA — JSON delivery data (evaluation requests only)
|
|
11
|
+
*
|
|
12
|
+
* Usage: yarn exec tsx src/mcp/server.ts
|
|
13
|
+
*/
|
|
14
|
+
import { randomUUID } from 'node:crypto';
|
|
15
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
16
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
17
|
+
import { z } from 'zod';
|
|
18
|
+
import { Store } from '../store/store.js';
|
|
19
|
+
const server = new McpServer({
|
|
20
|
+
name: 'jinn-client',
|
|
21
|
+
version: '0.1.0',
|
|
22
|
+
});
|
|
23
|
+
// Read desired state from env vars (passed by ClaudeRunner)
|
|
24
|
+
const desiredState = {
|
|
25
|
+
id: process.env['DESIRED_STATE_ID'] ?? '',
|
|
26
|
+
description: process.env['DESIRED_STATE_DESCRIPTION'] ?? '',
|
|
27
|
+
context: process.env['DESIRED_STATE_CONTEXT']
|
|
28
|
+
? JSON.parse(process.env['DESIRED_STATE_CONTEXT'])
|
|
29
|
+
: undefined,
|
|
30
|
+
type: process.env['DESIRED_STATE_TYPE'] ?? '',
|
|
31
|
+
restorationRequestId: process.env['RESTORATION_REQUEST_ID'] ?? '',
|
|
32
|
+
};
|
|
33
|
+
const requestId = process.env['REQUEST_ID'] ?? '';
|
|
34
|
+
const storePath = process.env['STORE_PATH'] ?? '';
|
|
35
|
+
const store = storePath ? new Store(storePath) : null;
|
|
36
|
+
const daemonApiUrl = process.env['DAEMON_API_URL'] ?? '';
|
|
37
|
+
// ── Tools ────────────────────────────────────────────────────────────────────
|
|
38
|
+
server.tool('get_desired_state', 'Get the current desired state that needs to be restored', {}, async () => ({
|
|
39
|
+
content: [{
|
|
40
|
+
type: 'text',
|
|
41
|
+
text: JSON.stringify({
|
|
42
|
+
id: desiredState.id,
|
|
43
|
+
description: desiredState.description,
|
|
44
|
+
context: desiredState.context,
|
|
45
|
+
type: desiredState.type || undefined,
|
|
46
|
+
restorationRequestId: desiredState.restorationRequestId || undefined,
|
|
47
|
+
requestId,
|
|
48
|
+
}),
|
|
49
|
+
}],
|
|
50
|
+
}));
|
|
51
|
+
server.tool('report_progress', 'Report progress on the restoration', { message: z.string().describe('Progress message') }, async ({ message }) => {
|
|
52
|
+
console.error(`[mcp] Progress: ${message}`);
|
|
53
|
+
return {
|
|
54
|
+
content: [{ type: 'text', text: 'Progress reported' }],
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
server.tool('submit_restoration_result', 'Submit the result of a restoration attempt', {
|
|
58
|
+
success: z.boolean().describe('Whether the restoration was successful'),
|
|
59
|
+
description: z.string().describe('Description of what was done'),
|
|
60
|
+
data: z.string().optional().describe('Result data or artifact content'),
|
|
61
|
+
}, async ({ success, description, data }) => {
|
|
62
|
+
const isEvaluation = desiredState.type === 'evaluation';
|
|
63
|
+
const resultTag = isEvaluation ? 'evaluation-verdict' : 'restoration-result';
|
|
64
|
+
const id = randomUUID();
|
|
65
|
+
const artifact = {
|
|
66
|
+
id,
|
|
67
|
+
desiredStateId: desiredState.id,
|
|
68
|
+
requestId,
|
|
69
|
+
title: `${resultTag}: ${description.slice(0, 80)}`,
|
|
70
|
+
content: data ?? description,
|
|
71
|
+
tags: [resultTag, success ? 'success' : 'failure'],
|
|
72
|
+
outcome: (success ? 'SUCCESS' : 'FAILURE'),
|
|
73
|
+
};
|
|
74
|
+
// Publish via daemon API if available, otherwise direct store write
|
|
75
|
+
if (daemonApiUrl) {
|
|
76
|
+
try {
|
|
77
|
+
const response = await fetch(`${daemonApiUrl}/artifacts`, {
|
|
78
|
+
method: 'POST',
|
|
79
|
+
headers: { 'Content-Type': 'application/json' },
|
|
80
|
+
body: JSON.stringify(artifact),
|
|
81
|
+
});
|
|
82
|
+
if (!response.ok) {
|
|
83
|
+
console.error(`[mcp] Failed to POST artifact to daemon: ${response.status}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
console.error(`[mcp] Failed to POST artifact to daemon:`, err);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else if (store) {
|
|
91
|
+
store.insertArtifact(artifact);
|
|
92
|
+
}
|
|
93
|
+
console.error(`[mcp] Result published as artifact: ${id} [${resultTag}]`);
|
|
94
|
+
return {
|
|
95
|
+
content: [{ type: 'text', text: JSON.stringify({ submitted: true, id, tag: resultTag }) }],
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
server.tool('get_restoration_delivery', 'Get the restoration result that needs to be evaluated (only available for evaluation requests)', {}, async () => {
|
|
99
|
+
const raw = process.env['RESTORATION_DELIVERY_DATA'];
|
|
100
|
+
if (!raw) {
|
|
101
|
+
return {
|
|
102
|
+
content: [{
|
|
103
|
+
type: 'text',
|
|
104
|
+
text: JSON.stringify({ error: 'Not an evaluation request or no delivery data available' }),
|
|
105
|
+
}],
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
content: [{
|
|
110
|
+
type: 'text',
|
|
111
|
+
text: JSON.stringify({
|
|
112
|
+
restorationRequestId: desiredState.restorationRequestId,
|
|
113
|
+
deliveryData: JSON.parse(raw),
|
|
114
|
+
}),
|
|
115
|
+
}],
|
|
116
|
+
};
|
|
117
|
+
});
|
|
118
|
+
server.tool('publish_artifact', 'Publish a knowledge artifact for future agents to reference', {
|
|
119
|
+
title: z.string().describe('Short title for the artifact'),
|
|
120
|
+
content: z.string().describe('The artifact content (text, JSON, etc)'),
|
|
121
|
+
tags: z.array(z.string()).optional().describe('Tags for categorization'),
|
|
122
|
+
outcome: z.enum(['SUCCESS', 'FAILURE', 'UNKNOWN']).optional().describe('Outcome of the work this artifact relates to'),
|
|
123
|
+
}, async ({ title, content, tags, outcome }) => {
|
|
124
|
+
const id = randomUUID();
|
|
125
|
+
if (store) {
|
|
126
|
+
store.insertArtifact({
|
|
127
|
+
id,
|
|
128
|
+
desiredStateId: desiredState.id,
|
|
129
|
+
requestId,
|
|
130
|
+
title,
|
|
131
|
+
content,
|
|
132
|
+
tags: tags ?? [],
|
|
133
|
+
outcome: outcome ?? 'UNKNOWN',
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
console.error(`[mcp] Artifact published: ${id} — ${title}`);
|
|
137
|
+
return {
|
|
138
|
+
content: [{ type: 'text', text: JSON.stringify({ published: true, id, title }) }],
|
|
139
|
+
};
|
|
140
|
+
});
|
|
141
|
+
server.tool('search_artifacts', 'Search previously published knowledge artifacts', {
|
|
142
|
+
tags: z.array(z.string()).optional().describe('Filter by tags (e.g. ["restoration-result", "success"])'),
|
|
143
|
+
outcome: z.enum(['SUCCESS', 'FAILURE', 'UNKNOWN']).optional().describe('Filter by outcome'),
|
|
144
|
+
requestId: z.string().optional().describe('Filter by on-chain request ID'),
|
|
145
|
+
desiredStateId: z.string().optional().describe('Filter by desired state ID'),
|
|
146
|
+
after: z.string().optional().describe('Only return artifacts created after this ISO timestamp'),
|
|
147
|
+
before: z.string().optional().describe('Only return artifacts created before this ISO timestamp'),
|
|
148
|
+
limit: z.number().optional().describe('Max results (default 50)'),
|
|
149
|
+
}, async ({ tags, outcome, requestId, desiredStateId, after, before, limit }) => {
|
|
150
|
+
if (!store) {
|
|
151
|
+
return {
|
|
152
|
+
content: [{ type: 'text', text: JSON.stringify({ error: 'No store configured', results: [] }) }],
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
const results = store.searchArtifacts({ tags, outcome, requestId, desiredStateId, after, before, limit });
|
|
156
|
+
return {
|
|
157
|
+
content: [{ type: 'text', text: JSON.stringify({ results }) }],
|
|
158
|
+
};
|
|
159
|
+
});
|
|
160
|
+
server.tool('acquire_artifact', 'Fetch the content of a remote artifact from a peer node', {
|
|
161
|
+
id: z.string().describe('Artifact ID to acquire'),
|
|
162
|
+
}, async ({ id }) => {
|
|
163
|
+
if (!store) {
|
|
164
|
+
return {
|
|
165
|
+
content: [{ type: 'text', text: JSON.stringify({ error: 'No store configured' }) }],
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
// Check if content is already cached locally
|
|
169
|
+
const cached = store.getArtifactContent(id);
|
|
170
|
+
if (cached) {
|
|
171
|
+
return {
|
|
172
|
+
content: [{ type: 'text', text: JSON.stringify({ id, content: cached, cached: true }) }],
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
// Check if we know where to fetch it
|
|
176
|
+
const remoteInfo = store.getRemoteArtifactInfo(id);
|
|
177
|
+
if (!remoteInfo) {
|
|
178
|
+
return {
|
|
179
|
+
content: [{ type: 'text', text: JSON.stringify({ error: `Artifact ${id} not found (no remote info)` }) }],
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
// Fetch from peer
|
|
183
|
+
try {
|
|
184
|
+
const response = await fetch(`${remoteInfo.endpoint}/artifacts/${id}/content`);
|
|
185
|
+
if (!response.ok) {
|
|
186
|
+
return {
|
|
187
|
+
content: [{ type: 'text', text: JSON.stringify({ error: `Fetch failed: ${response.status}` }) }],
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
const data = await response.json();
|
|
191
|
+
store.cacheRemoteContent(id, data.content);
|
|
192
|
+
return {
|
|
193
|
+
content: [{ type: 'text', text: JSON.stringify({ id, content: data.content, cached: false }) }],
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
return {
|
|
198
|
+
content: [{ type: 'text', text: JSON.stringify({ error: `Fetch error: ${err instanceof Error ? err.message : String(err)}` }) }],
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
// ── Start ────────────────────────────────────────────────────────────────────
|
|
203
|
+
const transport = new StdioServerTransport();
|
|
204
|
+
await server.connect(transport);
|
|
205
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User-facing error formatting for operators.
|
|
3
|
+
* Full stack traces and raw RPC errors are reserved for JINN_DEBUG mode.
|
|
4
|
+
*/
|
|
5
|
+
/** True when JINN_DEBUG is set (also mirrored in loadConfig as `debug`). */
|
|
6
|
+
export declare function isJinnDebug(): boolean;
|
|
7
|
+
export interface OperatorErrorParts {
|
|
8
|
+
/** Primary operator-facing line */
|
|
9
|
+
summary: string;
|
|
10
|
+
/** Optional follow-up guidance */
|
|
11
|
+
hint?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Map common Safe / RPC failures to short messages. Falls back to a trimmed raw line.
|
|
15
|
+
*/
|
|
16
|
+
export declare function formatBootstrapOperatorMessage(error: unknown): OperatorErrorParts;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User-facing error formatting for operators.
|
|
3
|
+
* Full stack traces and raw RPC errors are reserved for JINN_DEBUG mode.
|
|
4
|
+
*/
|
|
5
|
+
function envDebugTruthy(value) {
|
|
6
|
+
if (value === undefined)
|
|
7
|
+
return false;
|
|
8
|
+
const v = value.trim().toLowerCase();
|
|
9
|
+
return v === '1' || v === 'true' || v === 'yes';
|
|
10
|
+
}
|
|
11
|
+
/** True when JINN_DEBUG is set (also mirrored in loadConfig as `debug`). */
|
|
12
|
+
export function isJinnDebug() {
|
|
13
|
+
return envDebugTruthy(process.env['JINN_DEBUG']);
|
|
14
|
+
}
|
|
15
|
+
function stringifyUnknown(error) {
|
|
16
|
+
if (error === null || error === undefined)
|
|
17
|
+
return String(error);
|
|
18
|
+
if (typeof error === 'string')
|
|
19
|
+
return error;
|
|
20
|
+
if (error instanceof Error) {
|
|
21
|
+
let s = error.message;
|
|
22
|
+
const withCause = error;
|
|
23
|
+
if (withCause.cause !== undefined && withCause.cause !== null) {
|
|
24
|
+
s += ' | ' + stringifyUnknown(withCause.cause);
|
|
25
|
+
}
|
|
26
|
+
return s;
|
|
27
|
+
}
|
|
28
|
+
if (typeof error === 'object') {
|
|
29
|
+
const o = error;
|
|
30
|
+
const parts = [];
|
|
31
|
+
if (typeof o.shortMessage === 'string')
|
|
32
|
+
parts.push(o.shortMessage);
|
|
33
|
+
if (typeof o.details === 'string')
|
|
34
|
+
parts.push(o.details);
|
|
35
|
+
if (typeof o.message === 'string' && !parts.includes(o.message))
|
|
36
|
+
parts.push(o.message);
|
|
37
|
+
if (parts.length > 0)
|
|
38
|
+
return parts.join(' | ');
|
|
39
|
+
try {
|
|
40
|
+
return JSON.stringify(error);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return String(error);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return String(error);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Map common Safe / RPC failures to short messages. Falls back to a trimmed raw line.
|
|
50
|
+
*/
|
|
51
|
+
export function formatBootstrapOperatorMessage(error) {
|
|
52
|
+
const msg = stringifyUnknown(error);
|
|
53
|
+
const lower = msg.toLowerCase();
|
|
54
|
+
if (msg.includes('GS013')) {
|
|
55
|
+
return {
|
|
56
|
+
summary: 'Gnosis Safe could not execute or estimate this transaction (GS013: inner call may have reverted or gas estimation failed).',
|
|
57
|
+
hint: 'Retry after a few blocks or switch RPC. Full cause chain is in the error envelope details.',
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (msg.includes('GS026')) {
|
|
61
|
+
return {
|
|
62
|
+
summary: 'Gnosis Safe rejected the transaction (GS026: invalid owner address or signature).',
|
|
63
|
+
hint: 'Confirm the signing key is a Safe owner and the Safe address matches your fleet state.',
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
if (lower.includes('replacement transaction underpriced') ||
|
|
67
|
+
lower.includes('replacement fee too low') ||
|
|
68
|
+
lower.includes('fee cap less than block base fee')) {
|
|
69
|
+
return {
|
|
70
|
+
summary: 'A transaction with the same nonce is already pending, and the new gas price is too low.',
|
|
71
|
+
hint: 'Wait for confirmation, cancel/replace with a higher maxFeePerGas, or clear the stuck nonce.',
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
if (lower.includes('insufficient funds') ||
|
|
75
|
+
msg.includes('INSUFFICIENT_FUNDS') ||
|
|
76
|
+
lower.includes('exceeds the balance of the account')) {
|
|
77
|
+
return {
|
|
78
|
+
summary: 'Not enough ETH on the paying account to cover gas (and value, if any).',
|
|
79
|
+
hint: 'Send ETH to the master wallet, agent EOA, or Safe depending on which step failed.',
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const firstLine = msg.split('\n')[0]?.trim() ?? msg;
|
|
83
|
+
if (firstLine.length > 220) {
|
|
84
|
+
return { summary: `${firstLine.slice(0, 220)}…` };
|
|
85
|
+
}
|
|
86
|
+
return { summary: firstLine };
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=operator-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operator-errors.js","sourceRoot":"","sources":["../src/operator-errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preflight check: is the `claude` CLI resolvable and executable?
|
|
3
|
+
*
|
|
4
|
+
* The daemon spawns Claude Code as a subprocess via `ClaudeRunner`
|
|
5
|
+
* (client/src/runner/claude.ts). If the binary isn't on PATH (or at
|
|
6
|
+
* the configured claudePath), the failure surfaces only at the moment
|
|
7
|
+
* a request is claimed — long after bootstrap. This check moves that
|
|
8
|
+
* failure to startup with a clear envelope.
|
|
9
|
+
*/
|
|
10
|
+
export interface ClaudeBinaryCheckResult {
|
|
11
|
+
ok: boolean;
|
|
12
|
+
resolvedPath?: string;
|
|
13
|
+
detail: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Resolve and verify a `claude` binary. Accepts either an absolute path or a
|
|
17
|
+
* bare name to look up on PATH (via `which`/`where`).
|
|
18
|
+
*/
|
|
19
|
+
export declare function checkClaudeBinary(claudePath: string): Promise<ClaudeBinaryCheckResult>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preflight check: is the `claude` CLI resolvable and executable?
|
|
3
|
+
*
|
|
4
|
+
* The daemon spawns Claude Code as a subprocess via `ClaudeRunner`
|
|
5
|
+
* (client/src/runner/claude.ts). If the binary isn't on PATH (or at
|
|
6
|
+
* the configured claudePath), the failure surfaces only at the moment
|
|
7
|
+
* a request is claimed — long after bootstrap. This check moves that
|
|
8
|
+
* failure to startup with a clear envelope.
|
|
9
|
+
*/
|
|
10
|
+
import { promises as fs, constants as fsConstants } from 'node:fs';
|
|
11
|
+
import { execFile } from 'node:child_process';
|
|
12
|
+
import { promisify } from 'node:util';
|
|
13
|
+
import { isAbsolute } from 'node:path';
|
|
14
|
+
const execFileAsync = promisify(execFile);
|
|
15
|
+
/**
|
|
16
|
+
* Resolve and verify a `claude` binary. Accepts either an absolute path or a
|
|
17
|
+
* bare name to look up on PATH (via `which`/`where`).
|
|
18
|
+
*/
|
|
19
|
+
export async function checkClaudeBinary(claudePath) {
|
|
20
|
+
// Absolute / relative path: fs.access is authoritative.
|
|
21
|
+
if (isAbsolute(claudePath) || claudePath.includes('/')) {
|
|
22
|
+
try {
|
|
23
|
+
await fs.access(claudePath, fsConstants.X_OK);
|
|
24
|
+
return { ok: true, resolvedPath: claudePath, detail: `${claudePath} is executable` };
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return { ok: false, detail: `claude binary not found at ${claudePath}` };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Bare name: shell out to `which` (POSIX) or `where` (Windows). We only
|
|
31
|
+
// support POSIX here; the production target is macOS/Linux.
|
|
32
|
+
try {
|
|
33
|
+
const { stdout } = await execFileAsync('which', [claudePath]);
|
|
34
|
+
const resolved = stdout.trim().split('\n')[0];
|
|
35
|
+
if (!resolved) {
|
|
36
|
+
return { ok: false, detail: `claude binary '${claudePath}' not found on PATH` };
|
|
37
|
+
}
|
|
38
|
+
return { ok: true, resolvedPath: resolved, detail: `${resolved} is on PATH` };
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return { ok: false, detail: `claude binary '${claudePath}' not found on PATH` };
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=claude-binary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-binary.js","sourceRoot":"","sources":["../../src/preflight/claude-binary.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAQ1C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAkB;IACxD,wDAAwD;IACxD,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;YAC9C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,UAAU,gBAAgB,EAAE,CAAC;QACvF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,8BAA8B,UAAU,EAAE,EAAE,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,4DAA4D;IAC5D,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,UAAU,qBAAqB,EAAE,CAAC;QAClF,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,QAAQ,aAAa,EAAE,CAAC;IAChF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,UAAU,qBAAqB,EAAE,CAAC;IAClF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build and emit the `invalid_invocation` envelope when the Claude CLI
|
|
3
|
+
* preflight fails. Shared by `main.ts` and unit tests so the contract stays
|
|
4
|
+
* in one place (spec §6 / §6.2 / §7.6).
|
|
5
|
+
*/
|
|
6
|
+
import { type EnvelopeSinks } from '../errors/envelope.js';
|
|
7
|
+
/** §7.6 — omit forbidden absolute paths from envelope `details.attempted`. */
|
|
8
|
+
export declare function sanitizedClaudeAttemptedForEnvelope(claudePath: string): string;
|
|
9
|
+
/** §7.6 — `invalid_invocation.message` must not echo forbidden absolute paths. */
|
|
10
|
+
export declare function sanitizedClaudePreflightMessageForEnvelope(detail: string, claudePath: string): string;
|
|
11
|
+
export declare function emitClaudeBinaryPreflightFailure(detail: string, claudePath: string, sinks?: EnvelopeSinks): never;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build and emit the `invalid_invocation` envelope when the Claude CLI
|
|
3
|
+
* preflight fails. Shared by `main.ts` and unit tests so the contract stays
|
|
4
|
+
* in one place (spec §6 / §6.2 / §7.6).
|
|
5
|
+
*/
|
|
6
|
+
import { homedir } from 'node:os';
|
|
7
|
+
import { dirname, isAbsolute, join, normalize, resolve, sep } from 'node:path';
|
|
8
|
+
import { fileURLToPath } from 'node:url';
|
|
9
|
+
import { emitEnvelope } from '../errors/envelope.js';
|
|
10
|
+
const THIS_DIR = dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
const ENVELOPE_INSTALL_ROOT = normalize(resolve(THIS_DIR, '..', '..'));
|
|
12
|
+
const ENVELOPE_JINN_CLIENT_HOME = normalize(resolve(join(homedir(), '.jinn-client')));
|
|
13
|
+
function envelopePathUnderRoot(absPath, root) {
|
|
14
|
+
const p = normalize(resolve(absPath));
|
|
15
|
+
const r = normalize(resolve(root));
|
|
16
|
+
if (p === r)
|
|
17
|
+
return true;
|
|
18
|
+
const prefix = r.endsWith(sep) ? r : r + sep;
|
|
19
|
+
return p.startsWith(prefix);
|
|
20
|
+
}
|
|
21
|
+
/** §7.6 — omit forbidden absolute paths from envelope `details.attempted`. */
|
|
22
|
+
export function sanitizedClaudeAttemptedForEnvelope(claudePath) {
|
|
23
|
+
const t = claudePath.trim();
|
|
24
|
+
if (!t)
|
|
25
|
+
return 'configured path';
|
|
26
|
+
if (isAbsolute(t) &&
|
|
27
|
+
(envelopePathUnderRoot(t, ENVELOPE_JINN_CLIENT_HOME) || envelopePathUnderRoot(t, ENVELOPE_INSTALL_ROOT))) {
|
|
28
|
+
return 'configured path';
|
|
29
|
+
}
|
|
30
|
+
return t;
|
|
31
|
+
}
|
|
32
|
+
/** §7.6 — `invalid_invocation.message` must not echo forbidden absolute paths. */
|
|
33
|
+
export function sanitizedClaudePreflightMessageForEnvelope(detail, claudePath) {
|
|
34
|
+
let out = detail;
|
|
35
|
+
const t = claudePath.trim();
|
|
36
|
+
const replaceAll = (s, find, rep) => (find ? s.split(find).join(rep) : s);
|
|
37
|
+
if (isAbsolute(t) &&
|
|
38
|
+
(envelopePathUnderRoot(t, ENVELOPE_JINN_CLIENT_HOME) || envelopePathUnderRoot(t, ENVELOPE_INSTALL_ROOT))) {
|
|
39
|
+
const variants = new Set([t, normalize(t)]);
|
|
40
|
+
try {
|
|
41
|
+
variants.add(normalize(resolve(t)));
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
/* ignore */
|
|
45
|
+
}
|
|
46
|
+
for (const v of [...variants].filter(Boolean).sort((a, b) => b.length - a.length)) {
|
|
47
|
+
out = replaceAll(out, v, 'configured path');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
out = replaceAll(out, ENVELOPE_JINN_CLIENT_HOME, 'configured path');
|
|
51
|
+
out = replaceAll(out, ENVELOPE_INSTALL_ROOT, 'configured path');
|
|
52
|
+
return out;
|
|
53
|
+
}
|
|
54
|
+
export function emitClaudeBinaryPreflightFailure(detail, claudePath, sinks = {}) {
|
|
55
|
+
emitEnvelope({
|
|
56
|
+
code: 'invalid_invocation',
|
|
57
|
+
message: sanitizedClaudePreflightMessageForEnvelope(detail, claudePath),
|
|
58
|
+
hint: 'Install Claude Code CLI on your PATH, or set the CLI binary path in your configuration file.',
|
|
59
|
+
exampleCli: 'command -v claude',
|
|
60
|
+
details: {
|
|
61
|
+
field: 'claude_binary',
|
|
62
|
+
expected: 'executable claude binary',
|
|
63
|
+
attempted: sanitizedClaudeAttemptedForEnvelope(claudePath),
|
|
64
|
+
},
|
|
65
|
+
}, sinks);
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=claude-invocation-envelope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-invocation-envelope.js","sourceRoot":"","sources":["../../src/preflight/claude-invocation-envelope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DesiredState, RestorationResult } from '../types/index.js';
|
|
2
|
+
import type { Runner, RunnerContext } from './runner.js';
|
|
3
|
+
export interface ClaudeRunnerConfig {
|
|
4
|
+
claudePath?: string;
|
|
5
|
+
model?: string;
|
|
6
|
+
mcpServerPath?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class ClaudeRunner implements Runner {
|
|
9
|
+
private claudePath;
|
|
10
|
+
private model?;
|
|
11
|
+
private readonly mcpLauncher;
|
|
12
|
+
constructor(config?: ClaudeRunnerConfig);
|
|
13
|
+
run(desiredState: DesiredState, context: RunnerContext): Promise<RestorationResult>;
|
|
14
|
+
}
|
|
15
|
+
export declare function buildPrompt(desiredState: DesiredState): string;
|