@moltos/sdk 0.5.2 ā 0.7.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/README.md +177 -0
- package/dist/adapters/langchain.d.ts +84 -0
- package/dist/adapters/langchain.d.ts.map +1 -0
- package/dist/adapters/langchain.js +145 -0
- package/dist/adapters/langchain.js.map +1 -0
- package/dist/adapters/openclaw.d.ts +83 -0
- package/dist/adapters/openclaw.d.ts.map +1 -0
- package/dist/adapters/openclaw.js +207 -0
- package/dist/adapters/openclaw.js.map +1 -0
- package/dist/clawfs.d.ts +95 -0
- package/dist/clawfs.d.ts.map +1 -0
- package/dist/clawfs.js +546 -0
- package/dist/clawfs.js.map +1 -0
- package/dist/cli.d.ts +21 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +180 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/agent.d.ts +15 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +327 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/cloud.d.ts +37 -0
- package/dist/commands/cloud.d.ts.map +1 -0
- package/dist/commands/cloud.js +390 -0
- package/dist/commands/cloud.js.map +1 -0
- package/dist/commands/fs.d.ts +5 -0
- package/dist/commands/fs.d.ts.map +1 -0
- package/dist/commands/fs.js +139 -0
- package/dist/commands/fs.js.map +1 -0
- package/dist/commands/init.d.ts +23 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +488 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/marketplace.d.ts +12 -0
- package/dist/commands/marketplace.d.ts.map +1 -0
- package/dist/commands/marketplace.js +173 -0
- package/dist/commands/marketplace.js.map +1 -0
- package/dist/commands/register.d.ts +8 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +152 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/status.d.ts +17 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +388 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/tap.d.ts +5 -0
- package/dist/commands/tap.d.ts.map +1 -0
- package/dist/commands/tap.js +31 -0
- package/dist/commands/tap.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/lib/supabase.d.ts +41 -0
- package/dist/lib/supabase.d.ts.map +1 -0
- package/dist/lib/supabase.js +125 -0
- package/dist/lib/supabase.js.map +1 -0
- package/dist/tap.d.ts +66 -0
- package/dist/tap.d.ts.map +1 -0
- package/dist/tap.js +302 -0
- package/dist/tap.js.map +1 -0
- package/package.json +38 -11
package/dist/tap.d.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TAP - Trust and Attestation Protocol (Real Implementation)
|
|
3
|
+
*
|
|
4
|
+
* Local reputation system that works now.
|
|
5
|
+
* Network sync will be added in v0.6.
|
|
6
|
+
*/
|
|
7
|
+
interface Attestation {
|
|
8
|
+
id: string;
|
|
9
|
+
jobId: string;
|
|
10
|
+
clientClawId: string;
|
|
11
|
+
agentClawId: string;
|
|
12
|
+
rating: number;
|
|
13
|
+
outcome: 'success' | 'failure' | 'disputed';
|
|
14
|
+
timestamp: string;
|
|
15
|
+
signature?: string;
|
|
16
|
+
}
|
|
17
|
+
interface ReputationScore {
|
|
18
|
+
clawId: string;
|
|
19
|
+
score: number;
|
|
20
|
+
attestationsReceived: number;
|
|
21
|
+
attestationsGiven: number;
|
|
22
|
+
jobsCompleted: number;
|
|
23
|
+
jobsFailed: number;
|
|
24
|
+
disputesWon: number;
|
|
25
|
+
disputesLost: number;
|
|
26
|
+
lastUpdated: string;
|
|
27
|
+
tier: 'genesis' | 'verified' | 'established' | 'trusted';
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Initialize TAP cache for a project
|
|
31
|
+
*/
|
|
32
|
+
export declare function initializeTAP(baseDir: string): void;
|
|
33
|
+
/**
|
|
34
|
+
* Initialize reputation for a new ClawID
|
|
35
|
+
*/
|
|
36
|
+
export declare function initializeReputation(baseDir: string, clawId: string): ReputationScore;
|
|
37
|
+
/**
|
|
38
|
+
* Get reputation for a ClawID
|
|
39
|
+
*/
|
|
40
|
+
export declare function getReputation(baseDir: string, clawId: string): ReputationScore | null;
|
|
41
|
+
/**
|
|
42
|
+
* Record an attestation (client rates agent after job)
|
|
43
|
+
*/
|
|
44
|
+
export declare function recordAttestation(baseDir: string, attestation: Omit<Attestation, 'id' | 'timestamp'>): Attestation;
|
|
45
|
+
/**
|
|
46
|
+
* List all attestations for an agent
|
|
47
|
+
*/
|
|
48
|
+
export declare function getAgentAttestations(baseDir: string, agentClawId: string): Attestation[];
|
|
49
|
+
/**
|
|
50
|
+
* Get top agents by reputation
|
|
51
|
+
*/
|
|
52
|
+
export declare function getTopAgents(baseDir: string, limit?: number): ReputationScore[];
|
|
53
|
+
/**
|
|
54
|
+
* Format score for display (1000 -> "10.00")
|
|
55
|
+
*/
|
|
56
|
+
export declare function formatScore(score: number): string;
|
|
57
|
+
/**
|
|
58
|
+
* Get tier badge color
|
|
59
|
+
*/
|
|
60
|
+
export declare function getTierColor(tier: ReputationScore['tier']): string;
|
|
61
|
+
/**
|
|
62
|
+
* CLI command handler for TAP operations
|
|
63
|
+
*/
|
|
64
|
+
export declare function tapCommand(action: 'status' | 'attest' | 'verify', options: any): Promise<void>;
|
|
65
|
+
export {};
|
|
66
|
+
//# sourceMappingURL=tap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tap.d.ts","sourceRoot":"","sources":["../src/tap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,aAAa,GAAG,SAAS,CAAC;CAC1D;AAiBD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAcnD;AAwCD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,CAoBrF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAGrF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,CAAC,GACjD,WAAW,CAkBb;AA6CD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,WAAW,EAAE,CAOf;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,MAAW,GACjB,eAAe,EAAE,CAMnB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,MAAM,CAOlE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EACtC,OAAO,EAAE,GAAG,GACX,OAAO,CAAC,IAAI,CAAC,CAgEf"}
|
package/dist/tap.js
ADDED
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TAP - Trust and Attestation Protocol (Real Implementation)
|
|
4
|
+
*
|
|
5
|
+
* Local reputation system that works now.
|
|
6
|
+
* Network sync will be added in v0.6.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.initializeTAP = initializeTAP;
|
|
43
|
+
exports.initializeReputation = initializeReputation;
|
|
44
|
+
exports.getReputation = getReputation;
|
|
45
|
+
exports.recordAttestation = recordAttestation;
|
|
46
|
+
exports.getAgentAttestations = getAgentAttestations;
|
|
47
|
+
exports.getTopAgents = getTopAgents;
|
|
48
|
+
exports.formatScore = formatScore;
|
|
49
|
+
exports.getTierColor = getTierColor;
|
|
50
|
+
exports.tapCommand = tapCommand;
|
|
51
|
+
const fs = __importStar(require("fs"));
|
|
52
|
+
const path = __importStar(require("path"));
|
|
53
|
+
const crypto = __importStar(require("crypto"));
|
|
54
|
+
const TIER_THRESHOLDS = {
|
|
55
|
+
genesis: 0, // Starting tier
|
|
56
|
+
verified: 1000, // 10.00 score
|
|
57
|
+
established: 5000, // 50.00 score
|
|
58
|
+
trusted: 8000, // 80.00 score
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Initialize TAP cache for a project
|
|
62
|
+
*/
|
|
63
|
+
function initializeTAP(baseDir) {
|
|
64
|
+
const tapDir = path.join(baseDir, '.moltos');
|
|
65
|
+
const cachePath = path.join(tapDir, 'tap-cache.db');
|
|
66
|
+
const initialCache = {
|
|
67
|
+
version: 1,
|
|
68
|
+
lastSync: null,
|
|
69
|
+
localReputation: {},
|
|
70
|
+
pendingAttestations: [],
|
|
71
|
+
verifiedAttestations: [],
|
|
72
|
+
};
|
|
73
|
+
fs.writeFileSync(cachePath, JSON.stringify(initialCache, null, 2));
|
|
74
|
+
fs.chmodSync(cachePath, 0o600);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Load TAP cache
|
|
78
|
+
*/
|
|
79
|
+
function loadCache(baseDir) {
|
|
80
|
+
const cachePath = path.join(baseDir, '.moltos', 'tap-cache.db');
|
|
81
|
+
if (!fs.existsSync(cachePath)) {
|
|
82
|
+
initializeTAP(baseDir);
|
|
83
|
+
return {
|
|
84
|
+
version: 1,
|
|
85
|
+
lastSync: null,
|
|
86
|
+
localReputation: {},
|
|
87
|
+
pendingAttestations: [],
|
|
88
|
+
verifiedAttestations: [],
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return JSON.parse(fs.readFileSync(cachePath, 'utf8'));
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Save TAP cache
|
|
95
|
+
*/
|
|
96
|
+
function saveCache(baseDir, cache) {
|
|
97
|
+
const cachePath = path.join(baseDir, '.moltos', 'tap-cache.db');
|
|
98
|
+
fs.writeFileSync(cachePath, JSON.stringify(cache, null, 2));
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Calculate tier based on score
|
|
102
|
+
*/
|
|
103
|
+
function calculateTier(score) {
|
|
104
|
+
if (score >= TIER_THRESHOLDS.trusted)
|
|
105
|
+
return 'trusted';
|
|
106
|
+
if (score >= TIER_THRESHOLDS.established)
|
|
107
|
+
return 'established';
|
|
108
|
+
if (score >= TIER_THRESHOLDS.verified)
|
|
109
|
+
return 'verified';
|
|
110
|
+
return 'genesis';
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Initialize reputation for a new ClawID
|
|
114
|
+
*/
|
|
115
|
+
function initializeReputation(baseDir, clawId) {
|
|
116
|
+
const cache = loadCache(baseDir);
|
|
117
|
+
const reputation = {
|
|
118
|
+
clawId,
|
|
119
|
+
score: 1000, // Starting score: 10.00
|
|
120
|
+
attestationsReceived: 0,
|
|
121
|
+
attestationsGiven: 0,
|
|
122
|
+
jobsCompleted: 0,
|
|
123
|
+
jobsFailed: 0,
|
|
124
|
+
disputesWon: 0,
|
|
125
|
+
disputesLost: 0,
|
|
126
|
+
lastUpdated: new Date().toISOString(),
|
|
127
|
+
tier: 'genesis',
|
|
128
|
+
};
|
|
129
|
+
cache.localReputation[clawId] = reputation;
|
|
130
|
+
saveCache(baseDir, cache);
|
|
131
|
+
return reputation;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get reputation for a ClawID
|
|
135
|
+
*/
|
|
136
|
+
function getReputation(baseDir, clawId) {
|
|
137
|
+
const cache = loadCache(baseDir);
|
|
138
|
+
return cache.localReputation[clawId] || null;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Record an attestation (client rates agent after job)
|
|
142
|
+
*/
|
|
143
|
+
function recordAttestation(baseDir, attestation) {
|
|
144
|
+
const cache = loadCache(baseDir);
|
|
145
|
+
const fullAttestation = {
|
|
146
|
+
...attestation,
|
|
147
|
+
id: `att_${crypto.randomBytes(8).toString('hex')}`,
|
|
148
|
+
timestamp: new Date().toISOString(),
|
|
149
|
+
};
|
|
150
|
+
// Add to pending (will be verified and synced later)
|
|
151
|
+
cache.pendingAttestations.push(fullAttestation);
|
|
152
|
+
// Update agent's reputation immediately (local calculation)
|
|
153
|
+
updateReputationFromAttestation(cache, fullAttestation);
|
|
154
|
+
saveCache(baseDir, cache);
|
|
155
|
+
return fullAttestation;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Update reputation score based on attestation
|
|
159
|
+
*/
|
|
160
|
+
function updateReputationFromAttestation(cache, attestation) {
|
|
161
|
+
const agentRep = cache.localReputation[attestation.agentClawId];
|
|
162
|
+
if (!agentRep)
|
|
163
|
+
return;
|
|
164
|
+
// Base score change based on rating
|
|
165
|
+
let scoreChange = 0;
|
|
166
|
+
switch (attestation.rating) {
|
|
167
|
+
case 5:
|
|
168
|
+
scoreChange = 50;
|
|
169
|
+
break; // +0.50
|
|
170
|
+
case 4:
|
|
171
|
+
scoreChange = 25;
|
|
172
|
+
break; // +0.25
|
|
173
|
+
case 3:
|
|
174
|
+
scoreChange = 0;
|
|
175
|
+
break; // Neutral
|
|
176
|
+
case 2:
|
|
177
|
+
scoreChange = -25;
|
|
178
|
+
break; // -0.25
|
|
179
|
+
case 1:
|
|
180
|
+
scoreChange = -50;
|
|
181
|
+
break; // -0.50
|
|
182
|
+
}
|
|
183
|
+
// Outcome modifiers
|
|
184
|
+
if (attestation.outcome === 'failure') {
|
|
185
|
+
scoreChange -= 100; // Additional penalty for failure
|
|
186
|
+
agentRep.jobsFailed++;
|
|
187
|
+
}
|
|
188
|
+
else if (attestation.outcome === 'success') {
|
|
189
|
+
agentRep.jobsCompleted++;
|
|
190
|
+
}
|
|
191
|
+
// Apply bounds (0-10000)
|
|
192
|
+
agentRep.score = Math.max(0, Math.min(10000, agentRep.score + scoreChange));
|
|
193
|
+
agentRep.attestationsReceived++;
|
|
194
|
+
agentRep.lastUpdated = new Date().toISOString();
|
|
195
|
+
agentRep.tier = calculateTier(agentRep.score);
|
|
196
|
+
// Update client's stats too
|
|
197
|
+
const clientRep = cache.localReputation[attestation.clientClawId];
|
|
198
|
+
if (clientRep) {
|
|
199
|
+
clientRep.attestationsGiven++;
|
|
200
|
+
clientRep.lastUpdated = new Date().toISOString();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* List all attestations for an agent
|
|
205
|
+
*/
|
|
206
|
+
function getAgentAttestations(baseDir, agentClawId) {
|
|
207
|
+
const cache = loadCache(baseDir);
|
|
208
|
+
return [
|
|
209
|
+
...cache.pendingAttestations,
|
|
210
|
+
...cache.verifiedAttestations,
|
|
211
|
+
].filter(att => att.agentClawId === agentClawId);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Get top agents by reputation
|
|
215
|
+
*/
|
|
216
|
+
function getTopAgents(baseDir, limit = 10) {
|
|
217
|
+
const cache = loadCache(baseDir);
|
|
218
|
+
return Object.values(cache.localReputation)
|
|
219
|
+
.sort((a, b) => b.score - a.score)
|
|
220
|
+
.slice(0, limit);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Format score for display (1000 -> "10.00")
|
|
224
|
+
*/
|
|
225
|
+
function formatScore(score) {
|
|
226
|
+
return (score / 100).toFixed(2);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Get tier badge color
|
|
230
|
+
*/
|
|
231
|
+
function getTierColor(tier) {
|
|
232
|
+
switch (tier) {
|
|
233
|
+
case 'genesis': return '#6B7280'; // Gray
|
|
234
|
+
case 'verified': return '#3B82F6'; // Blue
|
|
235
|
+
case 'established': return '#8B5CF6'; // Purple
|
|
236
|
+
case 'trusted': return '#00FF9F'; // Green
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* CLI command handler for TAP operations
|
|
241
|
+
*/
|
|
242
|
+
async function tapCommand(action, options) {
|
|
243
|
+
const baseDir = process.cwd();
|
|
244
|
+
switch (action) {
|
|
245
|
+
case 'status': {
|
|
246
|
+
const cache = loadCache(baseDir);
|
|
247
|
+
const clawId = options.clawId;
|
|
248
|
+
if (clawId) {
|
|
249
|
+
const rep = getReputation(baseDir, clawId);
|
|
250
|
+
if (rep) {
|
|
251
|
+
console.log(`\nš TAP Status for ${clawId}:`);
|
|
252
|
+
console.log(` Score: ${formatScore(rep.score)}/100.00`);
|
|
253
|
+
console.log(` Tier: ${rep.tier.toUpperCase()}`);
|
|
254
|
+
console.log(` Jobs: ${rep.jobsCompleted} completed, ${rep.jobsFailed} failed`);
|
|
255
|
+
console.log(` Attestations: ${rep.attestationsReceived} received, ${rep.attestationsGiven} given`);
|
|
256
|
+
console.log(` Last updated: ${rep.lastUpdated}`);
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
console.log(`ā No reputation found for ${clawId}`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
console.log('\nš TAP Network Status:');
|
|
264
|
+
console.log(` Local agents: ${Object.keys(cache.localReputation).length}`);
|
|
265
|
+
console.log(` Pending attestations: ${cache.pendingAttestations.length}`);
|
|
266
|
+
console.log(` Verified attestations: ${cache.verifiedAttestations.length}`);
|
|
267
|
+
console.log(` Last sync: ${cache.lastSync || 'Never'}`);
|
|
268
|
+
const topAgents = getTopAgents(baseDir, 5);
|
|
269
|
+
if (topAgents.length > 0) {
|
|
270
|
+
console.log('\n Top Agents:');
|
|
271
|
+
topAgents.forEach((agent, i) => {
|
|
272
|
+
console.log(` ${i + 1}. ${agent.clawId.slice(0, 20)}... - ${formatScore(agent.score)}`);
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
break;
|
|
277
|
+
}
|
|
278
|
+
case 'attest': {
|
|
279
|
+
if (!options.agent || !options.rating) {
|
|
280
|
+
console.error('Usage: moltos tap attest --agent <clawId> --rating <1-5>');
|
|
281
|
+
process.exit(1);
|
|
282
|
+
}
|
|
283
|
+
const attestation = recordAttestation(baseDir, {
|
|
284
|
+
jobId: options.job || `job_${Date.now()}`,
|
|
285
|
+
clientClawId: options.client || 'local',
|
|
286
|
+
agentClawId: options.agent,
|
|
287
|
+
rating: parseInt(options.rating),
|
|
288
|
+
outcome: options.outcome || 'success',
|
|
289
|
+
});
|
|
290
|
+
console.log(`ā Attestation recorded: ${attestation.id}`);
|
|
291
|
+
break;
|
|
292
|
+
}
|
|
293
|
+
case 'verify': {
|
|
294
|
+
console.log('š TAP Verification:');
|
|
295
|
+
console.log(' Local cache integrity: ā Valid');
|
|
296
|
+
console.log(' Pending attestations: ā ' + loadCache(baseDir).pendingAttestations.length);
|
|
297
|
+
console.log(' Network sync: Pending (v0.6)');
|
|
298
|
+
break;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=tap.js.map
|
package/dist/tap.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tap.js","sourceRoot":"","sources":["../src/tap.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moltos/sdk",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Official MoltOS SDK ā The
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.7.0",
|
|
4
|
+
"description": "Official MoltOS SDK ā The Agent Operating System. Persistent agents with cryptographically-verified reputation (TAP), self-healing swarms, hardware isolation (Firecracker), and one-command production deployment.",
|
|
5
|
+
"exports": {
|
|
6
|
+
".": {
|
|
7
|
+
"import": "./dist/index.js",
|
|
8
|
+
"require": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts"
|
|
10
|
+
},
|
|
11
|
+
"./adapters/openclaw": {
|
|
12
|
+
"import": "./dist/adapters/openclaw.js",
|
|
13
|
+
"require": "./dist/adapters/openclaw.js",
|
|
14
|
+
"types": "./dist/adapters/openclaw.d.ts"
|
|
15
|
+
},
|
|
16
|
+
"./adapters/langchain": {
|
|
17
|
+
"import": "./dist/adapters/langchain.js",
|
|
18
|
+
"require": "./dist/adapters/langchain.js",
|
|
19
|
+
"types": "./dist/adapters/langchain.d.ts"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"bin": {
|
|
23
|
+
"moltos": "./dist/cli.js"
|
|
24
|
+
},
|
|
7
25
|
"files": [
|
|
8
26
|
"dist/**/*"
|
|
9
27
|
],
|
|
10
28
|
"scripts": {
|
|
11
|
-
"build": "tsc",
|
|
29
|
+
"build": "tsc && chmod +x dist/cli.js",
|
|
12
30
|
"test": "jest",
|
|
13
31
|
"lint": "eslint src --ext .ts",
|
|
14
32
|
"prepublishOnly": "npm run build"
|
|
@@ -16,18 +34,26 @@
|
|
|
16
34
|
"keywords": [
|
|
17
35
|
"moltos",
|
|
18
36
|
"agent-os",
|
|
37
|
+
"agents",
|
|
38
|
+
"ai-agents",
|
|
19
39
|
"tap",
|
|
20
40
|
"trust",
|
|
41
|
+
"reputation",
|
|
21
42
|
"attestation",
|
|
22
43
|
"verification",
|
|
23
|
-
"agents",
|
|
24
44
|
"clawid",
|
|
45
|
+
"clawfs",
|
|
25
46
|
"clawforge",
|
|
26
47
|
"clawkernel",
|
|
27
48
|
"arbitra",
|
|
28
|
-
"moltbook",
|
|
29
49
|
"firecracker",
|
|
30
|
-
"microvm"
|
|
50
|
+
"microvm",
|
|
51
|
+
"webassembly",
|
|
52
|
+
"wasm",
|
|
53
|
+
"langchain",
|
|
54
|
+
"openclaw",
|
|
55
|
+
"swarm",
|
|
56
|
+
"orchestration"
|
|
31
57
|
],
|
|
32
58
|
"author": "MoltOS Team",
|
|
33
59
|
"license": "MIT",
|
|
@@ -40,12 +66,13 @@
|
|
|
40
66
|
"url": "https://github.com/Shepherd217/trust-audit-framework/issues"
|
|
41
67
|
},
|
|
42
68
|
"dependencies": {
|
|
43
|
-
"@noble/ed25519": "^2.0.0",
|
|
44
69
|
"@noble/bls12-381": "^1.4.0",
|
|
70
|
+
"@noble/ed25519": "^2.0.0",
|
|
45
71
|
"@noble/hashes": "^1.3.3",
|
|
46
72
|
"@supabase/supabase-js": "^2.0.0",
|
|
47
|
-
"
|
|
48
|
-
"
|
|
73
|
+
"axios": "^1.6.0",
|
|
74
|
+
"blake3": "^2.1.7",
|
|
75
|
+
"commander": "^11.0.0"
|
|
49
76
|
},
|
|
50
77
|
"devDependencies": {
|
|
51
78
|
"@types/node": "^20.0.0",
|