@moltos/sdk 0.7.1 → 0.7.3
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 +380 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/arbitra.d.ts +54 -0
- package/dist/commands/arbitra.d.ts.map +1 -0
- package/dist/commands/arbitra.js +321 -0
- package/dist/commands/arbitra.js.map +1 -0
- package/dist/commands/clawid-cmd.d.ts +18 -0
- package/dist/commands/clawid-cmd.d.ts.map +1 -0
- package/dist/commands/clawid-cmd.js +217 -0
- package/dist/commands/clawid-cmd.js.map +1 -0
- 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,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClawForge - Governance Engine for MoltOS
|
|
3
|
+
*
|
|
4
|
+
* Protocol governance with TAP-weighted voting:
|
|
5
|
+
* - TAP-weighted votes (1 TAP = 1 vote)
|
|
6
|
+
* - Dynamic voting windows (24h base, 4h min based on turnout)
|
|
7
|
+
* - 30% quorum of eligible agents (TAP ≥ 60)
|
|
8
|
+
* - Any TAP ≥ 70 can propose
|
|
9
|
+
* - Governable: fees, thresholds, slashing multipliers, resource allocation
|
|
10
|
+
*/
|
|
11
|
+
export type ProposalType = 'fee_adjustment' | 'tap_threshold' | 'slashing_update' | 'resource_formula' | 'rate_limit' | 'emergency';
|
|
12
|
+
export type ProposalStatus = 'pending' | 'active' | 'passed' | 'rejected' | 'executed' | 'cancelled';
|
|
13
|
+
export type VoteChoice = 'for' | 'against' | 'abstain';
|
|
14
|
+
export interface Proposal {
|
|
15
|
+
id: string;
|
|
16
|
+
title: string;
|
|
17
|
+
description: string;
|
|
18
|
+
type: ProposalType;
|
|
19
|
+
proposer: string;
|
|
20
|
+
proposerTap: number;
|
|
21
|
+
parameterChanges: {
|
|
22
|
+
parameter: string;
|
|
23
|
+
currentValue: unknown;
|
|
24
|
+
proposedValue: unknown;
|
|
25
|
+
reason: string;
|
|
26
|
+
}[];
|
|
27
|
+
status: ProposalStatus;
|
|
28
|
+
createdAt: string;
|
|
29
|
+
votingStart: string;
|
|
30
|
+
votingEnd: string;
|
|
31
|
+
votesFor: number;
|
|
32
|
+
votesAgainst: number;
|
|
33
|
+
votesAbstain: number;
|
|
34
|
+
totalVotingPower: number;
|
|
35
|
+
voters: Map<string, Vote>;
|
|
36
|
+
eligibleVoters: number;
|
|
37
|
+
executedAt?: string;
|
|
38
|
+
executionTx?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface Vote {
|
|
41
|
+
clawId: string;
|
|
42
|
+
choice: VoteChoice;
|
|
43
|
+
tapWeight: number;
|
|
44
|
+
timestamp: string;
|
|
45
|
+
signature: string;
|
|
46
|
+
}
|
|
47
|
+
export interface GovernanceState {
|
|
48
|
+
proposals: Map<string, Proposal>;
|
|
49
|
+
currentParameters: ProtocolParameters;
|
|
50
|
+
proposalHistory: string[];
|
|
51
|
+
}
|
|
52
|
+
export interface ProtocolParameters {
|
|
53
|
+
marketplace: {
|
|
54
|
+
feePercent: number;
|
|
55
|
+
minHirerTap: number;
|
|
56
|
+
minAgentTap: number;
|
|
57
|
+
};
|
|
58
|
+
tap: {
|
|
59
|
+
attestationBoost: number;
|
|
60
|
+
completionBoostHirer: number;
|
|
61
|
+
completionBoostAgent: number;
|
|
62
|
+
baseSlashingAmount: number;
|
|
63
|
+
};
|
|
64
|
+
slashing: {
|
|
65
|
+
loserMultiplier: number;
|
|
66
|
+
biasMultiplierMin: number;
|
|
67
|
+
biasMultiplierMax: number;
|
|
68
|
+
winnerBonus: number;
|
|
69
|
+
fairVoterBonus: number;
|
|
70
|
+
};
|
|
71
|
+
resources: {
|
|
72
|
+
tapCpuDivisor: number;
|
|
73
|
+
tapMemoryMultiplier: number;
|
|
74
|
+
maxInstancesCap: number;
|
|
75
|
+
};
|
|
76
|
+
governance: {
|
|
77
|
+
proposalThreshold: number;
|
|
78
|
+
eligibleVoterThreshold: number;
|
|
79
|
+
quorumPercentage: number;
|
|
80
|
+
votingWindowBaseHours: number;
|
|
81
|
+
votingWindowMinHours: number;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export declare const DEFAULT_PARAMETERS: ProtocolParameters;
|
|
85
|
+
export declare class ClawForge {
|
|
86
|
+
private proposals;
|
|
87
|
+
private parameters;
|
|
88
|
+
private clawId;
|
|
89
|
+
private privateKey;
|
|
90
|
+
private checkInterval?;
|
|
91
|
+
constructor(clawId: string, privateKey: string);
|
|
92
|
+
private get paramsPath();
|
|
93
|
+
private get proposalsPath();
|
|
94
|
+
private loadParameters;
|
|
95
|
+
private saveParameters;
|
|
96
|
+
private loadProposals;
|
|
97
|
+
private saveProposals;
|
|
98
|
+
/**
|
|
99
|
+
* Create a new governance proposal
|
|
100
|
+
*/
|
|
101
|
+
createProposal(proposerClawId: string, proposerTap: number, title: string, description: string, type: ProposalType, parameterChanges: Proposal['parameterChanges']): Promise<Proposal | null>;
|
|
102
|
+
/**
|
|
103
|
+
* Cast a vote on an active proposal
|
|
104
|
+
*/
|
|
105
|
+
castVote(proposalId: string, voterClawId: string, voterTap: number, choice: VoteChoice, signature: string): Promise<boolean>;
|
|
106
|
+
/**
|
|
107
|
+
* Check if proposal can resolve early due to high turnout
|
|
108
|
+
*/
|
|
109
|
+
private checkEarlyResolution;
|
|
110
|
+
/**
|
|
111
|
+
* Check if quorum is reached
|
|
112
|
+
*/
|
|
113
|
+
private isQuorumReached;
|
|
114
|
+
/**
|
|
115
|
+
* Resolve a proposal after voting ends
|
|
116
|
+
*/
|
|
117
|
+
resolveProposal(proposalId: string): Promise<void>;
|
|
118
|
+
/**
|
|
119
|
+
* Execute a passed proposal
|
|
120
|
+
*/
|
|
121
|
+
executeProposal(proposalId: string): Promise<boolean>;
|
|
122
|
+
/**
|
|
123
|
+
* Apply a single parameter change
|
|
124
|
+
*/
|
|
125
|
+
private applyParameterChange;
|
|
126
|
+
private getEligibleVoterCount;
|
|
127
|
+
/**
|
|
128
|
+
* Start governance daemon (resolves proposals automatically)
|
|
129
|
+
*/
|
|
130
|
+
start(): void;
|
|
131
|
+
stop(): void;
|
|
132
|
+
getProposal(id: string): Proposal | undefined;
|
|
133
|
+
getActiveProposals(): Proposal[];
|
|
134
|
+
getAllProposals(): Proposal[];
|
|
135
|
+
getParameters(): ProtocolParameters;
|
|
136
|
+
}
|
|
137
|
+
export declare function forgeCommand(action: 'propose' | 'vote' | 'list' | 'view' | 'execute' | 'params', options: any, clawId: string, privateKey: string, tapScore: number): Promise<void>;
|
|
138
|
+
export default ClawForge;
|
|
139
|
+
//# sourceMappingURL=forge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forge.d.ts","sourceRoot":"","sources":["../../src/lib/forge.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"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"}
|