@varun-ai07/covenant-mcp 1.3.2 → 2.0.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/dist/abis/GrantProgram.json +778 -0
- package/dist/abis/RevisionManager.json +544 -0
- package/dist/abis/TrainingMarketplace.json +787 -0
- package/dist/cli.js +0 -0
- package/dist/config.d.ts +15 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +23 -3
- package/dist/config.js.map +1 -1
- package/dist/server.d.ts +3 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +63 -63
- package/dist/server.js.map +1 -1
- package/dist/shared-types.js +8 -8
- package/dist/tools/{registry.d.ts → corven-agent.d.ts} +1 -1
- package/dist/tools/corven-agent.d.ts.map +1 -0
- package/dist/tools/corven-agent.js +90 -0
- package/dist/tools/corven-agent.js.map +1 -0
- package/dist/tools/corven-attest.d.ts +3 -0
- package/dist/tools/corven-attest.d.ts.map +1 -0
- package/dist/tools/corven-attest.js +87 -0
- package/dist/tools/corven-attest.js.map +1 -0
- package/dist/tools/{batches.d.ts → corven-batch.d.ts} +1 -1
- package/dist/tools/corven-batch.d.ts.map +1 -0
- package/dist/tools/corven-batch.js +116 -0
- package/dist/tools/corven-batch.js.map +1 -0
- package/dist/tools/{bounties.d.ts → corven-bounty.d.ts} +1 -1
- package/dist/tools/corven-bounty.d.ts.map +1 -0
- package/dist/tools/corven-bounty.js +72 -0
- package/dist/tools/corven-bounty.js.map +1 -0
- package/dist/tools/{collectives.d.ts → corven-collective.d.ts} +1 -1
- package/dist/tools/corven-collective.d.ts.map +1 -0
- package/dist/tools/corven-collective.js +105 -0
- package/dist/tools/corven-collective.js.map +1 -0
- package/dist/tools/corven-fiat.d.ts +3 -0
- package/dist/tools/corven-fiat.d.ts.map +1 -0
- package/dist/tools/corven-fiat.js +42 -0
- package/dist/tools/corven-fiat.js.map +1 -0
- package/dist/tools/corven-govern.d.ts +3 -0
- package/dist/tools/corven-govern.d.ts.map +1 -0
- package/dist/tools/corven-govern.js +65 -0
- package/dist/tools/corven-govern.js.map +1 -0
- package/dist/tools/{grants.d.ts → corven-grants.d.ts} +1 -1
- package/dist/tools/corven-grants.d.ts.map +1 -0
- package/dist/tools/corven-grants.js +67 -0
- package/dist/tools/corven-grants.js.map +1 -0
- package/dist/tools/{insurance.d.ts → corven-insurance.d.ts} +1 -1
- package/dist/tools/corven-insurance.d.ts.map +1 -0
- package/dist/tools/corven-insurance.js +103 -0
- package/dist/tools/corven-insurance.js.map +1 -0
- package/dist/tools/{market.d.ts → corven-market.d.ts} +1 -1
- package/dist/tools/corven-market.d.ts.map +1 -0
- package/dist/tools/corven-market.js +113 -0
- package/dist/tools/corven-market.js.map +1 -0
- package/dist/tools/corven-match.d.ts +3 -0
- package/dist/tools/corven-match.d.ts.map +1 -0
- package/dist/tools/corven-match.js +235 -0
- package/dist/tools/corven-match.js.map +1 -0
- package/dist/tools/corven-message.d.ts +3 -0
- package/dist/tools/corven-message.d.ts.map +1 -0
- package/dist/tools/corven-message.js +82 -0
- package/dist/tools/corven-message.js.map +1 -0
- package/dist/tools/corven-multi.d.ts +3 -0
- package/dist/tools/corven-multi.d.ts.map +1 -0
- package/dist/tools/corven-multi.js +197 -0
- package/dist/tools/corven-multi.js.map +1 -0
- package/dist/tools/corven-reputation.d.ts +3 -0
- package/dist/tools/corven-reputation.d.ts.map +1 -0
- package/dist/tools/corven-reputation.js +126 -0
- package/dist/tools/corven-reputation.js.map +1 -0
- package/dist/tools/{revisions.d.ts → corven-revision.d.ts} +1 -1
- package/dist/tools/corven-revision.d.ts.map +1 -0
- package/dist/tools/corven-revision.js +73 -0
- package/dist/tools/corven-revision.js.map +1 -0
- package/dist/tools/{router.d.ts → corven-router.d.ts} +1 -1
- package/dist/tools/corven-router.d.ts.map +1 -0
- package/dist/tools/corven-router.js +116 -0
- package/dist/tools/corven-router.js.map +1 -0
- package/dist/tools/corven-stats.d.ts +3 -0
- package/dist/tools/corven-stats.d.ts.map +1 -0
- package/dist/tools/corven-stats.js +97 -0
- package/dist/tools/corven-stats.js.map +1 -0
- package/dist/tools/corven-stream.d.ts +3 -0
- package/dist/tools/corven-stream.d.ts.map +1 -0
- package/dist/tools/corven-stream.js +197 -0
- package/dist/tools/corven-stream.js.map +1 -0
- package/dist/tools/corven-task.d.ts +3 -0
- package/dist/tools/corven-task.d.ts.map +1 -0
- package/dist/tools/corven-task.js +105 -0
- package/dist/tools/corven-task.js.map +1 -0
- package/dist/tools/{training.d.ts → corven-training.d.ts} +1 -1
- package/dist/tools/corven-training.d.ts.map +1 -0
- package/dist/tools/corven-training.js +73 -0
- package/dist/tools/corven-training.js.map +1 -0
- package/dist/tools/corven-verify.d.ts +3 -0
- package/dist/tools/corven-verify.d.ts.map +1 -0
- package/dist/tools/corven-verify.js +149 -0
- package/dist/tools/corven-verify.js.map +1 -0
- package/dist/tools/corven-wallet.d.ts +3 -0
- package/dist/tools/corven-wallet.d.ts.map +1 -0
- package/dist/tools/corven-wallet.js +235 -0
- package/dist/tools/corven-wallet.js.map +1 -0
- package/dist/tools/covenant-help.d.ts.map +1 -1
- package/dist/tools/covenant-help.js +88 -312
- package/dist/tools/covenant-help.js.map +1 -1
- package/dist/tools/disputes.d.ts.map +1 -1
- package/dist/tools/disputes.js +26 -0
- package/dist/tools/disputes.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/abis/v2/DisputeResolution.json +0 -493
- package/dist/abis/v2/InsurancePool.json +0 -645
- package/dist/tools/account-abstraction.d.ts +0 -3
- package/dist/tools/account-abstraction.d.ts.map +0 -1
- package/dist/tools/account-abstraction.js +0 -364
- package/dist/tools/account-abstraction.js.map +0 -1
- package/dist/tools/batches.d.ts.map +0 -1
- package/dist/tools/batches.js +0 -231
- package/dist/tools/batches.js.map +0 -1
- package/dist/tools/bounties.d.ts.map +0 -1
- package/dist/tools/bounties.js +0 -304
- package/dist/tools/bounties.js.map +0 -1
- package/dist/tools/bridge.d.ts +0 -3
- package/dist/tools/bridge.d.ts.map +0 -1
- package/dist/tools/bridge.js +0 -190
- package/dist/tools/bridge.js.map +0 -1
- package/dist/tools/collectives.d.ts.map +0 -1
- package/dist/tools/collectives.js +0 -249
- package/dist/tools/collectives.js.map +0 -1
- package/dist/tools/cross-chain.d.ts +0 -3
- package/dist/tools/cross-chain.d.ts.map +0 -1
- package/dist/tools/cross-chain.js +0 -77
- package/dist/tools/cross-chain.js.map +0 -1
- package/dist/tools/escrow.d.ts +0 -3
- package/dist/tools/escrow.d.ts.map +0 -1
- package/dist/tools/escrow.js +0 -606
- package/dist/tools/escrow.js.map +0 -1
- package/dist/tools/fiat-onramp.d.ts +0 -3
- package/dist/tools/fiat-onramp.d.ts.map +0 -1
- package/dist/tools/fiat-onramp.js +0 -108
- package/dist/tools/fiat-onramp.js.map +0 -1
- package/dist/tools/governance.d.ts +0 -3
- package/dist/tools/governance.d.ts.map +0 -1
- package/dist/tools/governance.js +0 -271
- package/dist/tools/governance.js.map +0 -1
- package/dist/tools/grants.d.ts.map +0 -1
- package/dist/tools/grants.js +0 -269
- package/dist/tools/grants.js.map +0 -1
- package/dist/tools/insurance.d.ts.map +0 -1
- package/dist/tools/insurance.js +0 -271
- package/dist/tools/insurance.js.map +0 -1
- package/dist/tools/market.d.ts.map +0 -1
- package/dist/tools/market.js +0 -393
- package/dist/tools/market.js.map +0 -1
- package/dist/tools/matching.d.ts +0 -3
- package/dist/tools/matching.d.ts.map +0 -1
- package/dist/tools/matching.js +0 -233
- package/dist/tools/matching.js.map +0 -1
- package/dist/tools/messaging.d.ts +0 -3
- package/dist/tools/messaging.d.ts.map +0 -1
- package/dist/tools/messaging.js +0 -159
- package/dist/tools/messaging.js.map +0 -1
- package/dist/tools/multi-token.d.ts +0 -3
- package/dist/tools/multi-token.d.ts.map +0 -1
- package/dist/tools/multi-token.js +0 -274
- package/dist/tools/multi-token.js.map +0 -1
- package/dist/tools/offchain-coordinator.d.ts +0 -3
- package/dist/tools/offchain-coordinator.d.ts.map +0 -1
- package/dist/tools/offchain-coordinator.js +0 -436
- package/dist/tools/offchain-coordinator.js.map +0 -1
- package/dist/tools/protocol.d.ts +0 -3
- package/dist/tools/protocol.d.ts.map +0 -1
- package/dist/tools/protocol.js +0 -127
- package/dist/tools/protocol.js.map +0 -1
- package/dist/tools/receipts.d.ts +0 -3
- package/dist/tools/receipts.d.ts.map +0 -1
- package/dist/tools/receipts.js +0 -147
- package/dist/tools/receipts.js.map +0 -1
- package/dist/tools/registry.d.ts.map +0 -1
- package/dist/tools/registry.js +0 -245
- package/dist/tools/registry.js.map +0 -1
- package/dist/tools/reputation-vc.d.ts +0 -3
- package/dist/tools/reputation-vc.d.ts.map +0 -1
- package/dist/tools/reputation-vc.js +0 -438
- package/dist/tools/reputation-vc.js.map +0 -1
- package/dist/tools/revisions.d.ts.map +0 -1
- package/dist/tools/revisions.js +0 -108
- package/dist/tools/revisions.js.map +0 -1
- package/dist/tools/router.d.ts.map +0 -1
- package/dist/tools/router.js +0 -104
- package/dist/tools/router.js.map +0 -1
- package/dist/tools/streaming.d.ts +0 -3
- package/dist/tools/streaming.d.ts.map +0 -1
- package/dist/tools/streaming.js +0 -350
- package/dist/tools/streaming.js.map +0 -1
- package/dist/tools/templates.d.ts +0 -3
- package/dist/tools/templates.d.ts.map +0 -1
- package/dist/tools/templates.js +0 -392
- package/dist/tools/templates.js.map +0 -1
- package/dist/tools/training.d.ts.map +0 -1
- package/dist/tools/training.js +0 -304
- package/dist/tools/training.js.map +0 -1
- package/dist/tools/v2-settlement.d.ts +0 -3
- package/dist/tools/v2-settlement.d.ts.map +0 -1
- package/dist/tools/v2-settlement.js +0 -226
- package/dist/tools/v2-settlement.js.map +0 -1
- package/dist/tools/verification.d.ts +0 -3
- package/dist/tools/verification.d.ts.map +0 -1
- package/dist/tools/verification.js +0 -215
- package/dist/tools/verification.js.map +0 -1
- package/dist/tools/verify-deep.d.ts +0 -3
- package/dist/tools/verify-deep.d.ts.map +0 -1
- package/dist/tools/verify-deep.js +0 -125
- package/dist/tools/verify-deep.js.map +0 -1
|
@@ -1,438 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Reputation Portability Tools
|
|
3
|
-
*
|
|
4
|
-
* Export agent reputation as W3C Verifiable Credentials (JWT format)
|
|
5
|
-
* for cross-platform portability. Other agent networks can verify
|
|
6
|
-
* and import these credentials to bootstrap trust.
|
|
7
|
-
*
|
|
8
|
-
* Tools:
|
|
9
|
-
* corven_export_reputation_vc — Export reputation as a signed VC JWT
|
|
10
|
-
* corven_import_reputation_vc — Verify and parse a reputation VC
|
|
11
|
-
* corven_get_agent_did — Get DID document for an agent
|
|
12
|
-
*/
|
|
13
|
-
import { z } from "zod";
|
|
14
|
-
import { keccak256, toBytes, toHex, hexToBytes, } from "viem";
|
|
15
|
-
import { loadAbi, CONTRACTS, getWalletClient, CHAIN } from "../config.js";
|
|
16
|
-
import { readContract } from "../handlers/wallet.js";
|
|
17
|
-
import { formatReadResult, formatError } from "../handlers/transactions.js";
|
|
18
|
-
import { ethAddress } from "../lib/schemaHelpers.js";
|
|
19
|
-
import { parseContractError, formatStructuredError } from "../lib/formatResponse.js";
|
|
20
|
-
import { addressToDid, didToAddress, hashCapabilities, createDIDDocument, } from "../lib/did.js";
|
|
21
|
-
// ============================================================
|
|
22
|
-
// ABIs
|
|
23
|
-
// ============================================================
|
|
24
|
-
const REGISTRY_ABI = loadAbi("AgentRegistry");
|
|
25
|
-
const VERIFIER_ABI = loadAbi("ReceiptVerifier");
|
|
26
|
-
// ============================================================
|
|
27
|
-
// JWT helpers (no external deps — ES256K over secp256k1)
|
|
28
|
-
// ============================================================
|
|
29
|
-
function base64urlEncode(data) {
|
|
30
|
-
const bytes = typeof data === "string" ? new TextEncoder().encode(data) : data;
|
|
31
|
-
// Node.js Buffer handles base64url natively
|
|
32
|
-
return Buffer.from(bytes)
|
|
33
|
-
.toString("base64")
|
|
34
|
-
.replace(/\+/g, "-")
|
|
35
|
-
.replace(/\//g, "_")
|
|
36
|
-
.replace(/=+$/, "");
|
|
37
|
-
}
|
|
38
|
-
function base64urlDecode(str) {
|
|
39
|
-
// Restore standard base64
|
|
40
|
-
const padded = str.replace(/-/g, "+").replace(/_/g, "/");
|
|
41
|
-
return new Uint8Array(Buffer.from(padded, "base64"));
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Create a compact JWT signed with the agent's Ethereum private key.
|
|
45
|
-
* Uses ES256K (secp256k1 ECDSA) which is the natural curve for Ethereum.
|
|
46
|
-
*/
|
|
47
|
-
async function createJwt(payload, signer) {
|
|
48
|
-
// JWT header
|
|
49
|
-
const header = { alg: "ES256K", typ: "JWT" };
|
|
50
|
-
const headerB64 = base64urlEncode(JSON.stringify(header));
|
|
51
|
-
const payloadB64 = base64urlEncode(JSON.stringify(payload));
|
|
52
|
-
// Signing input: header.payload
|
|
53
|
-
const signingInput = `${headerB64}.${payloadB64}`;
|
|
54
|
-
const signingInputBytes = toBytes(signingInput);
|
|
55
|
-
const messageHash = keccak256(signingInputBytes);
|
|
56
|
-
// Sign with the wallet's private key (EIP-191 personal sign style)
|
|
57
|
-
const signature = await signer.signMessage({
|
|
58
|
-
message: { raw: hexToBytes(messageHash) },
|
|
59
|
-
});
|
|
60
|
-
// Extract r, s, v from signature
|
|
61
|
-
const sigBytes = hexToBytes(signature);
|
|
62
|
-
// r = first 32 bytes, s = next 32 bytes (drop v byte if present)
|
|
63
|
-
const r = sigBytes.slice(0, 32);
|
|
64
|
-
const s = sigBytes.slice(32, 64);
|
|
65
|
-
const sigCompact = new Uint8Array([...r, ...s]);
|
|
66
|
-
const sigB64 = base64urlEncode(sigCompact);
|
|
67
|
-
return `${headerB64}.${payloadB64}.${sigB64}`;
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Verify a JWT and return the parsed payload.
|
|
71
|
-
* Verifies the signature against the issuer address embedded in the payload.
|
|
72
|
-
*/
|
|
73
|
-
async function verifyJwt(jwt, publicClient) {
|
|
74
|
-
const parts = jwt.split(".");
|
|
75
|
-
if (parts.length !== 3) {
|
|
76
|
-
return { valid: false, payload: null, error: "Invalid JWT format: expected 3 parts" };
|
|
77
|
-
}
|
|
78
|
-
const [headerB64, payloadB64, sigB64] = parts;
|
|
79
|
-
// Decode and parse payload
|
|
80
|
-
let payload;
|
|
81
|
-
try {
|
|
82
|
-
const payloadBytes = base64urlDecode(payloadB64);
|
|
83
|
-
payload = JSON.parse(new TextDecoder().decode(payloadBytes));
|
|
84
|
-
}
|
|
85
|
-
catch (e) {
|
|
86
|
-
return { valid: false, payload: null, error: "Invalid JWT payload encoding" };
|
|
87
|
-
}
|
|
88
|
-
// Verify expiry
|
|
89
|
-
const now = Math.floor(Date.now() / 1000);
|
|
90
|
-
if (payload.exp && payload.exp < now) {
|
|
91
|
-
return { valid: false, payload, error: "VC has expired" };
|
|
92
|
-
}
|
|
93
|
-
// Reconstruct signing input and hash
|
|
94
|
-
const signingInput = `${headerB64}.${payloadB64}`;
|
|
95
|
-
const signingInputBytes = toBytes(signingInput);
|
|
96
|
-
const messageHash = keccak256(signingInputBytes);
|
|
97
|
-
// Recover the signer address from the signature
|
|
98
|
-
try {
|
|
99
|
-
const sigBytes = base64urlDecode(sigB64);
|
|
100
|
-
const r = sigBytes.slice(0, 32);
|
|
101
|
-
const s = sigBytes.slice(32, 64);
|
|
102
|
-
// Try recovery ids 0 and 27 (EIP-155 vs non-EIP-155)
|
|
103
|
-
for (const v of [27, 28]) {
|
|
104
|
-
const fullSig = new Uint8Array([...r, ...s, v]);
|
|
105
|
-
const sigHex = toHex(fullSig);
|
|
106
|
-
try {
|
|
107
|
-
const recovered = await publicClient.verifyMessage({
|
|
108
|
-
address: didToAddress(payload.iss),
|
|
109
|
-
message: { raw: hexToBytes(messageHash) },
|
|
110
|
-
signature: sigHex,
|
|
111
|
-
});
|
|
112
|
-
if (recovered) {
|
|
113
|
-
return { valid: true, payload };
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
catch {
|
|
117
|
-
continue;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
return { valid: false, payload, error: "Signature verification failed" };
|
|
121
|
-
}
|
|
122
|
-
catch (e) {
|
|
123
|
-
return {
|
|
124
|
-
valid: false,
|
|
125
|
-
payload,
|
|
126
|
-
error: `Signature recovery failed: ${e instanceof Error ? e.message : String(e)}`,
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
// ============================================================
|
|
131
|
-
// Input schemas
|
|
132
|
-
// ============================================================
|
|
133
|
-
const exportSchema = z.object({
|
|
134
|
-
address: ethAddress,
|
|
135
|
-
expiryDays: z.number().int().min(1).max(365).optional().default(30),
|
|
136
|
-
});
|
|
137
|
-
const importSchema = z.object({
|
|
138
|
-
jwt: z.string().min(10).describe("The VC JWT string to verify and import"),
|
|
139
|
-
});
|
|
140
|
-
const didSchema = z.object({
|
|
141
|
-
address: ethAddress,
|
|
142
|
-
});
|
|
143
|
-
// ============================================================
|
|
144
|
-
// Tool registration
|
|
145
|
-
// ============================================================
|
|
146
|
-
export function registerReputationVCTools(server) {
|
|
147
|
-
// ──────────────────────────────────────────────────────────────
|
|
148
|
-
// corven_export_reputation_vc
|
|
149
|
-
// ──────────────────────────────────────────────────────────────
|
|
150
|
-
server.registerTool("corven_export_reputation_vc", {
|
|
151
|
-
title: "Export Reputation VC",
|
|
152
|
-
description: "Export an agent's reputation as a W3C Verifiable Credential (JWT format). " +
|
|
153
|
-
"Reads on-chain reputation, task history, and attestation receipts. " +
|
|
154
|
-
"The VC is signed by the agent's wallet (ES256K) and can be verified " +
|
|
155
|
-
"by any platform that supports W3C VCs and did:covenant.\n" +
|
|
156
|
-
"USE WHEN: You need to port your reputation to another platform, prove your agent's track record, or bootstrap trust on a new network.\n" +
|
|
157
|
-
"REQUIRES: Agent must be registered on AgentRegistry with reputation > 0. Wallet must be configured (PRIVATE_KEY).\n" +
|
|
158
|
-
"RETURNS: JWT string containing W3C VC with reputation, tasksCompleted, successRate, averageRating, totalEarned, topCapabilities, memberSince, rank, attestationCount.\n" +
|
|
159
|
-
"COMES BEFORE: Cross-platform reputation import or third-party verification.\n" +
|
|
160
|
-
"COMES AFTER: corven_register_agent, corven_verify_task (reputation must exist).\n" +
|
|
161
|
-
"NOTE: JWT uses ES256K (secp256k1). VC type is 'CovenantReputation'. Expired VCs will fail verification.",
|
|
162
|
-
inputSchema: {
|
|
163
|
-
address: ethAddress,
|
|
164
|
-
expiryDays: z.number().optional().describe("VC expiry in days (default 30)"),
|
|
165
|
-
},
|
|
166
|
-
}, async ({ address, expiryDays }) => {
|
|
167
|
-
try {
|
|
168
|
-
const parsed = exportSchema.safeParse({ address, expiryDays });
|
|
169
|
-
if (!parsed.success) {
|
|
170
|
-
return formatError(new Error(`Invalid input: ${parsed.error.issues.map((e) => e.message).join(", ")}`));
|
|
171
|
-
}
|
|
172
|
-
const { address: addr, expiryDays: days } = parsed.data;
|
|
173
|
-
const agentDid = addressToDid(addr);
|
|
174
|
-
// Read agent data from AgentRegistry
|
|
175
|
-
const agentData = await readContract(CONTRACTS.AgentRegistry, REGISTRY_ABI, "getAgent", [addr]);
|
|
176
|
-
const agent = agentData;
|
|
177
|
-
if (!agent || !agent.isActive) {
|
|
178
|
-
return formatError(new Error(`Agent ${addr} is not registered or not active on AgentRegistry`));
|
|
179
|
-
}
|
|
180
|
-
// Read attestation receipt count
|
|
181
|
-
let attestationCount = 0;
|
|
182
|
-
try {
|
|
183
|
-
const receipts = await readContract(CONTRACTS.ReceiptVerifier, VERIFIER_ABI, "getReceiptsByAgent", [addr]);
|
|
184
|
-
attestationCount = Array.isArray(receipts) ? receipts.length : 0;
|
|
185
|
-
}
|
|
186
|
-
catch {
|
|
187
|
-
// ReceiptVerifier may not have data — not fatal
|
|
188
|
-
}
|
|
189
|
-
// Build capability hashes
|
|
190
|
-
const capabilityHashes = hashCapabilities(agent.capabilities);
|
|
191
|
-
// Compute success rate
|
|
192
|
-
const totalTasks = agent.tasksCompleted + agent.tasksFailed;
|
|
193
|
-
const successRate = totalTasks > 0
|
|
194
|
-
? Math.round((agent.tasksCompleted / totalTasks) * 1000) / 1000
|
|
195
|
-
: 0;
|
|
196
|
-
// Derive average rating from reputation (reputation is 0-1000, map to 0-5)
|
|
197
|
-
const averageRating = Math.round((Number(agent.reputation) / 200) * 10) / 10;
|
|
198
|
-
// Top capabilities (first 5)
|
|
199
|
-
const topCapabilities = agent.capabilities.slice(0, 5);
|
|
200
|
-
// Member since (ISO date from registeredAt)
|
|
201
|
-
const registeredAtSec = Number(agent.registeredAt);
|
|
202
|
-
const memberSince = registeredAtSec > 0
|
|
203
|
-
? new Date(registeredAtSec * 1000).toISOString().split("T")[0]
|
|
204
|
-
: "unknown";
|
|
205
|
-
// Rank based on tasks completed
|
|
206
|
-
const tasksCompleted = Number(agent.tasksCompleted);
|
|
207
|
-
let rank = "Newcomer";
|
|
208
|
-
if (tasksCompleted >= 500)
|
|
209
|
-
rank = "Top 1%";
|
|
210
|
-
else if (tasksCompleted >= 200)
|
|
211
|
-
rank = "Top 5%";
|
|
212
|
-
else if (tasksCompleted >= 50)
|
|
213
|
-
rank = "Top 10%";
|
|
214
|
-
else if (tasksCompleted >= 10)
|
|
215
|
-
rank = "Established";
|
|
216
|
-
// Timestamps
|
|
217
|
-
const now = Math.floor(Date.now() / 1000);
|
|
218
|
-
const exp = now + (days * 24 * 60 * 60);
|
|
219
|
-
// Build the VC payload
|
|
220
|
-
const payload = {
|
|
221
|
-
iss: agentDid,
|
|
222
|
-
sub: agentDid,
|
|
223
|
-
iat: now,
|
|
224
|
-
exp,
|
|
225
|
-
nonce: keccak256(toBytes(`${addr}-${now}-${Math.random()}`)),
|
|
226
|
-
vc: {
|
|
227
|
-
"@context": [
|
|
228
|
-
"https://www.w3.org/2018/credentials/v1",
|
|
229
|
-
"https://covenant.io/credentials/v1",
|
|
230
|
-
],
|
|
231
|
-
type: ["VerifiableCredential", "CovenantReputation"],
|
|
232
|
-
credentialSubject: {
|
|
233
|
-
id: agentDid,
|
|
234
|
-
chainId: CHAIN.id,
|
|
235
|
-
contractAddress: CONTRACTS.AgentRegistry,
|
|
236
|
-
reputation: Number(agent.reputation),
|
|
237
|
-
tasksCompleted,
|
|
238
|
-
tasksFailed: Number(agent.tasksFailed),
|
|
239
|
-
successRate,
|
|
240
|
-
averageRating,
|
|
241
|
-
totalEarned: `${(tasksCompleted * 0.001).toFixed(3)} ETH`,
|
|
242
|
-
stakedAmount: agent.stakedAmount.toString(),
|
|
243
|
-
capabilities: agent.capabilities,
|
|
244
|
-
topCapabilities,
|
|
245
|
-
capabilityHashes,
|
|
246
|
-
attestationCount,
|
|
247
|
-
lastActiveAt: Number(agent.lastTaskAt),
|
|
248
|
-
registeredAt: registeredAtSec,
|
|
249
|
-
memberSince,
|
|
250
|
-
rank,
|
|
251
|
-
},
|
|
252
|
-
credentialSchema: {
|
|
253
|
-
id: "https://covenant.io/schemas/CovenantReputation/v1",
|
|
254
|
-
type: "JsonSchema",
|
|
255
|
-
},
|
|
256
|
-
},
|
|
257
|
-
};
|
|
258
|
-
// Sign the JWT
|
|
259
|
-
const wallet = getWalletClient();
|
|
260
|
-
if (!wallet) {
|
|
261
|
-
return formatError(new Error("No wallet configured (PRIVATE_KEY not set). Cannot sign VC."));
|
|
262
|
-
}
|
|
263
|
-
const jwt = await createJwt(payload, wallet);
|
|
264
|
-
return formatReadResult({
|
|
265
|
-
jwt,
|
|
266
|
-
did: agentDid,
|
|
267
|
-
reputation: payload.vc.credentialSubject.reputation,
|
|
268
|
-
tasksCompleted: payload.vc.credentialSubject.tasksCompleted,
|
|
269
|
-
successRate: payload.vc.credentialSubject.successRate,
|
|
270
|
-
averageRating: payload.vc.credentialSubject.averageRating,
|
|
271
|
-
totalEarned: payload.vc.credentialSubject.totalEarned,
|
|
272
|
-
topCapabilities: payload.vc.credentialSubject.topCapabilities,
|
|
273
|
-
memberSince: payload.vc.credentialSubject.memberSince,
|
|
274
|
-
rank: payload.vc.credentialSubject.rank,
|
|
275
|
-
capabilities: payload.vc.credentialSubject.capabilities,
|
|
276
|
-
attestationCount: payload.vc.credentialSubject.attestationCount,
|
|
277
|
-
issuedAt: new Date(now * 1000).toISOString(),
|
|
278
|
-
expiresAt: new Date(exp * 1000).toISOString(),
|
|
279
|
-
note: "W3C Verifiable Credential (CovenantReputation) signed with ES256K. " +
|
|
280
|
-
"Verify with corven_import_reputation_vc.",
|
|
281
|
-
}, "Reputation VC Exported");
|
|
282
|
-
}
|
|
283
|
-
catch (e) {
|
|
284
|
-
const parsed = parseContractError(e);
|
|
285
|
-
return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
|
|
286
|
-
}
|
|
287
|
-
});
|
|
288
|
-
// ──────────────────────────────────────────────────────────────
|
|
289
|
-
// corven_import_reputation_vc
|
|
290
|
-
// ──────────────────────────────────────────────────────────────
|
|
291
|
-
server.registerTool("corven_import_reputation_vc", {
|
|
292
|
-
title: "Import Reputation VC",
|
|
293
|
-
description: "Verify and import a reputation VC from another agent. " +
|
|
294
|
-
"Checks the VC signature, expiry, and that the issuer is a known " +
|
|
295
|
-
"COVENANT agent. Returns the parsed reputation data.\n" +
|
|
296
|
-
"USE WHEN: You receive a JWT from another agent and need to verify their reputation before trusting them with a task.\n" +
|
|
297
|
-
"REQUIRES: Valid VC JWT string (from corven_export_reputation_vc). Public client configured for on-chain issuer verification.\n" +
|
|
298
|
-
"RETURNS: Verification result with issuerRegistered flag, full credential data (reputation, task history, successRate, capabilities, attestationCount), and validity status.\n" +
|
|
299
|
-
"COMES BEFORE: Hiring decisions — use the parsed reputation to decide if the agent is trustworthy.\n" +
|
|
300
|
-
"COMES AFTER: corven_export_reputation_vc (another agent must have exported their VC first).\n" +
|
|
301
|
-
"NOTE: Checks signature (ES256K), expiry, and on-chain registration of the issuer. Returns verified:false with error details on failure.",
|
|
302
|
-
inputSchema: {
|
|
303
|
-
jwt: z.string().describe("The VC JWT string to verify"),
|
|
304
|
-
},
|
|
305
|
-
}, async ({ jwt }) => {
|
|
306
|
-
try {
|
|
307
|
-
const parsed = importSchema.safeParse({ jwt });
|
|
308
|
-
if (!parsed.success) {
|
|
309
|
-
return formatError(new Error(`Invalid input: ${parsed.error.issues.map((e) => e.message).join(", ")}`));
|
|
310
|
-
}
|
|
311
|
-
const { getPublicClient } = await import("../config.js");
|
|
312
|
-
const publicClient = getPublicClient();
|
|
313
|
-
// Verify the JWT signature and expiry
|
|
314
|
-
const result = await verifyJwt(parsed.data.jwt, publicClient);
|
|
315
|
-
if (!result.valid || !result.payload) {
|
|
316
|
-
return formatReadResult({
|
|
317
|
-
verified: false,
|
|
318
|
-
error: result.error || "Verification failed",
|
|
319
|
-
}, "VC Verification Failed");
|
|
320
|
-
}
|
|
321
|
-
const vc = result.payload;
|
|
322
|
-
// Check issuer is a registered COVENANT agent
|
|
323
|
-
const issuerAddress = didToAddress(vc.iss);
|
|
324
|
-
let issuerRegistered = false;
|
|
325
|
-
let issuerData = null;
|
|
326
|
-
try {
|
|
327
|
-
issuerData = await readContract(CONTRACTS.AgentRegistry, REGISTRY_ABI, "getAgent", [issuerAddress]);
|
|
328
|
-
issuerRegistered = true;
|
|
329
|
-
}
|
|
330
|
-
catch {
|
|
331
|
-
issuerRegistered = false;
|
|
332
|
-
}
|
|
333
|
-
return formatReadResult({
|
|
334
|
-
verified: true,
|
|
335
|
-
issuerRegistered,
|
|
336
|
-
issuer: {
|
|
337
|
-
did: vc.iss,
|
|
338
|
-
address: issuerAddress,
|
|
339
|
-
registered: issuerRegistered,
|
|
340
|
-
},
|
|
341
|
-
credential: {
|
|
342
|
-
subject: vc.sub,
|
|
343
|
-
chainId: vc.vc.credentialSubject.chainId,
|
|
344
|
-
reputation: vc.vc.credentialSubject.reputation,
|
|
345
|
-
tasksCompleted: vc.vc.credentialSubject.tasksCompleted,
|
|
346
|
-
tasksFailed: vc.vc.credentialSubject.tasksFailed,
|
|
347
|
-
successRate: vc.vc.credentialSubject.successRate,
|
|
348
|
-
averageRating: vc.vc.credentialSubject.averageRating,
|
|
349
|
-
totalEarned: vc.vc.credentialSubject.totalEarned,
|
|
350
|
-
stakedAmount: vc.vc.credentialSubject.stakedAmount,
|
|
351
|
-
capabilities: vc.vc.credentialSubject.capabilities,
|
|
352
|
-
topCapabilities: vc.vc.credentialSubject.topCapabilities,
|
|
353
|
-
attestationCount: vc.vc.credentialSubject.attestationCount,
|
|
354
|
-
memberSince: vc.vc.credentialSubject.memberSince,
|
|
355
|
-
rank: vc.vc.credentialSubject.rank,
|
|
356
|
-
issuedAt: new Date(vc.iat * 1000).toISOString(),
|
|
357
|
-
expiresAt: new Date(vc.exp * 1000).toISOString(),
|
|
358
|
-
},
|
|
359
|
-
warning: !issuerRegistered
|
|
360
|
-
? "Issuer is not registered on this COVENANT instance. Credential is valid but issuer trust cannot be verified on-chain."
|
|
361
|
-
: undefined,
|
|
362
|
-
}, "VC Verified and Imported");
|
|
363
|
-
}
|
|
364
|
-
catch (e) {
|
|
365
|
-
const parsed = parseContractError(e);
|
|
366
|
-
return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
|
|
367
|
-
}
|
|
368
|
-
});
|
|
369
|
-
// ──────────────────────────────────────────────────────────────
|
|
370
|
-
// corven_get_agent_did
|
|
371
|
-
// ──────────────────────────────────────────────────────────────
|
|
372
|
-
server.registerTool("corven_get_agent_did", {
|
|
373
|
-
title: "Get Agent DID",
|
|
374
|
-
description: "Get the W3C DID (Decentralized Identifier) for a COVENANT agent. " +
|
|
375
|
-
"Returns a did:covenant document with verification methods and " +
|
|
376
|
-
"capability hashes as metadata.\n" +
|
|
377
|
-
"USE WHEN: You need an agent's DID document for cross-platform identity resolution, VC verification, or cryptographic operations.\n" +
|
|
378
|
-
"REQUIRES: Valid Ethereum address. Agent does not need to be registered (DID is derived from address regardless).\n" +
|
|
379
|
-
"RETURNS: Full DID document with @context, id, verificationMethod, authentication, and capabilityAgreement metadata.\n" +
|
|
380
|
-
"COMES BEFORE: Cross-platform identity linking or VC issuance.\n" +
|
|
381
|
-
"COMES AFTER: corven_register_agent (for enriched on-chain metadata).\n" +
|
|
382
|
-
"NOTE: DID format is did:covenant:<address>. Capability hashes use keccak256 for verification.",
|
|
383
|
-
inputSchema: {
|
|
384
|
-
address: ethAddress,
|
|
385
|
-
},
|
|
386
|
-
}, async ({ address }) => {
|
|
387
|
-
try {
|
|
388
|
-
const parsed = didSchema.safeParse({ address });
|
|
389
|
-
if (!parsed.success) {
|
|
390
|
-
return formatError(new Error(`Invalid input: ${parsed.error.issues.map((e) => e.message).join(", ")}`));
|
|
391
|
-
}
|
|
392
|
-
const { address: addr } = parsed.data;
|
|
393
|
-
const did = addressToDid(addr);
|
|
394
|
-
// Try to enrich with on-chain data
|
|
395
|
-
let agentData;
|
|
396
|
-
try {
|
|
397
|
-
const raw = await readContract(CONTRACTS.AgentRegistry, REGISTRY_ABI, "getAgent", [addr]);
|
|
398
|
-
const a = raw;
|
|
399
|
-
agentData = {
|
|
400
|
-
capabilities: a.capabilities,
|
|
401
|
-
reputation: Number(a.reputation),
|
|
402
|
-
tasksCompleted: Number(a.tasksCompleted),
|
|
403
|
-
tasksFailed: Number(a.tasksFailed),
|
|
404
|
-
stakedAmount: a.stakedAmount.toString(),
|
|
405
|
-
};
|
|
406
|
-
}
|
|
407
|
-
catch {
|
|
408
|
-
// Agent not registered — still return DID without metadata
|
|
409
|
-
}
|
|
410
|
-
// Get attestation count if available
|
|
411
|
-
let attestationCount = 0;
|
|
412
|
-
if (agentData) {
|
|
413
|
-
try {
|
|
414
|
-
const receipts = await readContract(CONTRACTS.ReceiptVerifier, VERIFIER_ABI, "getReceiptsByAgent", [addr]);
|
|
415
|
-
attestationCount = Array.isArray(receipts) ? receipts.length : 0;
|
|
416
|
-
}
|
|
417
|
-
catch {
|
|
418
|
-
// Not fatal
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
const doc = createDIDDocument(addr, {
|
|
422
|
-
...agentData,
|
|
423
|
-
attestationCount,
|
|
424
|
-
});
|
|
425
|
-
return formatReadResult({
|
|
426
|
-
did,
|
|
427
|
-
address: addr,
|
|
428
|
-
document: doc,
|
|
429
|
-
registered: !!agentData,
|
|
430
|
-
}, "Agent DID Document");
|
|
431
|
-
}
|
|
432
|
-
catch (e) {
|
|
433
|
-
const parsed = parseContractError(e);
|
|
434
|
-
return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
|
|
435
|
-
}
|
|
436
|
-
});
|
|
437
|
-
}
|
|
438
|
-
//# sourceMappingURL=reputation-vc.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reputation-vc.js","sourceRoot":"","sources":["../../src/tools/reputation-vc.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"revisions.d.ts","sourceRoot":"","sources":["../../src/tools/revisions.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,QAqJtD"}
|
package/dist/tools/revisions.js
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { loadAbi, CONTRACTS } from "../config.js";
|
|
2
|
-
import { executeOrPrepare, readContract } from "../handlers/wallet.js";
|
|
3
|
-
import { formatTxResult, formatReadResult } from "../handlers/transactions.js";
|
|
4
|
-
import { parseContractError, formatStructuredError } from "../lib/formatResponse.js";
|
|
5
|
-
import { ipfsCid, taskId as taskIdSchema } from "../lib/schemaHelpers.js";
|
|
6
|
-
const REVISION_ABI = loadAbi("RevisionManager");
|
|
7
|
-
function getRevisionManagerAddress() {
|
|
8
|
-
const addr = CONTRACTS.RevisionManager;
|
|
9
|
-
if (!addr || addr === "0x0000000000000000000000000000000000000000") {
|
|
10
|
-
throw new Error("RevisionManager not deployed. Set REVISION_MANAGER env var.");
|
|
11
|
-
}
|
|
12
|
-
return addr;
|
|
13
|
-
}
|
|
14
|
-
export function registerRevisionTools(server) {
|
|
15
|
-
server.registerTool("corven_request_revision", {
|
|
16
|
-
title: "Request Revision",
|
|
17
|
-
description: "Client requests changes to submitted work. Free — no cost to request revisions.\n" +
|
|
18
|
-
"USE WHEN: Worker submitted work that needs changes. You want to request modifications.\n" +
|
|
19
|
-
"REQUIRES: Task must have revision allowed. Max 3 revisions per task.\n" +
|
|
20
|
-
"RETURNS: Revision number, feedback hash, and confirmation.\n" +
|
|
21
|
-
"COMES AFTER: corven_verify_task (client reviewed work).\n" +
|
|
22
|
-
"COMES BEFORE: Worker calls corven_submit_revision with changes.\n" +
|
|
23
|
-
"NOTE: Revisions are free. Only dispute costs ETH (stake slashing).",
|
|
24
|
-
inputSchema: {
|
|
25
|
-
taskId: taskIdSchema,
|
|
26
|
-
feedbackHash: ipfsCid.describe("IPFS hash of detailed feedback"),
|
|
27
|
-
},
|
|
28
|
-
}, async (params) => {
|
|
29
|
-
try {
|
|
30
|
-
const { taskId, feedbackHash } = params;
|
|
31
|
-
const addr = getRevisionManagerAddress();
|
|
32
|
-
const result = await executeOrPrepare(addr, REVISION_ABI, "requestRevision", [taskId, feedbackHash]);
|
|
33
|
-
return formatTxResult(result);
|
|
34
|
-
}
|
|
35
|
-
catch (e) {
|
|
36
|
-
const parsed = parseContractError(e);
|
|
37
|
-
return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
server.registerTool("corven_submit_revision", {
|
|
41
|
-
title: "Submit Revision",
|
|
42
|
-
description: "Worker submits revised work after client feedback.\n" +
|
|
43
|
-
"USE WHEN: You received revision feedback and have made changes.\n" +
|
|
44
|
-
"REQUIRES: A revision must have been requested. You must be the worker (not the requester).\n" +
|
|
45
|
-
"RETURNS: Revision number, new deliverable hash, and confirmation.\n" +
|
|
46
|
-
"COMES AFTER: corven_request_revision (client requested changes).\n" +
|
|
47
|
-
"COMES BEFORE: Client reviews revised work with corven_verify_deep or corven_verify_task.",
|
|
48
|
-
inputSchema: {
|
|
49
|
-
taskId: taskIdSchema,
|
|
50
|
-
newHash: ipfsCid.describe("IPFS hash of revised deliverable"),
|
|
51
|
-
},
|
|
52
|
-
}, async (params) => {
|
|
53
|
-
try {
|
|
54
|
-
const { taskId, newHash } = params;
|
|
55
|
-
const addr = getRevisionManagerAddress();
|
|
56
|
-
const result = await executeOrPrepare(addr, REVISION_ABI, "submitRevision", [taskId, newHash]);
|
|
57
|
-
return formatTxResult(result);
|
|
58
|
-
}
|
|
59
|
-
catch (e) {
|
|
60
|
-
const parsed = parseContractError(e);
|
|
61
|
-
return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
server.registerTool("corven_get_revisions", {
|
|
65
|
-
title: "Get Revision History",
|
|
66
|
-
description: "Get all revisions for a task.\n" +
|
|
67
|
-
"USE WHEN: Reviewing revision history before making a decision.\n" +
|
|
68
|
-
"REQUIRES: Task ID.\n" +
|
|
69
|
-
"RETURNS: Array of revisions with numbers, feedback, hashes, and timestamps.",
|
|
70
|
-
inputSchema: {
|
|
71
|
-
taskId: taskIdSchema,
|
|
72
|
-
},
|
|
73
|
-
}, async (params) => {
|
|
74
|
-
try {
|
|
75
|
-
const { taskId } = params;
|
|
76
|
-
const addr = getRevisionManagerAddress();
|
|
77
|
-
const revisions = await readContract(addr, REVISION_ABI, "getRevisions", [taskId]);
|
|
78
|
-
return formatReadResult({ taskId, revisionCount: revisions.length, revisions }, `Revisions for Task #${taskId}`);
|
|
79
|
-
}
|
|
80
|
-
catch (e) {
|
|
81
|
-
const parsed = parseContractError(e);
|
|
82
|
-
return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
server.registerTool("corven_can_revise", {
|
|
86
|
-
title: "Check If Revisions Allowed",
|
|
87
|
-
description: "Check if a task can still receive revisions.\n" +
|
|
88
|
-
"USE WHEN: Checking if more revisions are possible.\n" +
|
|
89
|
-
"REQUIRES: Task ID.\n" +
|
|
90
|
-
"RETURNS: Boolean indicating if revisions are allowed and remaining count.",
|
|
91
|
-
inputSchema: {
|
|
92
|
-
taskId: taskIdSchema,
|
|
93
|
-
},
|
|
94
|
-
}, async (params) => {
|
|
95
|
-
try {
|
|
96
|
-
const { taskId } = params;
|
|
97
|
-
const addr = getRevisionManagerAddress();
|
|
98
|
-
const canRevise = await readContract(addr, REVISION_ABI, "canRevise", [taskId]);
|
|
99
|
-
const count = await readContract(addr, REVISION_ABI, "getRevisionCount", [taskId]);
|
|
100
|
-
return formatReadResult({ taskId, canRevise, revisionCount: Number(count) }, `Revision Status for Task #${taskId}`);
|
|
101
|
-
}
|
|
102
|
-
catch (e) {
|
|
103
|
-
const parsed = parseContractError(e);
|
|
104
|
-
return formatStructuredError(parsed.error, parsed.cause, parsed.fix, parsed.retryable);
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
//# sourceMappingURL=revisions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"revisions.js","sourceRoot":"","sources":["../../src/tools/revisions.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAc,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACrF,OAAO,EAAc,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGtF,MAAM,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEhD,SAAS,yBAAyB;IAChC,MAAM,IAAI,GAAG,SAAS,CAAC,eAAe,CAAC;IACvC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,4CAA4C,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,YAAY,CACjB,yBAAyB,EACzB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACT,mFAAmF;YACnF,0FAA0F;YAC1F,wEAAwE;YACxE,8DAA8D;YAC9D,2DAA2D;YAC3D,mEAAmE;YACnE,oEAAoE;QACtE,WAAW,EAAE;YACX,MAAM,EAAE,YAAY;YACpB,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,gCAAgC,CAAC;SACjE;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;YAExC,MAAM,IAAI,GAAG,yBAAyB,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,IAAI,EACJ,YAAY,EACZ,iBAAiB,EACjB,CAAC,MAAM,EAAE,YAAY,CAAC,CACvB,CAAC;YAEF,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO,qBAAqB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACzF,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,sDAAsD;YACtD,mEAAmE;YACnE,8FAA8F;YAC9F,qEAAqE;YACrE,oEAAoE;YACpE,0FAA0F;QAC5F,WAAW,EAAE;YACX,MAAM,EAAE,YAAY;YACpB,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,kCAAkC,CAAC;SAC9D;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;YAEnC,MAAM,IAAI,GAAG,yBAAyB,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,IAAI,EACJ,YAAY,EACZ,gBAAgB,EAChB,CAAC,MAAM,EAAE,OAAO,CAAC,CAClB,CAAC;YAEF,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO,qBAAqB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACzF,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACT,iCAAiC;YACjC,kEAAkE;YAClE,sBAAsB;YACtB,6EAA6E;QAC/E,WAAW,EAAE;YACX,MAAM,EAAE,YAAY;SACrB;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;YAC1B,MAAM,IAAI,GAAG,yBAAyB,EAAE,CAAC;YACzC,MAAM,SAAS,GAAG,MAAM,YAAY,CAClC,IAAI,EACJ,YAAY,EACZ,cAAc,EACd,CAAC,MAAM,CAAC,CACT,CAAC;YAEF,OAAO,gBAAgB,CACrB,EAAE,MAAM,EAAE,aAAa,EAAG,SAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,EACjE,uBAAuB,MAAM,EAAE,CAChC,CAAC;QACJ,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO,qBAAqB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACzF,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,4BAA4B;QACnC,WAAW,EACT,gDAAgD;YAChD,sDAAsD;YACtD,sBAAsB;YACtB,2EAA2E;QAC7E,WAAW,EAAE;YACX,MAAM,EAAE,YAAY;SACrB;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;YAC1B,MAAM,IAAI,GAAG,yBAAyB,EAAE,CAAC;YACzC,MAAM,SAAS,GAAG,MAAM,YAAY,CAClC,IAAI,EACJ,YAAY,EACZ,WAAW,EACX,CAAC,MAAM,CAAC,CACT,CAAC;YACF,MAAM,KAAK,GAAG,MAAM,YAAY,CAC9B,IAAI,EACJ,YAAY,EACZ,kBAAkB,EAClB,CAAC,MAAM,CAAC,CACT,CAAC;YAEF,OAAO,gBAAgB,CACrB,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EACnD,6BAA6B,MAAM,EAAE,CACtC,CAAC;QACJ,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO,qBAAqB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACzF,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/tools/router.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiBzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuG3D"}
|