@f2a/network 0.1.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/.github/workflows/ci.yml +113 -0
- package/.github/workflows/publish.yml +60 -0
- package/LICENSE +21 -0
- package/MONOREPO.md +58 -0
- package/README.md +280 -0
- package/SKILL.md +137 -0
- package/dist/adapters/openclaw.d.ts +103 -0
- package/dist/adapters/openclaw.d.ts.map +1 -0
- package/dist/adapters/openclaw.js +297 -0
- package/dist/adapters/openclaw.js.map +1 -0
- package/dist/cli/commands.d.ts +17 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +107 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +203 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/autonomous-economy.d.ts +136 -0
- package/dist/core/autonomous-economy.d.ts.map +1 -0
- package/dist/core/autonomous-economy.js +255 -0
- package/dist/core/autonomous-economy.js.map +1 -0
- package/dist/core/connection-manager.d.ts +80 -0
- package/dist/core/connection-manager.d.ts.map +1 -0
- package/dist/core/connection-manager.js +235 -0
- package/dist/core/connection-manager.js.map +1 -0
- package/dist/core/connection-manager.test.d.ts +2 -0
- package/dist/core/connection-manager.test.d.ts.map +1 -0
- package/dist/core/connection-manager.test.js +52 -0
- package/dist/core/connection-manager.test.js.map +1 -0
- package/dist/core/e2ee-crypto.d.ts +90 -0
- package/dist/core/e2ee-crypto.d.ts.map +1 -0
- package/dist/core/e2ee-crypto.js +190 -0
- package/dist/core/e2ee-crypto.js.map +1 -0
- package/dist/core/f2a.d.ts +126 -0
- package/dist/core/f2a.d.ts.map +1 -0
- package/dist/core/f2a.js +425 -0
- package/dist/core/f2a.js.map +1 -0
- package/dist/core/identity.d.ts +47 -0
- package/dist/core/identity.d.ts.map +1 -0
- package/dist/core/identity.js +130 -0
- package/dist/core/identity.js.map +1 -0
- package/dist/core/identity.test.d.ts +2 -0
- package/dist/core/identity.test.d.ts.map +1 -0
- package/dist/core/identity.test.js +43 -0
- package/dist/core/identity.test.js.map +1 -0
- package/dist/core/p2p-network.d.ts +242 -0
- package/dist/core/p2p-network.d.ts.map +1 -0
- package/dist/core/p2p-network.js +1182 -0
- package/dist/core/p2p-network.js.map +1 -0
- package/dist/core/reputation-security.d.ts +168 -0
- package/dist/core/reputation-security.d.ts.map +1 -0
- package/dist/core/reputation-security.js +369 -0
- package/dist/core/reputation-security.js.map +1 -0
- package/dist/core/reputation.d.ts +179 -0
- package/dist/core/reputation.d.ts.map +1 -0
- package/dist/core/reputation.js +472 -0
- package/dist/core/reputation.js.map +1 -0
- package/dist/core/review-committee.d.ts +130 -0
- package/dist/core/review-committee.d.ts.map +1 -0
- package/dist/core/review-committee.js +251 -0
- package/dist/core/review-committee.js.map +1 -0
- package/dist/core/serverless.d.ts +155 -0
- package/dist/core/serverless.d.ts.map +1 -0
- package/dist/core/serverless.js +615 -0
- package/dist/core/serverless.js.map +1 -0
- package/dist/core/token-manager.d.ts +42 -0
- package/dist/core/token-manager.d.ts.map +1 -0
- package/dist/core/token-manager.js +122 -0
- package/dist/core/token-manager.js.map +1 -0
- package/dist/daemon/control-server.d.ts +55 -0
- package/dist/daemon/control-server.d.ts.map +1 -0
- package/dist/daemon/control-server.js +262 -0
- package/dist/daemon/control-server.js.map +1 -0
- package/dist/daemon/index.d.ts +35 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +69 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/main.d.ts +6 -0
- package/dist/daemon/main.d.ts.map +1 -0
- package/dist/daemon/main.js +38 -0
- package/dist/daemon/main.js.map +1 -0
- package/dist/daemon/start.d.ts +6 -0
- package/dist/daemon/start.d.ts.map +1 -0
- package/dist/daemon/start.js +25 -0
- package/dist/daemon/start.js.map +1 -0
- package/dist/daemon/webhook.d.ts +30 -0
- package/dist/daemon/webhook.d.ts.map +1 -0
- package/dist/daemon/webhook.js +86 -0
- package/dist/daemon/webhook.js.map +1 -0
- package/dist/daemon/webhook.test.d.ts +2 -0
- package/dist/daemon/webhook.test.d.ts.map +1 -0
- package/dist/daemon/webhook.test.js +24 -0
- package/dist/daemon/webhook.test.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol/messages.d.ts +739 -0
- package/dist/protocol/messages.d.ts.map +1 -0
- package/dist/protocol/messages.js +188 -0
- package/dist/protocol/messages.js.map +1 -0
- package/dist/protocol/messages.test.d.ts +2 -0
- package/dist/protocol/messages.test.d.ts.map +1 -0
- package/dist/protocol/messages.test.js +55 -0
- package/dist/protocol/messages.test.js.map +1 -0
- package/dist/types/index.d.ts +247 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +10 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/result.d.ts +28 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js +16 -0
- package/dist/types/result.js.map +1 -0
- package/dist/utils/benchmark.d.ts +67 -0
- package/dist/utils/benchmark.d.ts.map +1 -0
- package/dist/utils/benchmark.js +179 -0
- package/dist/utils/benchmark.js.map +1 -0
- package/dist/utils/logger.d.ts +105 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +275 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/middleware.d.ts +85 -0
- package/dist/utils/middleware.d.ts.map +1 -0
- package/dist/utils/middleware.js +173 -0
- package/dist/utils/middleware.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +71 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +160 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/signature.d.ts +57 -0
- package/dist/utils/signature.d.ts.map +1 -0
- package/dist/utils/signature.js +102 -0
- package/dist/utils/signature.js.map +1 -0
- package/dist/utils/validation.d.ts +504 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +159 -0
- package/dist/utils/validation.js.map +1 -0
- package/docs/F2A-PROTOCOL.md +61 -0
- package/docs/MOBILE_BOOTSTRAP_DESIGN.md +126 -0
- package/docs/a2a-lessons.md +316 -0
- package/docs/middleware-guide.md +448 -0
- package/docs/readme-update-checklist.md +90 -0
- package/docs/reputation-guide.md +396 -0
- package/docs/rfcs/001-reputation-system.md +712 -0
- package/docs/security-design.md +247 -0
- package/install.sh +231 -0
- package/package.json +64 -0
- package/packages/openclaw-adapter/README.md +510 -0
- package/packages/openclaw-adapter/openclaw.plugin.json +106 -0
- package/packages/openclaw-adapter/package.json +40 -0
- package/packages/openclaw-adapter/src/announcement-queue.test.ts +449 -0
- package/packages/openclaw-adapter/src/announcement-queue.ts +403 -0
- package/packages/openclaw-adapter/src/capability-detector.test.ts +99 -0
- package/packages/openclaw-adapter/src/capability-detector.ts +183 -0
- package/packages/openclaw-adapter/src/claim-handlers.test.ts +974 -0
- package/packages/openclaw-adapter/src/claim-handlers.ts +482 -0
- package/packages/openclaw-adapter/src/connector.business.test.ts +583 -0
- package/packages/openclaw-adapter/src/connector.ts +795 -0
- package/packages/openclaw-adapter/src/index.test.ts +82 -0
- package/packages/openclaw-adapter/src/index.ts +18 -0
- package/packages/openclaw-adapter/src/integration.e2e.test.ts +829 -0
- package/packages/openclaw-adapter/src/logger.ts +51 -0
- package/packages/openclaw-adapter/src/network-client.test.ts +266 -0
- package/packages/openclaw-adapter/src/network-client.ts +251 -0
- package/packages/openclaw-adapter/src/network-recovery.test.ts +465 -0
- package/packages/openclaw-adapter/src/node-manager.test.ts +136 -0
- package/packages/openclaw-adapter/src/node-manager.ts +429 -0
- package/packages/openclaw-adapter/src/plugin.test.ts +439 -0
- package/packages/openclaw-adapter/src/plugin.ts +104 -0
- package/packages/openclaw-adapter/src/reputation.test.ts +221 -0
- package/packages/openclaw-adapter/src/reputation.ts +368 -0
- package/packages/openclaw-adapter/src/task-guard.test.ts +502 -0
- package/packages/openclaw-adapter/src/task-guard.ts +860 -0
- package/packages/openclaw-adapter/src/task-queue.concurrency.test.ts +462 -0
- package/packages/openclaw-adapter/src/task-queue.edge-cases.test.ts +284 -0
- package/packages/openclaw-adapter/src/task-queue.persistence.test.ts +408 -0
- package/packages/openclaw-adapter/src/task-queue.ts +668 -0
- package/packages/openclaw-adapter/src/tool-handlers.test.ts +906 -0
- package/packages/openclaw-adapter/src/tool-handlers.ts +574 -0
- package/packages/openclaw-adapter/src/types.ts +361 -0
- package/packages/openclaw-adapter/src/webhook-pusher.test.ts +188 -0
- package/packages/openclaw-adapter/src/webhook-pusher.ts +220 -0
- package/packages/openclaw-adapter/src/webhook-server.test.ts +580 -0
- package/packages/openclaw-adapter/src/webhook-server.ts +202 -0
- package/packages/openclaw-adapter/tsconfig.json +20 -0
- package/src/cli/commands.test.ts +157 -0
- package/src/cli/commands.ts +129 -0
- package/src/cli/index.test.ts +77 -0
- package/src/cli/index.ts +234 -0
- package/src/core/autonomous-economy.test.ts +291 -0
- package/src/core/autonomous-economy.ts +428 -0
- package/src/core/e2ee-crypto.test.ts +125 -0
- package/src/core/e2ee-crypto.ts +246 -0
- package/src/core/f2a.test.ts +269 -0
- package/src/core/f2a.ts +618 -0
- package/src/core/p2p-network.test.ts +199 -0
- package/src/core/p2p-network.ts +1432 -0
- package/src/core/reputation-security.test.ts +403 -0
- package/src/core/reputation-security.ts +562 -0
- package/src/core/reputation.test.ts +260 -0
- package/src/core/reputation.ts +576 -0
- package/src/core/review-committee.test.ts +380 -0
- package/src/core/review-committee.ts +401 -0
- package/src/core/token-manager.test.ts +133 -0
- package/src/core/token-manager.ts +140 -0
- package/src/daemon/control-server.test.ts +216 -0
- package/src/daemon/control-server.ts +292 -0
- package/src/daemon/index.test.ts +85 -0
- package/src/daemon/index.ts +89 -0
- package/src/daemon/main.ts +44 -0
- package/src/daemon/start.ts +29 -0
- package/src/daemon/webhook.test.ts +68 -0
- package/src/daemon/webhook.ts +105 -0
- package/src/index.test.ts +436 -0
- package/src/index.ts +72 -0
- package/src/types/index.test.ts +87 -0
- package/src/types/index.ts +341 -0
- package/src/types/result.ts +68 -0
- package/src/utils/benchmark.ts +237 -0
- package/src/utils/logger.ts +331 -0
- package/src/utils/middleware.ts +229 -0
- package/src/utils/rate-limiter.ts +207 -0
- package/src/utils/signature.ts +136 -0
- package/src/utils/validation.ts +186 -0
- package/tests/docker/Dockerfile.node +23 -0
- package/tests/docker/Dockerfile.runner +18 -0
- package/tests/docker/docker-compose.test.yml +73 -0
- package/tests/integration/message-passing.test.ts +109 -0
- package/tests/integration/multi-node.test.ts +92 -0
- package/tests/integration/p2p-connection.test.ts +83 -0
- package/tests/integration/test-config.ts +32 -0
- package/tsconfig.json +21 -0
- package/vitest.config.ts +26 -0
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* F2A CLI 入口 - P2P 版本
|
|
4
|
+
*/
|
|
5
|
+
import { request } from 'http';
|
|
6
|
+
import { existsSync, readFileSync } from 'fs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { homedir } from 'os';
|
|
9
|
+
const CONTROL_PORT = parseInt(process.env.F2A_CONTROL_PORT || '9001');
|
|
10
|
+
/**
|
|
11
|
+
* 获取控制 Token
|
|
12
|
+
* 优先从环境变量读取,其次从默认文件位置读取
|
|
13
|
+
* @returns 控制 Token,如果未找到返回空字符串
|
|
14
|
+
*/
|
|
15
|
+
function getControlToken() {
|
|
16
|
+
// 1. 优先使用环境变量
|
|
17
|
+
const envToken = process.env.F2A_CONTROL_TOKEN;
|
|
18
|
+
if (envToken) {
|
|
19
|
+
return envToken;
|
|
20
|
+
}
|
|
21
|
+
// 2. 从默认文件位置读取
|
|
22
|
+
const tokenPath = join(homedir(), '.f2a', 'control-token');
|
|
23
|
+
if (existsSync(tokenPath)) {
|
|
24
|
+
const fileToken = readFileSync(tokenPath, 'utf-8').trim();
|
|
25
|
+
if (fileToken) {
|
|
26
|
+
return fileToken;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// 3. 如果都没有,返回空字符串(会导致认证失败)
|
|
30
|
+
console.warn('⚠️ Warning: F2A_CONTROL_TOKEN not set and no token file found.');
|
|
31
|
+
console.warn(' Token file location:', tokenPath);
|
|
32
|
+
console.warn(' Please start the F2A daemon first, or set F2A_CONTROL_TOKEN.');
|
|
33
|
+
return '';
|
|
34
|
+
}
|
|
35
|
+
const CONTROL_TOKEN = getControlToken();
|
|
36
|
+
/**
|
|
37
|
+
* 解析命令行参数
|
|
38
|
+
* @returns 解析后的参数对象
|
|
39
|
+
*/
|
|
40
|
+
function parseArgs() {
|
|
41
|
+
const args = process.argv.slice(2);
|
|
42
|
+
if (args.length === 0) {
|
|
43
|
+
return { command: 'help' };
|
|
44
|
+
}
|
|
45
|
+
const command = args[0];
|
|
46
|
+
// 解析 ID 或序号
|
|
47
|
+
let idOrIndex;
|
|
48
|
+
if (args[1]) {
|
|
49
|
+
idOrIndex = /^\d+$/.test(args[1]) ? parseInt(args[1]) : args[1];
|
|
50
|
+
}
|
|
51
|
+
// 解析能力过滤
|
|
52
|
+
let capability;
|
|
53
|
+
const capIndex = args.indexOf('--capability');
|
|
54
|
+
if (capIndex !== -1 && args[capIndex + 1]) {
|
|
55
|
+
capability = args[capIndex + 1];
|
|
56
|
+
}
|
|
57
|
+
// 解析原因
|
|
58
|
+
let reason;
|
|
59
|
+
const reasonIndex = args.indexOf('--reason');
|
|
60
|
+
if (reasonIndex !== -1 && args[reasonIndex + 1]) {
|
|
61
|
+
reason = args[reasonIndex + 1];
|
|
62
|
+
}
|
|
63
|
+
return { command, idOrIndex, capability, reason };
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 显示帮助信息
|
|
67
|
+
* @returns void
|
|
68
|
+
*/
|
|
69
|
+
function showHelp() {
|
|
70
|
+
console.log(`
|
|
71
|
+
F2A CLI - Friend-to-Agent P2P Networking
|
|
72
|
+
|
|
73
|
+
Usage: f2a [command] [options]
|
|
74
|
+
|
|
75
|
+
Commands:
|
|
76
|
+
status 查看节点状态
|
|
77
|
+
peers 查看已连接的 Peers
|
|
78
|
+
discover [options] 发现网络中的 Agents
|
|
79
|
+
pending 查看待确认连接
|
|
80
|
+
confirm [id|index] 确认连接请求
|
|
81
|
+
reject [id|index] 拒绝连接请求
|
|
82
|
+
help 显示帮助
|
|
83
|
+
|
|
84
|
+
Options:
|
|
85
|
+
-c, --capability 按能力过滤 (discover 命令)
|
|
86
|
+
--reason [text] 拒绝原因 (reject 命令)
|
|
87
|
+
|
|
88
|
+
Environment Variables:
|
|
89
|
+
F2A_CONTROL_PORT 控制服务器端口 (默认: 9001)
|
|
90
|
+
F2A_CONTROL_TOKEN 控制服务器认证 Token
|
|
91
|
+
(如果不设置,会读取 ~/.f2a/control-token)
|
|
92
|
+
|
|
93
|
+
Examples:
|
|
94
|
+
f2a status
|
|
95
|
+
f2a peers
|
|
96
|
+
f2a discover
|
|
97
|
+
f2a discover --capability code-generation
|
|
98
|
+
f2a pending
|
|
99
|
+
f2a confirm 1
|
|
100
|
+
f2a reject 2 --reason "unknown"
|
|
101
|
+
`);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 发送控制命令到 F2A Daemon
|
|
105
|
+
* @param action - 命令动作
|
|
106
|
+
* @param params - 命令参数(可选)
|
|
107
|
+
* @returns Promise,命令执行完成后 resolve
|
|
108
|
+
* @throws 当网络请求失败时 reject
|
|
109
|
+
*/
|
|
110
|
+
async function sendCommand(action, params) {
|
|
111
|
+
return new Promise((resolve, reject) => {
|
|
112
|
+
const payload = JSON.stringify({ action, ...params });
|
|
113
|
+
const options = {
|
|
114
|
+
hostname: '127.0.0.1',
|
|
115
|
+
port: CONTROL_PORT,
|
|
116
|
+
path: '/control',
|
|
117
|
+
method: 'POST',
|
|
118
|
+
headers: {
|
|
119
|
+
'Content-Type': 'application/json',
|
|
120
|
+
'Content-Length': Buffer.byteLength(payload),
|
|
121
|
+
'X-F2A-Token': CONTROL_TOKEN
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
const req = request(options, (res) => {
|
|
125
|
+
let data = '';
|
|
126
|
+
res.on('data', chunk => data += chunk);
|
|
127
|
+
res.on('end', () => {
|
|
128
|
+
try {
|
|
129
|
+
const response = JSON.parse(data);
|
|
130
|
+
if (response.success) {
|
|
131
|
+
console.log(JSON.stringify(response, null, 2));
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
if (res.statusCode === 401) {
|
|
135
|
+
console.error('❌ Authentication failed. Please check your F2A_CONTROL_TOKEN.');
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
console.error('Error:', response.error);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
resolve();
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
console.log(data);
|
|
145
|
+
resolve();
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
req.on('error', (err) => {
|
|
150
|
+
console.error('Failed to connect to F2A daemon:', err.message);
|
|
151
|
+
console.log('Make sure the daemon is running (f2a daemon start)');
|
|
152
|
+
reject(err);
|
|
153
|
+
});
|
|
154
|
+
req.write(payload);
|
|
155
|
+
req.end();
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* 主函数 - CLI 入口
|
|
160
|
+
* @returns Promise,程序退出时 resolve
|
|
161
|
+
* @throws 当命令执行失败时 reject
|
|
162
|
+
*/
|
|
163
|
+
async function main() {
|
|
164
|
+
const args = parseArgs();
|
|
165
|
+
switch (args.command) {
|
|
166
|
+
case 'status':
|
|
167
|
+
await sendCommand('status');
|
|
168
|
+
break;
|
|
169
|
+
case 'peers':
|
|
170
|
+
await sendCommand('peers');
|
|
171
|
+
break;
|
|
172
|
+
case 'discover':
|
|
173
|
+
await sendCommand('discover', { capability: args.capability });
|
|
174
|
+
break;
|
|
175
|
+
case 'pending':
|
|
176
|
+
await sendCommand('pending');
|
|
177
|
+
break;
|
|
178
|
+
case 'confirm':
|
|
179
|
+
if (args.idOrIndex === undefined) {
|
|
180
|
+
console.error('[F2A] 错误: 需要指定 ID 或序号');
|
|
181
|
+
console.error('用法: f2a confirm [id|index]');
|
|
182
|
+
process.exit(1);
|
|
183
|
+
}
|
|
184
|
+
await sendCommand('confirm', { id: args.idOrIndex });
|
|
185
|
+
break;
|
|
186
|
+
case 'reject':
|
|
187
|
+
if (args.idOrIndex === undefined) {
|
|
188
|
+
console.error('[F2A] 错误: 需要指定 ID 或序号');
|
|
189
|
+
console.error('用法: f2a reject [id|index]');
|
|
190
|
+
process.exit(1);
|
|
191
|
+
}
|
|
192
|
+
await sendCommand('reject', { id: args.idOrIndex, reason: args.reason });
|
|
193
|
+
break;
|
|
194
|
+
case 'help':
|
|
195
|
+
default:
|
|
196
|
+
showHelp();
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
main().catch(err => {
|
|
200
|
+
console.error('[F2A] 错误:', err);
|
|
201
|
+
process.exit(1);
|
|
202
|
+
});
|
|
203
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* F2A 自治经济系统
|
|
3
|
+
* Phase 4: 信誉消耗、评审激励、优先级调度
|
|
4
|
+
*/
|
|
5
|
+
import { ReputationManager } from './reputation.js';
|
|
6
|
+
import { ReviewCommittee, ReviewResult } from './review-committee.js';
|
|
7
|
+
/**
|
|
8
|
+
* 任务请求
|
|
9
|
+
*/
|
|
10
|
+
export interface TaskRequest {
|
|
11
|
+
taskId: string;
|
|
12
|
+
requesterId: string;
|
|
13
|
+
capability: string;
|
|
14
|
+
description: string;
|
|
15
|
+
parameters?: Record<string, unknown>;
|
|
16
|
+
timeout?: number;
|
|
17
|
+
estimatedComplexity?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 任务成本估算
|
|
21
|
+
*/
|
|
22
|
+
export interface TaskCost {
|
|
23
|
+
baseCost: number;
|
|
24
|
+
discount: number;
|
|
25
|
+
finalCost: number;
|
|
26
|
+
priority: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 任务奖励
|
|
30
|
+
*/
|
|
31
|
+
export interface TaskReward {
|
|
32
|
+
executorReward: number;
|
|
33
|
+
reviewerReward: number;
|
|
34
|
+
requesterRefund: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 经济配置
|
|
38
|
+
*/
|
|
39
|
+
export interface EconomyConfig {
|
|
40
|
+
/** 基础任务成本 */
|
|
41
|
+
baseTaskCost: number;
|
|
42
|
+
/** 复杂度系数 */
|
|
43
|
+
complexityMultiplier: number;
|
|
44
|
+
/** 执行者奖励比例 */
|
|
45
|
+
executorRewardRate: number;
|
|
46
|
+
/** 评审者奖励比例 */
|
|
47
|
+
reviewerRewardRate: number;
|
|
48
|
+
/** 任务超时惩罚 */
|
|
49
|
+
timeoutPenalty: number;
|
|
50
|
+
/** 拒绝任务惩罚 */
|
|
51
|
+
rejectionPenalty: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 优先级队列项
|
|
55
|
+
*/
|
|
56
|
+
export interface PriorityQueueItem {
|
|
57
|
+
task: TaskRequest;
|
|
58
|
+
priority: number;
|
|
59
|
+
cost: number;
|
|
60
|
+
deducted: boolean;
|
|
61
|
+
timestamp: number;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 任务执行结果
|
|
65
|
+
*/
|
|
66
|
+
export interface TaskExecutionResult {
|
|
67
|
+
taskId: string;
|
|
68
|
+
executorId: string;
|
|
69
|
+
status: 'success' | 'failure' | 'timeout' | 'rejected';
|
|
70
|
+
result?: unknown;
|
|
71
|
+
error?: string;
|
|
72
|
+
reviewResult?: ReviewResult;
|
|
73
|
+
}
|
|
74
|
+
export declare class AutonomousEconomy {
|
|
75
|
+
private config;
|
|
76
|
+
private reputationManager;
|
|
77
|
+
private reviewCommittee;
|
|
78
|
+
private taskQueue;
|
|
79
|
+
private pendingTasks;
|
|
80
|
+
private logger;
|
|
81
|
+
constructor(reputationManager: ReputationManager, reviewCommittee: ReviewCommittee, config?: Partial<EconomyConfig>);
|
|
82
|
+
/**
|
|
83
|
+
* 提交任务(消耗信誉)
|
|
84
|
+
*/
|
|
85
|
+
submitTask(task: TaskRequest): {
|
|
86
|
+
success: boolean;
|
|
87
|
+
cost?: TaskCost;
|
|
88
|
+
error?: string;
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* 计算任务成本
|
|
92
|
+
*/
|
|
93
|
+
calculateTaskCost(task: TaskRequest): TaskCost;
|
|
94
|
+
/**
|
|
95
|
+
* 分配任务给执行者
|
|
96
|
+
*/
|
|
97
|
+
assignTask(taskId: string, executorId: string): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* 完成任务并结算
|
|
100
|
+
*/
|
|
101
|
+
completeTask(result: TaskExecutionResult): TaskReward | null;
|
|
102
|
+
/**
|
|
103
|
+
* 从评审结果计算奖励
|
|
104
|
+
*/
|
|
105
|
+
calculateRewardFromReview(task: TaskRequest, executorId: string, reviewResult: ReviewResult): TaskReward;
|
|
106
|
+
/**
|
|
107
|
+
* 获取下一个待处理任务
|
|
108
|
+
*/
|
|
109
|
+
getNextTask(): PriorityQueueItem | null;
|
|
110
|
+
/**
|
|
111
|
+
* 获取队列长度
|
|
112
|
+
*/
|
|
113
|
+
getQueueLength(): number;
|
|
114
|
+
/**
|
|
115
|
+
* 获取待处理任务
|
|
116
|
+
*/
|
|
117
|
+
getPendingTask(taskId: string): PriorityQueueItem | null;
|
|
118
|
+
/**
|
|
119
|
+
* 取消任务(返还部分信誉)
|
|
120
|
+
*/
|
|
121
|
+
cancelTask(taskId: string): boolean;
|
|
122
|
+
/**
|
|
123
|
+
* 获取经济统计
|
|
124
|
+
*/
|
|
125
|
+
getEconomyStats(): {
|
|
126
|
+
pendingTasks: number;
|
|
127
|
+
queueLength: number;
|
|
128
|
+
totalCostDeducted: number;
|
|
129
|
+
};
|
|
130
|
+
/**
|
|
131
|
+
* 清理过期任务
|
|
132
|
+
*/
|
|
133
|
+
cleanupExpiredTasks(maxAge?: number): string[];
|
|
134
|
+
}
|
|
135
|
+
export default AutonomousEconomy;
|
|
136
|
+
//# sourceMappingURL=autonomous-economy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autonomous-economy.d.ts","sourceRoot":"","sources":["../../src/core/autonomous-economy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAMtE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,aAAa;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY;IACZ,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc;IACd,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc;IACd,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa;IACb,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IACvD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAmBD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,YAAY,CAA6C;IACjE,OAAO,CAAC,MAAM,CAAS;gBAGrB,iBAAiB,EAAE,iBAAiB,EACpC,eAAe,EAAE,eAAe,EAChC,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM;IAQrC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAiDpF;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,QAAQ;IAmB9C;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAkBvD;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,mBAAmB,GAAG,UAAU,GAAG,IAAI;IAsF5D;;OAEG;IACH,yBAAyB,CACvB,IAAI,EAAE,WAAW,EACjB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,YAAY,GACzB,UAAU;IAwBb;;OAEG;IACH,WAAW,IAAI,iBAAiB,GAAG,IAAI;IAIvC;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAIxD;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAwBnC;;OAEG;IACH,eAAe,IAAI;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;KAC3B;IAYD;;OAEG;IACH,mBAAmB,CAAC,MAAM,GAAE,MAA4B,GAAG,MAAM,EAAE;CAiBpE;AAGD,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* F2A 自治经济系统
|
|
3
|
+
* Phase 4: 信誉消耗、评审激励、优先级调度
|
|
4
|
+
*/
|
|
5
|
+
import { Logger } from '../utils/logger.js';
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// 默认配置
|
|
8
|
+
// ============================================================================
|
|
9
|
+
const DEFAULT_ECONOMY_CONFIG = {
|
|
10
|
+
baseTaskCost: 5,
|
|
11
|
+
complexityMultiplier: 0.1,
|
|
12
|
+
executorRewardRate: 0.5,
|
|
13
|
+
reviewerRewardRate: 0.2,
|
|
14
|
+
timeoutPenalty: 15,
|
|
15
|
+
rejectionPenalty: 5,
|
|
16
|
+
};
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// 自治经济管理器
|
|
19
|
+
// ============================================================================
|
|
20
|
+
export class AutonomousEconomy {
|
|
21
|
+
config;
|
|
22
|
+
reputationManager;
|
|
23
|
+
reviewCommittee;
|
|
24
|
+
taskQueue = [];
|
|
25
|
+
pendingTasks = new Map();
|
|
26
|
+
logger;
|
|
27
|
+
constructor(reputationManager, reviewCommittee, config = {}) {
|
|
28
|
+
this.config = { ...DEFAULT_ECONOMY_CONFIG, ...config };
|
|
29
|
+
this.reputationManager = reputationManager;
|
|
30
|
+
this.reviewCommittee = reviewCommittee;
|
|
31
|
+
this.logger = new Logger({ component: 'AutonomousEconomy' });
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 提交任务(消耗信誉)
|
|
35
|
+
*/
|
|
36
|
+
submitTask(task) {
|
|
37
|
+
// 检查发布权限
|
|
38
|
+
if (!this.reputationManager.hasPermission(task.requesterId, 'publish')) {
|
|
39
|
+
return { success: false, error: 'No permission to publish tasks' };
|
|
40
|
+
}
|
|
41
|
+
// 计算成本
|
|
42
|
+
const cost = this.calculateTaskCost(task);
|
|
43
|
+
// 检查信誉是否足够
|
|
44
|
+
const reputation = this.reputationManager.getReputation(task.requesterId);
|
|
45
|
+
if (reputation.score < cost.finalCost) {
|
|
46
|
+
return {
|
|
47
|
+
success: false,
|
|
48
|
+
error: `Insufficient reputation: ${reputation.score.toFixed(1)} < ${cost.finalCost.toFixed(1)}`,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// 预扣信誉
|
|
52
|
+
this.reputationManager.recordFailure(task.requesterId, `task-submit-${task.taskId}`, 'Task submission cost', -cost.finalCost);
|
|
53
|
+
// 加入优先级队列
|
|
54
|
+
const queueItem = {
|
|
55
|
+
task,
|
|
56
|
+
priority: cost.priority,
|
|
57
|
+
cost: cost.finalCost,
|
|
58
|
+
deducted: true,
|
|
59
|
+
timestamp: Date.now(),
|
|
60
|
+
};
|
|
61
|
+
this.taskQueue.push(queueItem);
|
|
62
|
+
this.taskQueue.sort((a, b) => b.priority - a.priority);
|
|
63
|
+
this.pendingTasks.set(task.taskId, queueItem);
|
|
64
|
+
this.logger.info('Task submitted', {
|
|
65
|
+
taskId: task.taskId,
|
|
66
|
+
requesterId: task.requesterId.slice(0, 16),
|
|
67
|
+
cost: cost.finalCost,
|
|
68
|
+
priority: cost.priority,
|
|
69
|
+
});
|
|
70
|
+
return { success: true, cost };
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 计算任务成本
|
|
74
|
+
*/
|
|
75
|
+
calculateTaskCost(task) {
|
|
76
|
+
const complexity = task.estimatedComplexity || 1;
|
|
77
|
+
const baseCost = this.config.baseTaskCost * complexity;
|
|
78
|
+
// 获取折扣
|
|
79
|
+
const discount = this.reputationManager.getPublishDiscount(task.requesterId);
|
|
80
|
+
const finalCost = Math.floor(baseCost * discount);
|
|
81
|
+
// 获取优先级
|
|
82
|
+
const priority = this.reputationManager.getPublishPriority(task.requesterId);
|
|
83
|
+
return {
|
|
84
|
+
baseCost,
|
|
85
|
+
discount,
|
|
86
|
+
finalCost,
|
|
87
|
+
priority,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 分配任务给执行者
|
|
92
|
+
*/
|
|
93
|
+
assignTask(taskId, executorId) {
|
|
94
|
+
const queueItem = this.pendingTasks.get(taskId);
|
|
95
|
+
if (!queueItem)
|
|
96
|
+
return false;
|
|
97
|
+
// 检查执行者权限
|
|
98
|
+
if (!this.reputationManager.hasPermission(executorId, 'execute')) {
|
|
99
|
+
this.logger.warn('Executor lacks permission', { executorId: executorId.slice(0, 16) });
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
this.logger.info('Task assigned', {
|
|
103
|
+
taskId,
|
|
104
|
+
executorId: executorId.slice(0, 16),
|
|
105
|
+
});
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 完成任务并结算
|
|
110
|
+
*/
|
|
111
|
+
completeTask(result) {
|
|
112
|
+
const queueItem = this.pendingTasks.get(result.taskId);
|
|
113
|
+
if (!queueItem)
|
|
114
|
+
return null;
|
|
115
|
+
const task = queueItem.task;
|
|
116
|
+
let reward = {
|
|
117
|
+
executorReward: 0,
|
|
118
|
+
reviewerReward: 0,
|
|
119
|
+
requesterRefund: 0,
|
|
120
|
+
};
|
|
121
|
+
switch (result.status) {
|
|
122
|
+
case 'success':
|
|
123
|
+
// 任务成功
|
|
124
|
+
if (result.reviewResult) {
|
|
125
|
+
reward = this.calculateRewardFromReview(task, result.executorId, result.reviewResult);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
// 无评审结果,使用默认奖励
|
|
129
|
+
reward.executorReward = queueItem.cost * this.config.executorRewardRate;
|
|
130
|
+
}
|
|
131
|
+
// 奖励执行者
|
|
132
|
+
this.reputationManager.recordSuccess(result.executorId, result.taskId, reward.executorReward);
|
|
133
|
+
// 部分返还请求者
|
|
134
|
+
if (reward.requesterRefund > 0) {
|
|
135
|
+
this.reputationManager.recordSuccess(task.requesterId, `refund-${result.taskId}`, reward.requesterRefund);
|
|
136
|
+
}
|
|
137
|
+
this.logger.info('Task completed successfully', {
|
|
138
|
+
taskId: result.taskId,
|
|
139
|
+
executorReward: reward.executorReward,
|
|
140
|
+
requesterRefund: reward.requesterRefund,
|
|
141
|
+
});
|
|
142
|
+
break;
|
|
143
|
+
case 'failure':
|
|
144
|
+
// 任务失败
|
|
145
|
+
this.reputationManager.recordFailure(result.executorId, result.taskId, result.error || 'Task failed');
|
|
146
|
+
this.logger.warn('Task failed', { taskId: result.taskId, error: result.error });
|
|
147
|
+
break;
|
|
148
|
+
case 'timeout':
|
|
149
|
+
// 任务超时
|
|
150
|
+
this.reputationManager.recordFailure(result.executorId, result.taskId, 'Task timeout', -this.config.timeoutPenalty);
|
|
151
|
+
this.logger.warn('Task timeout', { taskId: result.taskId });
|
|
152
|
+
break;
|
|
153
|
+
case 'rejected':
|
|
154
|
+
// 任务被拒绝
|
|
155
|
+
this.reputationManager.recordRejection(result.executorId, result.taskId, result.error || 'Task rejected');
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
// 清理
|
|
159
|
+
this.pendingTasks.delete(result.taskId);
|
|
160
|
+
this.taskQueue = this.taskQueue.filter(item => item.task.taskId !== result.taskId);
|
|
161
|
+
return reward;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* 从评审结果计算奖励
|
|
165
|
+
*/
|
|
166
|
+
calculateRewardFromReview(task, executorId, reviewResult) {
|
|
167
|
+
const { finalWorkload, finalValue } = reviewResult;
|
|
168
|
+
// 执行者奖励 = 工作量 × 价值系数
|
|
169
|
+
const valueFactor = (finalValue + 100) / 200; // 归一化到 0-1
|
|
170
|
+
const executorReward = finalWorkload * valueFactor * this.config.executorRewardRate;
|
|
171
|
+
// 评审者奖励(在 ReviewCommittee 中已处理)
|
|
172
|
+
const reviewerReward = reviewResult.reviews.length * 3;
|
|
173
|
+
// 请求者返还
|
|
174
|
+
let requesterRefund = 0;
|
|
175
|
+
if (finalValue > 0) {
|
|
176
|
+
// 正价值任务,部分返还
|
|
177
|
+
requesterRefund = finalWorkload * 0.1;
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
executorReward,
|
|
181
|
+
reviewerReward,
|
|
182
|
+
requesterRefund,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* 获取下一个待处理任务
|
|
187
|
+
*/
|
|
188
|
+
getNextTask() {
|
|
189
|
+
return this.taskQueue.length > 0 ? this.taskQueue[0] : null;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* 获取队列长度
|
|
193
|
+
*/
|
|
194
|
+
getQueueLength() {
|
|
195
|
+
return this.taskQueue.length;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* 获取待处理任务
|
|
199
|
+
*/
|
|
200
|
+
getPendingTask(taskId) {
|
|
201
|
+
return this.pendingTasks.get(taskId) || null;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* 取消任务(返还部分信誉)
|
|
205
|
+
*/
|
|
206
|
+
cancelTask(taskId) {
|
|
207
|
+
const queueItem = this.pendingTasks.get(taskId);
|
|
208
|
+
if (!queueItem)
|
|
209
|
+
return false;
|
|
210
|
+
// 返还部分信誉
|
|
211
|
+
const refund = queueItem.cost * 0.5;
|
|
212
|
+
this.reputationManager.recordSuccess(queueItem.task.requesterId, `cancel-${taskId}`, refund);
|
|
213
|
+
// 清理
|
|
214
|
+
this.pendingTasks.delete(taskId);
|
|
215
|
+
this.taskQueue = this.taskQueue.filter(item => item.task.taskId !== taskId);
|
|
216
|
+
this.logger.info('Task cancelled', {
|
|
217
|
+
taskId,
|
|
218
|
+
refund,
|
|
219
|
+
});
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* 获取经济统计
|
|
224
|
+
*/
|
|
225
|
+
getEconomyStats() {
|
|
226
|
+
const totalCostDeducted = Array.from(this.pendingTasks.values())
|
|
227
|
+
.filter(item => item.deducted)
|
|
228
|
+
.reduce((sum, item) => sum + item.cost, 0);
|
|
229
|
+
return {
|
|
230
|
+
pendingTasks: this.pendingTasks.size,
|
|
231
|
+
queueLength: this.taskQueue.length,
|
|
232
|
+
totalCostDeducted,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* 清理过期任务
|
|
237
|
+
*/
|
|
238
|
+
cleanupExpiredTasks(maxAge = 24 * 60 * 60 * 1000) {
|
|
239
|
+
const now = Date.now();
|
|
240
|
+
const expired = [];
|
|
241
|
+
for (const [taskId, item] of this.pendingTasks) {
|
|
242
|
+
if (now - item.timestamp > maxAge) {
|
|
243
|
+
expired.push(taskId);
|
|
244
|
+
this.cancelTask(taskId);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (expired.length > 0) {
|
|
248
|
+
this.logger.info('Cleaned up expired tasks', { count: expired.length });
|
|
249
|
+
}
|
|
250
|
+
return expired;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// 默认导出
|
|
254
|
+
export default AutonomousEconomy;
|
|
255
|
+
//# sourceMappingURL=autonomous-economy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autonomous-economy.js","sourceRoot":"","sources":["../../src/core/autonomous-economy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAiF5C,+EAA+E;AAC/E,OAAO;AACP,+EAA+E;AAE/E,MAAM,sBAAsB,GAAkB;IAC5C,YAAY,EAAE,CAAC;IACf,oBAAoB,EAAE,GAAG;IACzB,kBAAkB,EAAE,GAAG;IACvB,kBAAkB,EAAE,GAAG;IACvB,cAAc,EAAE,EAAE;IAClB,gBAAgB,EAAE,CAAC;CACpB,CAAC;AAEF,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAgB;IACtB,iBAAiB,CAAoB;IACrC,eAAe,CAAkB;IACjC,SAAS,GAAwB,EAAE,CAAC;IACpC,YAAY,GAAmC,IAAI,GAAG,EAAE,CAAC;IACzD,MAAM,CAAS;IAEvB,YACE,iBAAoC,EACpC,eAAgC,EAChC,SAAiC,EAAE;QAEnC,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,sBAAsB,EAAE,GAAG,MAAM,EAAE,CAAC;QACvD,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC3C,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAiB;QAC1B,SAAS;QACT,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,CAAC;YACvE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC;QACrE,CAAC;QAED,OAAO;QACP,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAE1C,WAAW;QACX,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1E,IAAI,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,4BAA4B,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;aAChG,CAAC;QACJ,CAAC;QAED,OAAO;QACP,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAClC,IAAI,CAAC,WAAW,EAChB,eAAe,IAAI,CAAC,MAAM,EAAE,EAC5B,sBAAsB,EACtB,CAAC,IAAI,CAAC,SAAS,CAChB,CAAC;QAEF,UAAU;QACV,MAAM,SAAS,GAAsB;YACnC,IAAI;YACJ,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,SAAS;YACpB,QAAQ,EAAE,IAAI;YACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAE9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE;YACjC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YAC1C,IAAI,EAAE,IAAI,CAAC,SAAS;YACpB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,IAAiB;QACjC,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,IAAI,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,UAAU,CAAC;QAEvD,OAAO;QACP,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7E,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;QAElD,QAAQ;QACR,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE7E,OAAO;YACL,QAAQ;YACR,QAAQ;YACR,SAAS;YACT,QAAQ;SACT,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,MAAc,EAAE,UAAkB;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QAE7B,UAAU;QACV,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC;YACjE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YACvF,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE;YAChC,MAAM;YACN,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACpC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,MAA2B;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAE5B,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;QAC5B,IAAI,MAAM,GAAe;YACvB,cAAc,EAAE,CAAC;YACjB,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE,CAAC;SACnB,CAAC;QAEF,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,KAAK,SAAS;gBACZ,OAAO;gBACP,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;oBACxB,MAAM,GAAG,IAAI,CAAC,yBAAyB,CACrC,IAAI,EACJ,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,YAAY,CACpB,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,eAAe;oBACf,MAAM,CAAC,cAAc,GAAG,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;gBAC1E,CAAC;gBAED,QAAQ;gBACR,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAClC,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,cAAc,CACtB,CAAC;gBAEF,UAAU;gBACV,IAAI,MAAM,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;oBAC/B,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAClC,IAAI,CAAC,WAAW,EAChB,UAAU,MAAM,CAAC,MAAM,EAAE,EACzB,MAAM,CAAC,eAAe,CACvB,CAAC;gBACJ,CAAC;gBAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;oBAC9C,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,cAAc,EAAE,MAAM,CAAC,cAAc;oBACrC,eAAe,EAAE,MAAM,CAAC,eAAe;iBACxC,CAAC,CAAC;gBACH,MAAM;YAER,KAAK,SAAS;gBACZ,OAAO;gBACP,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAClC,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,KAAK,IAAI,aAAa,CAC9B,CAAC;gBACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBAChF,MAAM;YAER,KAAK,SAAS;gBACZ,OAAO;gBACP,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAClC,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,MAAM,EACb,cAAc,EACd,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAC5B,CAAC;gBACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC5D,MAAM;YAER,KAAK,UAAU;gBACb,QAAQ;gBACR,IAAI,CAAC,iBAAiB,CAAC,eAAe,CACpC,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,KAAK,IAAI,eAAe,CAChC,CAAC;gBACF,MAAM;QACV,CAAC;QAED,KAAK;QACL,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC;QAEnF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,yBAAyB,CACvB,IAAiB,EACjB,UAAkB,EAClB,YAA0B;QAE1B,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,YAAY,CAAC;QAEnD,qBAAqB;QACrB,MAAM,WAAW,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,WAAW;QACzD,MAAM,cAAc,GAAG,aAAa,GAAG,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;QAEpF,gCAAgC;QAChC,MAAM,cAAc,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAEvD,QAAQ;QACR,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,aAAa;YACb,eAAe,GAAG,aAAa,GAAG,GAAG,CAAC;QACxC,CAAC;QAED,OAAO;YACL,cAAc;YACd,cAAc;YACd,eAAe;SAChB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,MAAc;QAC3B,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,MAAc;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QAE7B,SAAS;QACT,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,GAAG,GAAG,CAAC;QACpC,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAClC,SAAS,CAAC,IAAI,CAAC,WAAW,EAC1B,UAAU,MAAM,EAAE,EAClB,MAAM,CACP,CAAC;QAEF,KAAK;QACL,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QAE5E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE;YACjC,MAAM;YACN,MAAM;SACP,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,eAAe;QAKb,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;aAC7D,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;aAC7B,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAE7C,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI;YACpC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM;YAClC,iBAAiB;SAClB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,SAAiB,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC/C,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,MAAM,EAAE,CAAC;gBAClC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAED,OAAO;AACP,eAAe,iBAAiB,CAAC"}
|