@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.
@@ -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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"}