orca-agent 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/challenge.test.d.ts +2 -0
- package/dist/__tests__/challenge.test.d.ts.map +1 -0
- package/dist/__tests__/challenge.test.js +146 -0
- package/dist/__tests__/challenge.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +141 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/keypair.test.d.ts +2 -0
- package/dist/__tests__/keypair.test.d.ts.map +1 -0
- package/dist/__tests__/keypair.test.js +144 -0
- package/dist/__tests__/keypair.test.js.map +1 -0
- package/dist/__tests__/task_handler.test.d.ts +2 -0
- package/dist/__tests__/task_handler.test.d.ts.map +1 -0
- package/dist/__tests__/task_handler.test.js +216 -0
- package/dist/__tests__/task_handler.test.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +87 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/connect.d.ts +2 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +81 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/daemon.d.ts +2 -0
- package/dist/commands/daemon.d.ts.map +1 -0
- package/dist/commands/daemon.js +42 -0
- package/dist/commands/daemon.js.map +1 -0
- package/dist/commands/join.d.ts +8 -0
- package/dist/commands/join.d.ts.map +1 -0
- package/dist/commands/join.js +96 -0
- package/dist/commands/join.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +75 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +2 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +10 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/config.d.ts +26 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +59 -0
- package/dist/config.js.map +1 -0
- package/dist/crypto/keypair.d.ts +14 -0
- package/dist/crypto/keypair.d.ts.map +1 -0
- package/dist/crypto/keypair.js +76 -0
- package/dist/crypto/keypair.js.map +1 -0
- package/dist/daemon/heartbeat.d.ts +5 -0
- package/dist/daemon/heartbeat.d.ts.map +1 -0
- package/dist/daemon/heartbeat.js +49 -0
- package/dist/daemon/heartbeat.js.map +1 -0
- package/dist/daemon/nats.d.ts +22 -0
- package/dist/daemon/nats.d.ts.map +1 -0
- package/dist/daemon/nats.js +73 -0
- package/dist/daemon/nats.js.map +1 -0
- package/dist/daemon/task_handler.d.ts +3 -0
- package/dist/daemon/task_handler.d.ts.map +1 -0
- package/dist/daemon/task_handler.js +161 -0
- package/dist/daemon/task_handler.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/install/daemon.d.ts +4 -0
- package/dist/install/daemon.d.ts.map +1 -0
- package/dist/install/daemon.js +214 -0
- package/dist/install/daemon.js.map +1 -0
- package/dist/install/skills.d.ts +4 -0
- package/dist/install/skills.d.ts.map +1 -0
- package/dist/install/skills.js +83 -0
- package/dist/install/skills.js.map +1 -0
- package/dist/moltbook/challenge.d.ts +35 -0
- package/dist/moltbook/challenge.d.ts.map +1 -0
- package/dist/moltbook/challenge.js +157 -0
- package/dist/moltbook/challenge.js.map +1 -0
- package/dist/moltbook/client.d.ts +35 -0
- package/dist/moltbook/client.d.ts.map +1 -0
- package/dist/moltbook/client.js +73 -0
- package/dist/moltbook/client.js.map +1 -0
- package/dist/moltbook/executor.d.ts +8 -0
- package/dist/moltbook/executor.d.ts.map +1 -0
- package/dist/moltbook/executor.js +74 -0
- package/dist/moltbook/executor.js.map +1 -0
- package/dist/moltbook/register.d.ts +14 -0
- package/dist/moltbook/register.d.ts.map +1 -0
- package/dist/moltbook/register.js +64 -0
- package/dist/moltbook/register.js.map +1 -0
- package/dist/openclaw/poll.d.ts +7 -0
- package/dist/openclaw/poll.d.ts.map +1 -0
- package/dist/openclaw/poll.js +57 -0
- package/dist/openclaw/poll.js.map +1 -0
- package/dist/openclaw/webhook.d.ts +16 -0
- package/dist/openclaw/webhook.d.ts.map +1 -0
- package/dist/openclaw/webhook.js +45 -0
- package/dist/openclaw/webhook.js.map +1 -0
- package/package.json +35 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"challenge.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/challenge.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for moltbook challenge solver.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from '@jest/globals';
|
|
5
|
+
import { solveChallenge, _internals } from '../moltbook/challenge';
|
|
6
|
+
describe('solveChallenge', () => {
|
|
7
|
+
describe('basic operations', () => {
|
|
8
|
+
it('solves "What is two plus three?" to "5"', () => {
|
|
9
|
+
const result = solveChallenge('What is two plus three?');
|
|
10
|
+
expect(result).toBe('5.00');
|
|
11
|
+
});
|
|
12
|
+
it('solves "What is five minus two?" to "3"', () => {
|
|
13
|
+
const result = solveChallenge('What is five minus two?');
|
|
14
|
+
expect(result).toBe('3.00');
|
|
15
|
+
});
|
|
16
|
+
it('solves "What is three times four?" to "12"', () => {
|
|
17
|
+
const result = solveChallenge('What is three times four?');
|
|
18
|
+
expect(result).toBe('12.00');
|
|
19
|
+
});
|
|
20
|
+
it('solves "What is ten divided by two?" to "5"', () => {
|
|
21
|
+
const result = solveChallenge('What is ten divided by two?');
|
|
22
|
+
expect(result).toBe('5.00');
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
describe('compound numbers', () => {
|
|
26
|
+
it('handles "What is twenty-one plus nine?" to "30"', () => {
|
|
27
|
+
const result = solveChallenge('What is twenty-one plus nine?');
|
|
28
|
+
expect(result).toBe('30.00');
|
|
29
|
+
});
|
|
30
|
+
it('handles "What is thirty five minus ten?" to "25"', () => {
|
|
31
|
+
const result = solveChallenge('What is thirty five minus ten?');
|
|
32
|
+
expect(result).toBe('25.00');
|
|
33
|
+
});
|
|
34
|
+
it('handles "What is fifty times two?" to "100"', () => {
|
|
35
|
+
const result = solveChallenge('What is fifty times two?');
|
|
36
|
+
expect(result).toBe('100.00');
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
describe('edge cases', () => {
|
|
40
|
+
it('handles numeric digits in text', () => {
|
|
41
|
+
const result = solveChallenge('What is 10 plus 5?');
|
|
42
|
+
expect(result).toBe('15.00');
|
|
43
|
+
});
|
|
44
|
+
it('handles mixed word and digit numbers', () => {
|
|
45
|
+
const result = solveChallenge('What is ten plus 5?');
|
|
46
|
+
expect(result).toBe('15.00');
|
|
47
|
+
});
|
|
48
|
+
it('handles division with decimal result', () => {
|
|
49
|
+
const result = solveChallenge('What is five divided by two?');
|
|
50
|
+
expect(result).toBe('2.50');
|
|
51
|
+
});
|
|
52
|
+
it('handles subtract operator word', () => {
|
|
53
|
+
// Note: The solver extracts numbers in order, so "eight minus three" is needed
|
|
54
|
+
const result = solveChallenge('eight subtract three');
|
|
55
|
+
expect(result).toBe('5.00');
|
|
56
|
+
});
|
|
57
|
+
it('handles multiply operator word', () => {
|
|
58
|
+
const result = solveChallenge('Multiply six by seven');
|
|
59
|
+
expect(result).toBe('42.00');
|
|
60
|
+
});
|
|
61
|
+
it('handles sum operator word', () => {
|
|
62
|
+
const result = solveChallenge('Find the sum of four and five');
|
|
63
|
+
expect(result).toBe('9.00');
|
|
64
|
+
});
|
|
65
|
+
it('handles obfuscated text with symbols', () => {
|
|
66
|
+
const result = solveChallenge('***What!!! is TWO plus THREE???');
|
|
67
|
+
expect(result).toBe('5.00');
|
|
68
|
+
});
|
|
69
|
+
it('throws error when no numbers found', () => {
|
|
70
|
+
expect(() => solveChallenge('plus')).toThrow('Could not extract two numbers');
|
|
71
|
+
});
|
|
72
|
+
it('throws error when no operator found', () => {
|
|
73
|
+
expect(() => solveChallenge('one two three')).toThrow('Could not find operator');
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe('_internals.parseNumber', () => {
|
|
78
|
+
const { parseNumber } = _internals;
|
|
79
|
+
it('parses digit strings', () => {
|
|
80
|
+
expect(parseNumber('42')).toBe(42);
|
|
81
|
+
expect(parseNumber('3.14')).toBeCloseTo(3.14);
|
|
82
|
+
});
|
|
83
|
+
it('parses single word numbers', () => {
|
|
84
|
+
expect(parseNumber('zero')).toBe(0);
|
|
85
|
+
expect(parseNumber('fifteen')).toBe(15);
|
|
86
|
+
expect(parseNumber('ninety')).toBe(90);
|
|
87
|
+
});
|
|
88
|
+
it('parses compound numbers with hyphen', () => {
|
|
89
|
+
expect(parseNumber('twenty-one')).toBe(21);
|
|
90
|
+
expect(parseNumber('fifty-five')).toBe(55);
|
|
91
|
+
});
|
|
92
|
+
it('parses compound numbers with space', () => {
|
|
93
|
+
expect(parseNumber('twenty one')).toBe(21);
|
|
94
|
+
expect(parseNumber('ninety nine')).toBe(99);
|
|
95
|
+
});
|
|
96
|
+
it('returns null for invalid input', () => {
|
|
97
|
+
expect(parseNumber('invalid')).toBeNull();
|
|
98
|
+
expect(parseNumber('abc')).toBeNull();
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
describe('_internals.findOperator', () => {
|
|
102
|
+
const { findOperator } = _internals;
|
|
103
|
+
it('finds plus operator', () => {
|
|
104
|
+
const op = findOperator('two plus three');
|
|
105
|
+
expect(op).not.toBeNull();
|
|
106
|
+
expect(op(2, 3)).toBe(5);
|
|
107
|
+
});
|
|
108
|
+
it('finds minus operator', () => {
|
|
109
|
+
const op = findOperator('five minus two');
|
|
110
|
+
expect(op).not.toBeNull();
|
|
111
|
+
expect(op(5, 2)).toBe(3);
|
|
112
|
+
});
|
|
113
|
+
it('finds times operator', () => {
|
|
114
|
+
const op = findOperator('three times four');
|
|
115
|
+
expect(op).not.toBeNull();
|
|
116
|
+
expect(op(3, 4)).toBe(12);
|
|
117
|
+
});
|
|
118
|
+
it('finds divided operator', () => {
|
|
119
|
+
const op = findOperator('ten divided by two');
|
|
120
|
+
expect(op).not.toBeNull();
|
|
121
|
+
expect(op(10, 2)).toBe(5);
|
|
122
|
+
});
|
|
123
|
+
it('returns null when no operator found', () => {
|
|
124
|
+
expect(findOperator('no operator here')).toBeNull();
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
describe('_internals.extractNumbers', () => {
|
|
128
|
+
const { extractNumbers } = _internals;
|
|
129
|
+
it('extracts multiple numbers from text', () => {
|
|
130
|
+
const numbers = extractNumbers('What is two plus three?');
|
|
131
|
+
expect(numbers).toEqual([2, 3]);
|
|
132
|
+
});
|
|
133
|
+
it('extracts compound numbers', () => {
|
|
134
|
+
const numbers = extractNumbers('twenty-one plus nine');
|
|
135
|
+
expect(numbers).toEqual([21, 9]);
|
|
136
|
+
});
|
|
137
|
+
it('extracts digit numbers', () => {
|
|
138
|
+
const numbers = extractNumbers('10 plus 20');
|
|
139
|
+
expect(numbers).toEqual([10, 20]);
|
|
140
|
+
});
|
|
141
|
+
it('handles mixed formats', () => {
|
|
142
|
+
const numbers = extractNumbers('Add 5 to twenty');
|
|
143
|
+
expect(numbers).toEqual([5, 20]);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=challenge.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"challenge.test.js","sourceRoot":"","sources":["../../src/__tests__/challenge.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for config management.
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import * as os from 'os';
|
|
7
|
+
import { describe, it, expect, beforeEach, afterAll } from '@jest/globals';
|
|
8
|
+
// Use a test-specific config directory
|
|
9
|
+
const TEST_CONFIG_DIR = path.join(os.tmpdir(), '.orca-test-' + process.pid);
|
|
10
|
+
const TEST_CONFIG_PATH = path.join(TEST_CONFIG_DIR, 'config.json');
|
|
11
|
+
// Helper functions that mirror the actual implementation but use test paths
|
|
12
|
+
function testConfigExists() {
|
|
13
|
+
return fs.existsSync(TEST_CONFIG_PATH);
|
|
14
|
+
}
|
|
15
|
+
function testLoadConfig() {
|
|
16
|
+
if (!testConfigExists()) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const content = fs.readFileSync(TEST_CONFIG_PATH, 'utf-8');
|
|
21
|
+
return JSON.parse(content);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function testSaveConfig(config) {
|
|
28
|
+
if (!fs.existsSync(TEST_CONFIG_DIR)) {
|
|
29
|
+
fs.mkdirSync(TEST_CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
30
|
+
}
|
|
31
|
+
fs.writeFileSync(TEST_CONFIG_PATH, JSON.stringify(config, null, 2), {
|
|
32
|
+
mode: 0o600,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
describe('config', () => {
|
|
36
|
+
beforeEach(() => {
|
|
37
|
+
// Clean up test directory before each test
|
|
38
|
+
if (fs.existsSync(TEST_CONFIG_DIR)) {
|
|
39
|
+
fs.rmSync(TEST_CONFIG_DIR, { recursive: true });
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
afterAll(() => {
|
|
43
|
+
// Clean up test directory after all tests
|
|
44
|
+
if (fs.existsSync(TEST_CONFIG_DIR)) {
|
|
45
|
+
fs.rmSync(TEST_CONFIG_DIR, { recursive: true });
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
describe('loadConfig', () => {
|
|
49
|
+
it('returns null when no config exists', () => {
|
|
50
|
+
const result = testLoadConfig();
|
|
51
|
+
expect(result).toBeNull();
|
|
52
|
+
});
|
|
53
|
+
it('loads existing config', () => {
|
|
54
|
+
const testConfig = {
|
|
55
|
+
agentId: 'test-agent',
|
|
56
|
+
coordinatorUrl: 'https://coordinator.example.com',
|
|
57
|
+
natsUrl: 'nats://localhost:4222',
|
|
58
|
+
solanaWallet: 'test-wallet',
|
|
59
|
+
telegramChatId: '12345',
|
|
60
|
+
keypairPath: '/path/to/keypair',
|
|
61
|
+
};
|
|
62
|
+
testSaveConfig(testConfig);
|
|
63
|
+
const result = testLoadConfig();
|
|
64
|
+
expect(result).toEqual(testConfig);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('saveConfig and loadConfig roundtrip', () => {
|
|
68
|
+
it('correctly saves and loads config', () => {
|
|
69
|
+
const testConfig = {
|
|
70
|
+
agentId: 'roundtrip-agent',
|
|
71
|
+
coordinatorUrl: 'https://coordinator.test.com',
|
|
72
|
+
natsUrl: 'nats://nats.test.com:4222',
|
|
73
|
+
solanaWallet: 'roundtrip-wallet-address',
|
|
74
|
+
telegramChatId: '67890',
|
|
75
|
+
keypairPath: '/test/keypair/path',
|
|
76
|
+
moltbook: {
|
|
77
|
+
apiKey: 'test-api-key',
|
|
78
|
+
claimed: true,
|
|
79
|
+
},
|
|
80
|
+
autoAccept: {
|
|
81
|
+
enabled: true,
|
|
82
|
+
minOrca: 10,
|
|
83
|
+
maxOrca: 100,
|
|
84
|
+
allowedActions: ['like', 'comment'],
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
testSaveConfig(testConfig);
|
|
88
|
+
const loaded = testLoadConfig();
|
|
89
|
+
expect(loaded).not.toBeNull();
|
|
90
|
+
expect(loaded.agentId).toBe(testConfig.agentId);
|
|
91
|
+
expect(loaded.coordinatorUrl).toBe(testConfig.coordinatorUrl);
|
|
92
|
+
expect(loaded.natsUrl).toBe(testConfig.natsUrl);
|
|
93
|
+
expect(loaded.solanaWallet).toBe(testConfig.solanaWallet);
|
|
94
|
+
expect(loaded.telegramChatId).toBe(testConfig.telegramChatId);
|
|
95
|
+
expect(loaded.keypairPath).toBe(testConfig.keypairPath);
|
|
96
|
+
expect(loaded.moltbook).toEqual(testConfig.moltbook);
|
|
97
|
+
expect(loaded.autoAccept).toEqual(testConfig.autoAccept);
|
|
98
|
+
});
|
|
99
|
+
it('overwrites existing config on save', () => {
|
|
100
|
+
const config1 = {
|
|
101
|
+
agentId: 'agent-1',
|
|
102
|
+
coordinatorUrl: 'https://old.example.com',
|
|
103
|
+
natsUrl: 'nats://old:4222',
|
|
104
|
+
solanaWallet: 'wallet-1',
|
|
105
|
+
telegramChatId: '111',
|
|
106
|
+
keypairPath: '/old/path',
|
|
107
|
+
};
|
|
108
|
+
const config2 = {
|
|
109
|
+
agentId: 'agent-2',
|
|
110
|
+
coordinatorUrl: 'https://new.example.com',
|
|
111
|
+
natsUrl: 'nats://new:4222',
|
|
112
|
+
solanaWallet: 'wallet-2',
|
|
113
|
+
telegramChatId: '222',
|
|
114
|
+
keypairPath: '/new/path',
|
|
115
|
+
};
|
|
116
|
+
testSaveConfig(config1);
|
|
117
|
+
testSaveConfig(config2);
|
|
118
|
+
const loaded = testLoadConfig();
|
|
119
|
+
expect(loaded.agentId).toBe('agent-2');
|
|
120
|
+
expect(loaded.coordinatorUrl).toBe('https://new.example.com');
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
describe('configExists', () => {
|
|
124
|
+
it('returns false when config does not exist', () => {
|
|
125
|
+
expect(testConfigExists()).toBe(false);
|
|
126
|
+
});
|
|
127
|
+
it('returns true when config exists', () => {
|
|
128
|
+
const testConfig = {
|
|
129
|
+
agentId: 'exists-agent',
|
|
130
|
+
coordinatorUrl: 'https://coordinator.example.com',
|
|
131
|
+
natsUrl: 'nats://localhost:4222',
|
|
132
|
+
solanaWallet: 'exists-wallet',
|
|
133
|
+
telegramChatId: '99999',
|
|
134
|
+
keypairPath: '/path/to/keypair',
|
|
135
|
+
};
|
|
136
|
+
testSaveConfig(testConfig);
|
|
137
|
+
expect(testConfigExists()).toBe(true);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
//# sourceMappingURL=config.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keypair.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/keypair.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for keypair generation and management.
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import * as os from 'os';
|
|
7
|
+
import { describe, it, expect, beforeEach, afterAll } from '@jest/globals';
|
|
8
|
+
import bs58 from 'bs58';
|
|
9
|
+
import nacl from 'tweetnacl';
|
|
10
|
+
import { generateKeypair, publicKeyBase58, } from '../crypto/keypair';
|
|
11
|
+
// Use a test-specific config directory
|
|
12
|
+
const TEST_CONFIG_DIR = path.join(os.tmpdir(), '.orca-keypair-test-' + process.pid);
|
|
13
|
+
const TEST_KEYPAIR_PATH = path.join(TEST_CONFIG_DIR, 'keypair.json');
|
|
14
|
+
// Helper functions that mirror the actual implementation but use test paths
|
|
15
|
+
function testSaveKeypair(keypair) {
|
|
16
|
+
if (!fs.existsSync(TEST_CONFIG_DIR)) {
|
|
17
|
+
fs.mkdirSync(TEST_CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
18
|
+
}
|
|
19
|
+
const data = {
|
|
20
|
+
publicKey: bs58.encode(keypair.publicKey),
|
|
21
|
+
secretKey: bs58.encode(keypair.secretKey),
|
|
22
|
+
};
|
|
23
|
+
fs.writeFileSync(TEST_KEYPAIR_PATH, JSON.stringify(data, null, 2), {
|
|
24
|
+
mode: 0o600,
|
|
25
|
+
});
|
|
26
|
+
return TEST_KEYPAIR_PATH;
|
|
27
|
+
}
|
|
28
|
+
function testLoadKeypair() {
|
|
29
|
+
if (!fs.existsSync(TEST_KEYPAIR_PATH)) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const content = fs.readFileSync(TEST_KEYPAIR_PATH, 'utf-8');
|
|
34
|
+
const data = JSON.parse(content);
|
|
35
|
+
return {
|
|
36
|
+
publicKey: bs58.decode(data.publicKey),
|
|
37
|
+
secretKey: bs58.decode(data.secretKey),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
describe('keypair', () => {
|
|
45
|
+
beforeEach(() => {
|
|
46
|
+
// Clean up test directory before each test
|
|
47
|
+
if (fs.existsSync(TEST_CONFIG_DIR)) {
|
|
48
|
+
fs.rmSync(TEST_CONFIG_DIR, { recursive: true });
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
afterAll(() => {
|
|
52
|
+
// Clean up test directory after all tests
|
|
53
|
+
if (fs.existsSync(TEST_CONFIG_DIR)) {
|
|
54
|
+
fs.rmSync(TEST_CONFIG_DIR, { recursive: true });
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
describe('generateKeypair', () => {
|
|
58
|
+
it('creates valid keypair with correct key lengths', () => {
|
|
59
|
+
const keypair = generateKeypair();
|
|
60
|
+
expect(keypair).toBeDefined();
|
|
61
|
+
expect(keypair.publicKey).toBeInstanceOf(Uint8Array);
|
|
62
|
+
expect(keypair.secretKey).toBeInstanceOf(Uint8Array);
|
|
63
|
+
// Ed25519 key sizes
|
|
64
|
+
expect(keypair.publicKey.length).toBe(32);
|
|
65
|
+
expect(keypair.secretKey.length).toBe(64);
|
|
66
|
+
});
|
|
67
|
+
it('generates unique keypairs each time', () => {
|
|
68
|
+
const keypair1 = generateKeypair();
|
|
69
|
+
const keypair2 = generateKeypair();
|
|
70
|
+
const pk1 = bs58.encode(keypair1.publicKey);
|
|
71
|
+
const pk2 = bs58.encode(keypair2.publicKey);
|
|
72
|
+
expect(pk1).not.toBe(pk2);
|
|
73
|
+
});
|
|
74
|
+
it('generates keypair that can sign and verify', () => {
|
|
75
|
+
const keypair = generateKeypair();
|
|
76
|
+
const message = new TextEncoder().encode('test message');
|
|
77
|
+
const signature = nacl.sign.detached(message, keypair.secretKey);
|
|
78
|
+
const isValid = nacl.sign.detached.verify(message, signature, keypair.publicKey);
|
|
79
|
+
expect(isValid).toBe(true);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
describe('publicKeyBase58', () => {
|
|
83
|
+
it('encodes public key correctly', () => {
|
|
84
|
+
const keypair = generateKeypair();
|
|
85
|
+
const encoded = publicKeyBase58(keypair);
|
|
86
|
+
expect(typeof encoded).toBe('string');
|
|
87
|
+
expect(encoded.length).toBeGreaterThan(0);
|
|
88
|
+
// Base58 decoding should give back the original key
|
|
89
|
+
const decoded = bs58.decode(encoded);
|
|
90
|
+
expect(decoded).toEqual(keypair.publicKey);
|
|
91
|
+
});
|
|
92
|
+
it('produces consistent encoding for same key', () => {
|
|
93
|
+
const keypair = generateKeypair();
|
|
94
|
+
const encoded1 = publicKeyBase58(keypair);
|
|
95
|
+
const encoded2 = publicKeyBase58(keypair);
|
|
96
|
+
expect(encoded1).toBe(encoded2);
|
|
97
|
+
});
|
|
98
|
+
it('produces valid base58 string', () => {
|
|
99
|
+
const keypair = generateKeypair();
|
|
100
|
+
const encoded = publicKeyBase58(keypair);
|
|
101
|
+
// Base58 alphabet (no 0, O, I, l)
|
|
102
|
+
const base58Regex = /^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$/;
|
|
103
|
+
expect(encoded).toMatch(base58Regex);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe('saveKeypair and loadKeypair roundtrip', () => {
|
|
107
|
+
it('correctly saves and loads keypair', () => {
|
|
108
|
+
const originalKeypair = generateKeypair();
|
|
109
|
+
testSaveKeypair(originalKeypair);
|
|
110
|
+
const loadedKeypair = testLoadKeypair();
|
|
111
|
+
expect(loadedKeypair).not.toBeNull();
|
|
112
|
+
expect(loadedKeypair.publicKey).toEqual(originalKeypair.publicKey);
|
|
113
|
+
expect(loadedKeypair.secretKey).toEqual(originalKeypair.secretKey);
|
|
114
|
+
});
|
|
115
|
+
it('saves keypair to correct location', () => {
|
|
116
|
+
const keypair = generateKeypair();
|
|
117
|
+
const savedPath = testSaveKeypair(keypair);
|
|
118
|
+
expect(savedPath).toBe(TEST_KEYPAIR_PATH);
|
|
119
|
+
expect(fs.existsSync(savedPath)).toBe(true);
|
|
120
|
+
});
|
|
121
|
+
it('saves keypair as JSON with base58 encoding', () => {
|
|
122
|
+
const keypair = generateKeypair();
|
|
123
|
+
testSaveKeypair(keypair);
|
|
124
|
+
const content = fs.readFileSync(TEST_KEYPAIR_PATH, 'utf-8');
|
|
125
|
+
const data = JSON.parse(content);
|
|
126
|
+
expect(data.publicKey).toBe(bs58.encode(keypair.publicKey));
|
|
127
|
+
expect(data.secretKey).toBe(bs58.encode(keypair.secretKey));
|
|
128
|
+
});
|
|
129
|
+
it('returns null when keypair does not exist', () => {
|
|
130
|
+
const result = testLoadKeypair();
|
|
131
|
+
expect(result).toBeNull();
|
|
132
|
+
});
|
|
133
|
+
it('loaded keypair can sign and verify', () => {
|
|
134
|
+
const originalKeypair = generateKeypair();
|
|
135
|
+
testSaveKeypair(originalKeypair);
|
|
136
|
+
const loadedKeypair = testLoadKeypair();
|
|
137
|
+
const message = new TextEncoder().encode('roundtrip test message');
|
|
138
|
+
const signature = nacl.sign.detached(message, loadedKeypair.secretKey);
|
|
139
|
+
const isValid = nacl.sign.detached.verify(message, signature, loadedKeypair.publicKey);
|
|
140
|
+
expect(isValid).toBe(true);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
//# sourceMappingURL=keypair.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keypair.test.js","sourceRoot":"","sources":["../../src/__tests__/keypair.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task_handler.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/task_handler.test.ts"],"names":[],"mappings":""}
|