@moltos/sdk 0.7.0 → 0.7.2
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/cli.js +341 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/complete.d.ts +11 -0
- package/dist/commands/complete.d.ts.map +1 -0
- package/dist/commands/complete.js +154 -0
- package/dist/commands/complete.js.map +1 -0
- package/dist/commands/hire.d.ts +29 -0
- package/dist/commands/hire.d.ts.map +1 -0
- package/dist/commands/hire.js +411 -0
- package/dist/commands/hire.js.map +1 -0
- package/dist/commands/marketplace.d.ts +3 -1
- package/dist/commands/marketplace.d.ts.map +1 -1
- package/dist/commands/marketplace.js +10 -0
- package/dist/commands/marketplace.js.map +1 -1
- package/dist/lib/forge.d.ts +139 -0
- package/dist/lib/forge.d.ts.map +1 -0
- package/dist/lib/forge.js +461 -0
- package/dist/lib/forge.js.map +1 -0
- package/dist/lib/scheduler.d.ts +138 -0
- package/dist/lib/scheduler.d.ts.map +1 -0
- package/dist/lib/scheduler.js +597 -0
- package/dist/lib/scheduler.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ClawForge - Governance Engine for MoltOS
|
|
4
|
+
*
|
|
5
|
+
* Protocol governance with TAP-weighted voting:
|
|
6
|
+
* - TAP-weighted votes (1 TAP = 1 vote)
|
|
7
|
+
* - Dynamic voting windows (24h base, 4h min based on turnout)
|
|
8
|
+
* - 30% quorum of eligible agents (TAP ≥ 60)
|
|
9
|
+
* - Any TAP ≥ 70 can propose
|
|
10
|
+
* - Governable: fees, thresholds, slashing multipliers, resource allocation
|
|
11
|
+
*/
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
+
var ownKeys = function(o) {
|
|
30
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
+
var ar = [];
|
|
32
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
+
return ar;
|
|
34
|
+
};
|
|
35
|
+
return ownKeys(o);
|
|
36
|
+
};
|
|
37
|
+
return function (mod) {
|
|
38
|
+
if (mod && mod.__esModule) return mod;
|
|
39
|
+
var result = {};
|
|
40
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
+
__setModuleDefault(result, mod);
|
|
42
|
+
return result;
|
|
43
|
+
};
|
|
44
|
+
})();
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.ClawForge = exports.DEFAULT_PARAMETERS = void 0;
|
|
47
|
+
exports.forgeCommand = forgeCommand;
|
|
48
|
+
const fs = __importStar(require("fs"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
// ============================================================================
|
|
51
|
+
// GOVERNANCE CONSTANTS
|
|
52
|
+
// ============================================================================
|
|
53
|
+
const VOTING_WINDOW_BASE_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
54
|
+
const VOTING_WINDOW_MIN_MS = 4 * 60 * 60 * 1000; // 4 hours minimum
|
|
55
|
+
const QUORUM_PERCENTAGE = 30; // 30% of eligible agents
|
|
56
|
+
const PROPOSAL_THRESHOLD_TAP = 70; // TAP ≥ 70 to propose
|
|
57
|
+
const ELIGIBLE_VOTER_TAP = 60; // TAP ≥ 60 to vote
|
|
58
|
+
// ============================================================================
|
|
59
|
+
// DEFAULT PARAMETERS
|
|
60
|
+
// ============================================================================
|
|
61
|
+
exports.DEFAULT_PARAMETERS = {
|
|
62
|
+
marketplace: {
|
|
63
|
+
feePercent: 2.5,
|
|
64
|
+
minHirerTap: 50,
|
|
65
|
+
minAgentTap: 0,
|
|
66
|
+
},
|
|
67
|
+
tap: {
|
|
68
|
+
attestationBoost: 25,
|
|
69
|
+
completionBoostHirer: 5,
|
|
70
|
+
completionBoostAgent: 10,
|
|
71
|
+
baseSlashingAmount: 500,
|
|
72
|
+
},
|
|
73
|
+
slashing: {
|
|
74
|
+
loserMultiplier: 2.0,
|
|
75
|
+
biasMultiplierMin: 0.5,
|
|
76
|
+
biasMultiplierMax: 1.0,
|
|
77
|
+
winnerBonus: 100,
|
|
78
|
+
fairVoterBonus: 25,
|
|
79
|
+
},
|
|
80
|
+
resources: {
|
|
81
|
+
tapCpuDivisor: 25,
|
|
82
|
+
tapMemoryMultiplier: 6,
|
|
83
|
+
maxInstancesCap: 10,
|
|
84
|
+
},
|
|
85
|
+
governance: {
|
|
86
|
+
proposalThreshold: 70,
|
|
87
|
+
eligibleVoterThreshold: 60,
|
|
88
|
+
quorumPercentage: 30,
|
|
89
|
+
votingWindowBaseHours: 24,
|
|
90
|
+
votingWindowMinHours: 4,
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
// ============================================================================
|
|
94
|
+
// CLAWFORGE ENGINE
|
|
95
|
+
// ============================================================================
|
|
96
|
+
class ClawForge {
|
|
97
|
+
proposals = new Map();
|
|
98
|
+
parameters;
|
|
99
|
+
clawId;
|
|
100
|
+
privateKey;
|
|
101
|
+
checkInterval;
|
|
102
|
+
constructor(clawId, privateKey) {
|
|
103
|
+
this.clawId = clawId;
|
|
104
|
+
this.privateKey = privateKey;
|
|
105
|
+
this.parameters = this.loadParameters();
|
|
106
|
+
this.loadProposals();
|
|
107
|
+
}
|
|
108
|
+
// ========================================================================
|
|
109
|
+
// PERSISTENCE
|
|
110
|
+
// ========================================================================
|
|
111
|
+
get paramsPath() {
|
|
112
|
+
return path.join(process.cwd(), '.moltos', 'clawforge-params.json');
|
|
113
|
+
}
|
|
114
|
+
get proposalsPath() {
|
|
115
|
+
return path.join(process.cwd(), '.moltos', 'clawforge-proposals.json');
|
|
116
|
+
}
|
|
117
|
+
loadParameters() {
|
|
118
|
+
if (fs.existsSync(this.paramsPath)) {
|
|
119
|
+
return JSON.parse(fs.readFileSync(this.paramsPath, 'utf8'));
|
|
120
|
+
}
|
|
121
|
+
return { ...exports.DEFAULT_PARAMETERS };
|
|
122
|
+
}
|
|
123
|
+
saveParameters() {
|
|
124
|
+
fs.writeFileSync(this.paramsPath, JSON.stringify(this.parameters, null, 2));
|
|
125
|
+
}
|
|
126
|
+
loadProposals() {
|
|
127
|
+
if (fs.existsSync(this.proposalsPath)) {
|
|
128
|
+
const data = JSON.parse(fs.readFileSync(this.proposalsPath, 'utf8'));
|
|
129
|
+
for (const [id, prop] of Object.entries(data)) {
|
|
130
|
+
this.proposals.set(id, prop);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
saveProposals() {
|
|
135
|
+
const obj = Object.fromEntries(this.proposals);
|
|
136
|
+
fs.writeFileSync(this.proposalsPath, JSON.stringify(obj, null, 2));
|
|
137
|
+
}
|
|
138
|
+
// ========================================================================
|
|
139
|
+
// PROPOSAL MANAGEMENT
|
|
140
|
+
// ========================================================================
|
|
141
|
+
/**
|
|
142
|
+
* Create a new governance proposal
|
|
143
|
+
*/
|
|
144
|
+
async createProposal(proposerClawId, proposerTap, title, description, type, parameterChanges) {
|
|
145
|
+
// Check proposal threshold
|
|
146
|
+
if (proposerTap < PROPOSAL_THRESHOLD_TAP) {
|
|
147
|
+
console.error(`❌ Insufficient TAP to propose: ${proposerTap} < ${PROPOSAL_THRESHOLD_TAP}`);
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
const id = `prop_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
151
|
+
const now = Date.now();
|
|
152
|
+
const proposal = {
|
|
153
|
+
id,
|
|
154
|
+
title,
|
|
155
|
+
description,
|
|
156
|
+
type,
|
|
157
|
+
proposer: proposerClawId,
|
|
158
|
+
proposerTap,
|
|
159
|
+
parameterChanges,
|
|
160
|
+
status: 'active',
|
|
161
|
+
createdAt: new Date(now).toISOString(),
|
|
162
|
+
votingStart: new Date(now).toISOString(),
|
|
163
|
+
votingEnd: new Date(now + VOTING_WINDOW_BASE_MS).toISOString(),
|
|
164
|
+
votesFor: 0,
|
|
165
|
+
votesAgainst: 0,
|
|
166
|
+
votesAbstain: 0,
|
|
167
|
+
totalVotingPower: 0,
|
|
168
|
+
voters: new Map(),
|
|
169
|
+
eligibleVoters: await this.getEligibleVoterCount(),
|
|
170
|
+
};
|
|
171
|
+
this.proposals.set(id, proposal);
|
|
172
|
+
this.saveProposals();
|
|
173
|
+
console.log(`✅ Proposal created: ${id}`);
|
|
174
|
+
console.log(` Title: ${title}`);
|
|
175
|
+
console.log(` Type: ${type}`);
|
|
176
|
+
console.log(` Voting ends: ${proposal.votingEnd}`);
|
|
177
|
+
return proposal;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Cast a vote on an active proposal
|
|
181
|
+
*/
|
|
182
|
+
async castVote(proposalId, voterClawId, voterTap, choice, signature) {
|
|
183
|
+
const proposal = this.proposals.get(proposalId);
|
|
184
|
+
if (!proposal) {
|
|
185
|
+
console.error(`❌ Proposal not found: ${proposalId}`);
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
// Check voting is active
|
|
189
|
+
if (proposal.status !== 'active') {
|
|
190
|
+
console.error(`❌ Voting is ${proposal.status}`);
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
// Check eligibility
|
|
194
|
+
if (voterTap < ELIGIBLE_VOTER_TAP) {
|
|
195
|
+
console.error(`❌ Insufficient TAP to vote: ${voterTap} < ${ELIGIBLE_VOTER_TAP}`);
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
// Check not already voted
|
|
199
|
+
if (proposal.voters.has(voterClawId)) {
|
|
200
|
+
console.error(`❌ Already voted on this proposal`);
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
// Record vote
|
|
204
|
+
const vote = {
|
|
205
|
+
clawId: voterClawId,
|
|
206
|
+
choice,
|
|
207
|
+
tapWeight: voterTap,
|
|
208
|
+
timestamp: new Date().toISOString(),
|
|
209
|
+
signature,
|
|
210
|
+
};
|
|
211
|
+
proposal.voters.set(voterClawId, vote);
|
|
212
|
+
// Update tallies
|
|
213
|
+
switch (choice) {
|
|
214
|
+
case 'for':
|
|
215
|
+
proposal.votesFor += voterTap;
|
|
216
|
+
break;
|
|
217
|
+
case 'against':
|
|
218
|
+
proposal.votesAgainst += voterTap;
|
|
219
|
+
break;
|
|
220
|
+
case 'abstain':
|
|
221
|
+
proposal.votesAbstain += voterTap;
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
proposal.totalVotingPower += voterTap;
|
|
225
|
+
// Check for early resolution (high turnout)
|
|
226
|
+
this.checkEarlyResolution(proposal);
|
|
227
|
+
this.saveProposals();
|
|
228
|
+
console.log(`✅ Vote recorded: ${choice} (${voterTap} TAP)`);
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
// ========================================================================
|
|
232
|
+
// VOTING MECHANICS
|
|
233
|
+
// ========================================================================
|
|
234
|
+
/**
|
|
235
|
+
* Check if proposal can resolve early due to high turnout
|
|
236
|
+
*/
|
|
237
|
+
checkEarlyResolution(proposal) {
|
|
238
|
+
const participationRate = (proposal.voters.size / proposal.eligibleVoters) * 100;
|
|
239
|
+
// If 60%+ participation, shorten voting window
|
|
240
|
+
if (participationRate >= 60) {
|
|
241
|
+
const now = Date.now();
|
|
242
|
+
const currentEnd = new Date(proposal.votingEnd).getTime();
|
|
243
|
+
const newEnd = now + VOTING_WINDOW_MIN_MS;
|
|
244
|
+
if (newEnd < currentEnd) {
|
|
245
|
+
proposal.votingEnd = new Date(newEnd).toISOString();
|
|
246
|
+
console.log(`📢 High turnout (${participationRate.toFixed(1)}%) — voting window shortened`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Check if quorum is reached
|
|
252
|
+
*/
|
|
253
|
+
isQuorumReached(proposal) {
|
|
254
|
+
const participationRate = (proposal.voters.size / proposal.eligibleVoters) * 100;
|
|
255
|
+
return participationRate >= QUORUM_PERCENTAGE;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Resolve a proposal after voting ends
|
|
259
|
+
*/
|
|
260
|
+
async resolveProposal(proposalId) {
|
|
261
|
+
const proposal = this.proposals.get(proposalId);
|
|
262
|
+
if (!proposal || proposal.status !== 'active')
|
|
263
|
+
return;
|
|
264
|
+
const now = Date.now();
|
|
265
|
+
const votingEnd = new Date(proposal.votingEnd).getTime();
|
|
266
|
+
// Check if voting period ended
|
|
267
|
+
if (now < votingEnd) {
|
|
268
|
+
console.log(`⏳ Voting still active until ${proposal.votingEnd}`);
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
// Check quorum
|
|
272
|
+
if (!this.isQuorumReached(proposal)) {
|
|
273
|
+
proposal.status = 'rejected';
|
|
274
|
+
console.log(`❌ Proposal ${proposalId} rejected: quorum not reached`);
|
|
275
|
+
this.saveProposals();
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
// Determine outcome (simple majority)
|
|
279
|
+
if (proposal.votesFor > proposal.votesAgainst) {
|
|
280
|
+
proposal.status = 'passed';
|
|
281
|
+
console.log(`✅ Proposal ${proposalId} PASSED`);
|
|
282
|
+
console.log(` For: ${proposal.votesFor} | Against: ${proposal.votesAgainst}`);
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
proposal.status = 'rejected';
|
|
286
|
+
console.log(`❌ Proposal ${proposalId} REJECTED`);
|
|
287
|
+
console.log(` For: ${proposal.votesFor} | Against: ${proposal.votesAgainst}`);
|
|
288
|
+
}
|
|
289
|
+
this.saveProposals();
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Execute a passed proposal
|
|
293
|
+
*/
|
|
294
|
+
async executeProposal(proposalId) {
|
|
295
|
+
const proposal = this.proposals.get(proposalId);
|
|
296
|
+
if (!proposal || proposal.status !== 'passed') {
|
|
297
|
+
console.error(`❌ Proposal not in passed state`);
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
// Apply parameter changes
|
|
301
|
+
for (const change of proposal.parameterChanges) {
|
|
302
|
+
this.applyParameterChange(change.parameter, change.proposedValue);
|
|
303
|
+
}
|
|
304
|
+
proposal.status = 'executed';
|
|
305
|
+
proposal.executedAt = new Date().toISOString();
|
|
306
|
+
this.saveParameters();
|
|
307
|
+
this.saveProposals();
|
|
308
|
+
console.log(`🚀 Proposal ${proposalId} EXECUTED`);
|
|
309
|
+
console.log(` ${proposal.parameterChanges.length} parameters updated`);
|
|
310
|
+
return true;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Apply a single parameter change
|
|
314
|
+
*/
|
|
315
|
+
applyParameterChange(parameter, value) {
|
|
316
|
+
const parts = parameter.split('.');
|
|
317
|
+
let current = this.parameters;
|
|
318
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
319
|
+
current = current[parts[i]];
|
|
320
|
+
}
|
|
321
|
+
current[parts[parts.length - 1]] = value;
|
|
322
|
+
console.log(` ${parameter}: ${JSON.stringify(value)}`);
|
|
323
|
+
}
|
|
324
|
+
// ========================================================================
|
|
325
|
+
// ELIGIBILITY
|
|
326
|
+
// ========================================================================
|
|
327
|
+
async getEligibleVoterCount() {
|
|
328
|
+
// In production, query Supabase for count of agents with TAP ≥ 60
|
|
329
|
+
// For now, return a reasonable estimate
|
|
330
|
+
return 100;
|
|
331
|
+
}
|
|
332
|
+
// ========================================================================
|
|
333
|
+
// DAEMON
|
|
334
|
+
// ========================================================================
|
|
335
|
+
/**
|
|
336
|
+
* Start governance daemon (resolves proposals automatically)
|
|
337
|
+
*/
|
|
338
|
+
start() {
|
|
339
|
+
this.checkInterval = setInterval(() => {
|
|
340
|
+
for (const [id, proposal] of this.proposals) {
|
|
341
|
+
if (proposal.status === 'active') {
|
|
342
|
+
this.resolveProposal(id);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}, 60000); // Check every minute
|
|
346
|
+
console.log('🏛️ ClawForge governance daemon started');
|
|
347
|
+
}
|
|
348
|
+
stop() {
|
|
349
|
+
if (this.checkInterval) {
|
|
350
|
+
clearInterval(this.checkInterval);
|
|
351
|
+
}
|
|
352
|
+
console.log('🛑 ClawForge governance daemon stopped');
|
|
353
|
+
}
|
|
354
|
+
// ========================================================================
|
|
355
|
+
// QUERIES
|
|
356
|
+
// ========================================================================
|
|
357
|
+
getProposal(id) {
|
|
358
|
+
return this.proposals.get(id);
|
|
359
|
+
}
|
|
360
|
+
getActiveProposals() {
|
|
361
|
+
return Array.from(this.proposals.values())
|
|
362
|
+
.filter(p => p.status === 'active');
|
|
363
|
+
}
|
|
364
|
+
getAllProposals() {
|
|
365
|
+
return Array.from(this.proposals.values())
|
|
366
|
+
.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
367
|
+
}
|
|
368
|
+
getParameters() {
|
|
369
|
+
return { ...this.parameters };
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
exports.ClawForge = ClawForge;
|
|
373
|
+
// ============================================================================
|
|
374
|
+
// CLI INTEGRATION
|
|
375
|
+
// ============================================================================
|
|
376
|
+
async function forgeCommand(action, options, clawId, privateKey, tapScore) {
|
|
377
|
+
const forge = new ClawForge(clawId, privateKey);
|
|
378
|
+
switch (action) {
|
|
379
|
+
case 'propose': {
|
|
380
|
+
if (tapScore < PROPOSAL_THRESHOLD_TAP) {
|
|
381
|
+
console.error(`❌ Insufficient TAP to propose: ${tapScore} < ${PROPOSAL_THRESHOLD_TAP}`);
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
const changes = [{
|
|
385
|
+
parameter: options.parameter,
|
|
386
|
+
currentValue: options.current,
|
|
387
|
+
proposedValue: options.value,
|
|
388
|
+
reason: options.reason || 'No reason provided',
|
|
389
|
+
}];
|
|
390
|
+
await forge.createProposal(clawId, tapScore, options.title, options.description, options.type || 'fee_adjustment', changes);
|
|
391
|
+
break;
|
|
392
|
+
}
|
|
393
|
+
case 'vote': {
|
|
394
|
+
if (!options.proposal || !options.choice) {
|
|
395
|
+
console.error('❌ Required: --proposal <id> --choice <for|against|abstain>');
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
if (tapScore < ELIGIBLE_VOTER_TAP) {
|
|
399
|
+
console.error(`❌ Insufficient TAP to vote: ${tapScore} < ${ELIGIBLE_VOTER_TAP}`);
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
// Mock signature (real would use Ed25519)
|
|
403
|
+
const signature = `sig_${Date.now()}`;
|
|
404
|
+
await forge.castVote(options.proposal, clawId, tapScore, options.choice, signature);
|
|
405
|
+
break;
|
|
406
|
+
}
|
|
407
|
+
case 'list': {
|
|
408
|
+
const proposals = forge.getAllProposals();
|
|
409
|
+
console.log('\n🏛️ ClawForge Proposals\n');
|
|
410
|
+
if (proposals.length === 0) {
|
|
411
|
+
console.log(' No proposals found');
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
for (const p of proposals.slice(0, 10)) {
|
|
415
|
+
const icon = p.status === 'passed' ? '✅' :
|
|
416
|
+
p.status === 'rejected' ? '❌' :
|
|
417
|
+
p.status === 'active' ? '🗳️' :
|
|
418
|
+
p.status === 'executed' ? '🚀' : '⏸️';
|
|
419
|
+
console.log(` ${icon} ${p.title} (${p.type})`);
|
|
420
|
+
console.log(` Status: ${p.status} | For: ${p.votesFor} | Against: ${p.votesAgainst}`);
|
|
421
|
+
}
|
|
422
|
+
break;
|
|
423
|
+
}
|
|
424
|
+
case 'view': {
|
|
425
|
+
if (!options.proposal) {
|
|
426
|
+
console.error('❌ Required: --proposal <id>');
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
const p = forge.getProposal(options.proposal);
|
|
430
|
+
if (!p) {
|
|
431
|
+
console.error('❌ Proposal not found');
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
console.log(`\n📋 ${p.title}`);
|
|
435
|
+
console.log(` ID: ${p.id}`);
|
|
436
|
+
console.log(` Type: ${p.type}`);
|
|
437
|
+
console.log(` Status: ${p.status}`);
|
|
438
|
+
console.log(` Proposer: ${p.proposer}`);
|
|
439
|
+
console.log(` Voting ends: ${p.votingEnd}`);
|
|
440
|
+
console.log(`\n Votes: For ${p.votesFor} | Against ${p.votesAgainst} | Abstain ${p.votesAbstain}`);
|
|
441
|
+
console.log(` Participation: ${p.voters.size}/${p.eligibleVoters} agents`);
|
|
442
|
+
break;
|
|
443
|
+
}
|
|
444
|
+
case 'execute': {
|
|
445
|
+
if (!options.proposal) {
|
|
446
|
+
console.error('❌ Required: --proposal <id>');
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
await forge.executeProposal(options.proposal);
|
|
450
|
+
break;
|
|
451
|
+
}
|
|
452
|
+
case 'params': {
|
|
453
|
+
const params = forge.getParameters();
|
|
454
|
+
console.log('\n⚙️ Current Protocol Parameters\n');
|
|
455
|
+
console.log(JSON.stringify(params, null, 2));
|
|
456
|
+
break;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
exports.default = ClawForge;
|
|
461
|
+
//# sourceMappingURL=forge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forge.js","sourceRoot":"","sources":["../../src/lib/forge.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8fH,oCAqHC;AAjnBD,uCAAyB;AACzB,2CAA6B;AAE7B,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E,MAAM,qBAAqB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAE,WAAW;AAC/D,MAAM,oBAAoB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAI,kBAAkB;AACtE,MAAM,iBAAiB,GAAG,EAAE,CAAC,CAAuB,yBAAyB;AAC7E,MAAM,sBAAsB,GAAG,EAAE,CAAC,CAAkB,sBAAsB;AAC1E,MAAM,kBAAkB,GAAG,EAAE,CAAC,CAAsB,mBAAmB;AA4GvE,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAElE,QAAA,kBAAkB,GAAuB;IACpD,WAAW,EAAE;QACX,UAAU,EAAE,GAAG;QACf,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,CAAC;KACf;IACD,GAAG,EAAE;QACH,gBAAgB,EAAE,EAAE;QACpB,oBAAoB,EAAE,CAAC;QACvB,oBAAoB,EAAE,EAAE;QACxB,kBAAkB,EAAE,GAAG;KACxB;IACD,QAAQ,EAAE;QACR,eAAe,EAAE,GAAG;QACpB,iBAAiB,EAAE,GAAG;QACtB,iBAAiB,EAAE,GAAG;QACtB,WAAW,EAAE,GAAG;QAChB,cAAc,EAAE,EAAE;KACnB;IACD,SAAS,EAAE;QACT,aAAa,EAAE,EAAE;QACjB,mBAAmB,EAAE,CAAC;QACtB,eAAe,EAAE,EAAE;KACpB;IACD,UAAU,EAAE;QACV,iBAAiB,EAAE,EAAE;QACrB,sBAAsB,EAAE,EAAE;QAC1B,gBAAgB,EAAE,EAAE;QACpB,qBAAqB,EAAE,EAAE;QACzB,oBAAoB,EAAE,CAAC;KACxB;CACF,CAAC;AAEF,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,MAAa,SAAS;IACZ,SAAS,GAA0B,IAAI,GAAG,EAAE,CAAC;IAC7C,UAAU,CAAqB;IAC/B,MAAM,CAAS;IACf,UAAU,CAAS;IACnB,aAAa,CAAkB;IAEvC,YAAY,MAAc,EAAE,UAAkB;QAC5C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACxC,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,2EAA2E;IAC3E,cAAc;IACd,2EAA2E;IAE3E,IAAY,UAAU;QACpB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,uBAAuB,CAAC,CAAC;IACtE,CAAC;IAED,IAAY,aAAa;QACvB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,0BAA0B,CAAC,CAAC;IACzE,CAAC;IAEO,cAAc;QACpB,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,EAAE,GAAG,0BAAkB,EAAE,CAAC;IACnC,CAAC;IAEO,cAAc;QACpB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9E,CAAC;IAEO,aAAa;QACnB,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;YACrE,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,IAAgB,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAEO,aAAa;QACnB,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,2EAA2E;IAC3E,sBAAsB;IACtB,2EAA2E;IAE3E;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,cAAsB,EACtB,WAAmB,EACnB,KAAa,EACb,WAAmB,EACnB,IAAkB,EAClB,gBAA8C;QAE9C,2BAA2B;QAC3B,IAAI,WAAW,GAAG,sBAAsB,EAAE,CAAC;YACzC,OAAO,CAAC,KAAK,CAAC,kCAAkC,WAAW,MAAM,sBAAsB,EAAE,CAAC,CAAC;YAC3F,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,EAAE,GAAG,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,MAAM,QAAQ,GAAa;YACzB,EAAE;YACF,KAAK;YACL,WAAW;YACX,IAAI;YACJ,QAAQ,EAAE,cAAc;YACxB,WAAW;YACX,gBAAgB;YAChB,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;YACtC,WAAW,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;YACxC,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,GAAG,qBAAqB,CAAC,CAAC,WAAW,EAAE;YAC9D,QAAQ,EAAE,CAAC;YACX,YAAY,EAAE,CAAC;YACf,YAAY,EAAE,CAAC;YACf,gBAAgB,EAAE,CAAC;YACnB,MAAM,EAAE,IAAI,GAAG,EAAE;YACjB,cAAc,EAAE,MAAM,IAAI,CAAC,qBAAqB,EAAE;SACnD,CAAC;QAEF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,EAAE,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;QAErD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CACZ,UAAkB,EAClB,WAAmB,EACnB,QAAgB,EAChB,MAAkB,EAClB,SAAiB;QAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,yBAAyB,UAAU,EAAE,CAAC,CAAC;YACrD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,yBAAyB;QACzB,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,CAAC,KAAK,CAAC,eAAe,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAChD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,oBAAoB;QACpB,IAAI,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,+BAA+B,QAAQ,MAAM,kBAAkB,EAAE,CAAC,CAAC;YACjF,OAAO,KAAK,CAAC;QACf,CAAC;QAED,0BAA0B;QAC1B,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,cAAc;QACd,MAAM,IAAI,GAAS;YACjB,MAAM,EAAE,WAAW;YACnB,MAAM;YACN,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS;SACV,CAAC;QAEF,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAEvC,iBAAiB;QACjB,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,KAAK;gBACR,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC;gBAC9B,MAAM;YACR,KAAK,SAAS;gBACZ,QAAQ,CAAC,YAAY,IAAI,QAAQ,CAAC;gBAClC,MAAM;YACR,KAAK,SAAS;gBACZ,QAAQ,CAAC,YAAY,IAAI,QAAQ,CAAC;gBAClC,MAAM;QACV,CAAC;QAED,QAAQ,CAAC,gBAAgB,IAAI,QAAQ,CAAC;QAEtC,4CAA4C;QAC5C,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAEpC,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,KAAK,QAAQ,OAAO,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2EAA2E;IAC3E,mBAAmB;IACnB,2EAA2E;IAE3E;;OAEG;IACK,oBAAoB,CAAC,QAAkB;QAC7C,MAAM,iBAAiB,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,GAAG,CAAC;QAEjF,+CAA+C;QAC/C,IAAI,iBAAiB,IAAI,EAAE,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;YAC1D,MAAM,MAAM,GAAG,GAAG,GAAG,oBAAoB,CAAC;YAE1C,IAAI,MAAM,GAAG,UAAU,EAAE,CAAC;gBACxB,QAAQ,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,oBAAoB,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,QAAkB;QACxC,MAAM,iBAAiB,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,GAAG,CAAC;QACjF,OAAO,iBAAiB,IAAI,iBAAiB,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,UAAkB;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO;QAEtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QAEzD,+BAA+B;QAC/B,IAAI,GAAG,GAAG,SAAS,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,+BAA+B,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QAED,eAAe;QACf,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,QAAQ,CAAC,MAAM,GAAG,UAAU,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,+BAA+B,CAAC,CAAC;YACrE,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,sCAAsC;QACtC,IAAI,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC9C,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,SAAS,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,CAAC,QAAQ,eAAe,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;QAClF,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,MAAM,GAAG,UAAU,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,WAAW,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,CAAC,QAAQ,eAAe,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;QAClF,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,UAAkB;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC9C,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAChD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,0BAA0B;QAC1B,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,CAAC;YAC/C,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QACpE,CAAC;QAED,QAAQ,CAAC,MAAM,GAAG,UAAU,CAAC;QAC7B,QAAQ,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC/C,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,WAAW,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,gBAAgB,CAAC,MAAM,qBAAqB,CAAC,CAAC;QAEzE,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,SAAiB,EAAE,KAAc;QAC5D,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,OAAO,GAAQ,IAAI,CAAC,UAAU,CAAC;QAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,MAAM,SAAS,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,2EAA2E;IAC3E,cAAc;IACd,2EAA2E;IAEnE,KAAK,CAAC,qBAAqB;QACjC,kEAAkE;QAClE,wCAAwC;QACxC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,2EAA2E;IAC3E,SAAS;IACT,2EAA2E;IAE3E;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;YACpC,KAAK,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC5C,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACjC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,qBAAqB;QAEhC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACxD,CAAC;IAED,2EAA2E;IAC3E,UAAU;IACV,2EAA2E;IAE3E,WAAW,CAAC,EAAU;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,kBAAkB;QAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;aACvC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,eAAe;QACb,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;aACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,aAAa;QACX,OAAO,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;CACF;AAtVD,8BAsVC;AAED,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAExE,KAAK,UAAU,YAAY,CAChC,MAAmE,EACnE,OAAY,EACZ,MAAc,EACd,UAAkB,EAClB,QAAgB;IAEhB,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAEhD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,IAAI,QAAQ,GAAG,sBAAsB,EAAE,CAAC;gBACtC,OAAO,CAAC,KAAK,CAAC,kCAAkC,QAAQ,MAAM,sBAAsB,EAAE,CAAC,CAAC;gBACxF,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,CAAC;oBACf,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,YAAY,EAAE,OAAO,CAAC,OAAO;oBAC7B,aAAa,EAAE,OAAO,CAAC,KAAK;oBAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,oBAAoB;iBAC/C,CAAC,CAAC;YAEH,MAAM,KAAK,CAAC,cAAc,CACxB,MAAM,EACN,QAAQ,EACR,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,IAAI,IAAI,gBAAgB,EAChC,OAAO,CACR,CAAC;YACF,MAAM;QACR,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACzC,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;gBAC5E,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,GAAG,kBAAkB,EAAE,CAAC;gBAClC,OAAO,CAAC,KAAK,CAAC,+BAA+B,QAAQ,MAAM,kBAAkB,EAAE,CAAC,CAAC;gBACjF,OAAO;YACT,CAAC;YAED,0CAA0C;YAC1C,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAEtC,MAAM,KAAK,CAAC,QAAQ,CAClB,OAAO,CAAC,QAAQ,EAChB,MAAM,EACN,QAAQ,EACR,OAAO,CAAC,MAAoB,EAC5B,SAAS,CACV,CAAC;YACF,MAAM;QACR,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,SAAS,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAE5C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;gBACrC,OAAO;YACT,CAAC;YAED,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBACvC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC7B,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;wBAC/B,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;4BAC/B,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBACnD,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,MAAM,WAAW,CAAC,CAAC,QAAQ,eAAe,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;YAC7F,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBAC7C,OAAO;YACT,CAAC;YAED,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,CAAC,CAAC,EAAE,CAAC;gBACP,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBACtC,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,QAAQ,cAAc,CAAC,CAAC,YAAY,cAAc,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;YACrG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,cAAc,SAAS,CAAC,CAAC;YAC7E,MAAM;QACR,CAAC;QAED,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBAC7C,OAAO;YACT,CAAC;YACD,MAAM,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM;QACR,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM;QACR,CAAC;IACH,CAAC;AACH,CAAC;AAED,kBAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClawScheduler - Persistent Task Scheduler for MoltOS
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Hybrid checkpointing: WASM state serialization (primary) + Firecracker snapshots (fallback)
|
|
6
|
+
* - Dual triggers: Cron-based and event-based (ClawBus webhooks)
|
|
7
|
+
* - ClawFS storage with optional remote replication
|
|
8
|
+
* - Persistent daemon with automatic restart from last checkpoint
|
|
9
|
+
*
|
|
10
|
+
* Architecture:
|
|
11
|
+
* - Scheduler daemon runs as background process
|
|
12
|
+
* - Tasks are defined as WASM modules or shell commands
|
|
13
|
+
* - State serialized to ClawFS on each checkpoint
|
|
14
|
+
* - Failed tasks auto-restart from last known good state
|
|
15
|
+
*/
|
|
16
|
+
export type TaskTrigger = {
|
|
17
|
+
type: 'cron';
|
|
18
|
+
expression: string;
|
|
19
|
+
} | {
|
|
20
|
+
type: 'event';
|
|
21
|
+
topic: string;
|
|
22
|
+
} | {
|
|
23
|
+
type: 'once';
|
|
24
|
+
delayMs?: number;
|
|
25
|
+
};
|
|
26
|
+
export type CheckpointMode = 'wasm' | 'firecracker' | 'auto';
|
|
27
|
+
export interface TaskConfig {
|
|
28
|
+
id: string;
|
|
29
|
+
name: string;
|
|
30
|
+
command: string;
|
|
31
|
+
args?: string[];
|
|
32
|
+
workingDir?: string;
|
|
33
|
+
env?: Record<string, string>;
|
|
34
|
+
trigger: TaskTrigger;
|
|
35
|
+
checkpointMode: CheckpointMode;
|
|
36
|
+
checkpointInterval?: number;
|
|
37
|
+
maxRetries: number;
|
|
38
|
+
timeout?: number;
|
|
39
|
+
replicate?: boolean;
|
|
40
|
+
}
|
|
41
|
+
export interface TaskState {
|
|
42
|
+
id: string;
|
|
43
|
+
status: 'pending' | 'running' | 'paused' | 'failed' | 'completed';
|
|
44
|
+
pid?: number;
|
|
45
|
+
startedAt?: string;
|
|
46
|
+
lastCheckpoint?: string;
|
|
47
|
+
checkpointId?: string;
|
|
48
|
+
runCount: number;
|
|
49
|
+
failCount: number;
|
|
50
|
+
lastError?: string;
|
|
51
|
+
envSnapshot?: Record<string, string>;
|
|
52
|
+
}
|
|
53
|
+
export interface Checkpoint {
|
|
54
|
+
id: string;
|
|
55
|
+
taskId: string;
|
|
56
|
+
timestamp: string;
|
|
57
|
+
type: 'wasm' | 'firecracker';
|
|
58
|
+
statePath: string;
|
|
59
|
+
metadata: {
|
|
60
|
+
pid?: number;
|
|
61
|
+
cwd: string;
|
|
62
|
+
env: Record<string, string>;
|
|
63
|
+
exitCode?: number;
|
|
64
|
+
};
|
|
65
|
+
merkleRoot: string;
|
|
66
|
+
}
|
|
67
|
+
export interface Schedule {
|
|
68
|
+
tasks: TaskConfig[];
|
|
69
|
+
global: {
|
|
70
|
+
defaultCheckpointInterval: number;
|
|
71
|
+
maxConcurrentTasks: number;
|
|
72
|
+
replicateByDefault: boolean;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export declare class ClawScheduler {
|
|
76
|
+
private tasks;
|
|
77
|
+
private states;
|
|
78
|
+
private processes;
|
|
79
|
+
private cronCache;
|
|
80
|
+
private clawfs;
|
|
81
|
+
private privateKey;
|
|
82
|
+
private clawId;
|
|
83
|
+
private isRunning;
|
|
84
|
+
private checkInterval?;
|
|
85
|
+
private checkpointIntervals;
|
|
86
|
+
private eventListeners;
|
|
87
|
+
constructor(baseDir: string, clawId: string, privateKey: string);
|
|
88
|
+
private get schedulePath();
|
|
89
|
+
private get statePath();
|
|
90
|
+
private loadSchedule;
|
|
91
|
+
private saveState;
|
|
92
|
+
/**
|
|
93
|
+
* Add a new scheduled task
|
|
94
|
+
*/
|
|
95
|
+
addTask(config: Omit<TaskConfig, 'id'>): TaskConfig;
|
|
96
|
+
private saveSchedule;
|
|
97
|
+
/**
|
|
98
|
+
* Remove a task
|
|
99
|
+
*/
|
|
100
|
+
removeTask(taskId: string): boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Start a specific task
|
|
103
|
+
*/
|
|
104
|
+
startTask(taskId: string, fromCheckpoint?: string): Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* Stop a running task
|
|
107
|
+
*/
|
|
108
|
+
stopTask(taskId: string): void;
|
|
109
|
+
private createCheckpoint;
|
|
110
|
+
private loadCheckpoint;
|
|
111
|
+
/**
|
|
112
|
+
* Start the scheduler daemon
|
|
113
|
+
*/
|
|
114
|
+
start(): void;
|
|
115
|
+
/**
|
|
116
|
+
* Stop the scheduler daemon
|
|
117
|
+
*/
|
|
118
|
+
stop(): void;
|
|
119
|
+
private checkCronTriggers;
|
|
120
|
+
/**
|
|
121
|
+
* Subscribe to a ClawBus topic for event triggers
|
|
122
|
+
*/
|
|
123
|
+
subscribeEvent(topic: string, handler: (data: unknown) => void): void;
|
|
124
|
+
/**
|
|
125
|
+
* Emit an event to trigger event-based tasks
|
|
126
|
+
*/
|
|
127
|
+
emitEvent(topic: string, data: unknown): void;
|
|
128
|
+
getStatus(): {
|
|
129
|
+
isRunning: boolean;
|
|
130
|
+
taskCount: number;
|
|
131
|
+
runningCount: number;
|
|
132
|
+
tasks: TaskState[];
|
|
133
|
+
};
|
|
134
|
+
getTaskLogs(taskId: string): string;
|
|
135
|
+
}
|
|
136
|
+
export declare function schedulerCommand(action: 'start' | 'stop' | 'status' | 'add' | 'remove' | 'logs', options: any, clawId: string, privateKey: string): Promise<void>;
|
|
137
|
+
export default ClawScheduler;
|
|
138
|
+
//# sourceMappingURL=scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/lib/scheduler.ts"],"names":[],"mappings":"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"}
|