@twinsearth/agent-universe 2.3.6 → 2.5.7
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/LICENSE +21 -0
- package/README.md +411 -0
- package/index.d.ts +5 -208
- package/index.js +5 -69
- package/js/index.d.ts +209 -0
- package/js/index.js +71 -0
- package/js/lib/aca.js +259 -0
- package/js/lib/dht.js +92 -0
- package/js/lib/keychain.js +102 -0
- package/js/lib/market.js +240 -0
- package/js/lib/mcp.js +101 -0
- package/js/lib/models.js +124 -0
- package/js/package-lock.json +16 -0
- package/js/package.json +43 -0
- package/js/test/test.js +224 -0
- package/lib/aca.js +3 -259
- package/lib/dht.js +3 -92
- package/lib/keychain.js +3 -74
- package/lib/market.js +4 -240
- package/lib/mcp.js +3 -101
- package/lib/models.js +3 -124
- package/package.json +14 -10
package/lib/market.js
CHANGED
|
@@ -1,240 +1,4 @@
|
|
|
1
|
-
// lib
|
|
2
|
-
//
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const MIN_STAKE = 100;
|
|
7
|
-
|
|
8
|
-
/** 投标 */
|
|
9
|
-
class Bid {
|
|
10
|
-
constructor(agentId, price) {
|
|
11
|
-
this.agentId = agentId;
|
|
12
|
-
this.price = price;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/** 信誉档案(简化四维) */
|
|
17
|
-
class Reputation {
|
|
18
|
-
constructor() {
|
|
19
|
-
this.quality = 0;
|
|
20
|
-
this.speed = 0;
|
|
21
|
-
this.honesty = 0;
|
|
22
|
-
this.availability = 0;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
overall() {
|
|
26
|
-
return this.quality * 0.35 + this.speed * 0.20 +
|
|
27
|
-
this.honesty * 0.30 + this.availability * 0.15;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* 智能体市场
|
|
33
|
-
*/
|
|
34
|
-
class AgentMarket {
|
|
35
|
-
constructor() {
|
|
36
|
-
this.agents = new Map(); // agentId → { card, stake, reputation }
|
|
37
|
-
this.tasks = new Map(); // taskId → Task
|
|
38
|
-
this.bids = new Map(); // taskId → Bid[]
|
|
39
|
-
this.balances = new Map(); // 账户 → 余额
|
|
40
|
-
this.totalSlashed = 0;
|
|
41
|
-
this.paidTasks = new Set(); // 已结算任务(防重复支付)
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/** 充值 / 质押金进入账户 */
|
|
45
|
-
deposit(account, amount) {
|
|
46
|
-
if (amount < 0) throw new Error('金额不能为负');
|
|
47
|
-
const cur = this.balances.get(account) || 0;
|
|
48
|
-
this.balances.set(account, cur + amount);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
balance(account) {
|
|
52
|
-
return this.balances.get(account) || 0;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/** 质押锁定账户(仍计入系统总余额,只是不可流动) */
|
|
56
|
-
_stakeAccount(agentId) {
|
|
57
|
-
return `__stake__:${agentId}`;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/** 注册 Agent(需质押 ≥ MIN_STAKE) */
|
|
61
|
-
registerAgent(card, stake) {
|
|
62
|
-
if (!card || !card.did) throw new Error('agent_id 不能为空');
|
|
63
|
-
if (!card.name) throw new Error('name 不能为空');
|
|
64
|
-
if (this.agents.has(card.did)) throw new Error('Agent 已存在');
|
|
65
|
-
if (stake < MIN_STAKE) {
|
|
66
|
-
throw new Error(`质押不足,最低 ${MIN_STAKE}`);
|
|
67
|
-
}
|
|
68
|
-
// 质押金从发布者账户转入锁定账户(不退出系统,仍计入总余额)
|
|
69
|
-
const owner = card.did;
|
|
70
|
-
if (this.balance(owner) < stake) {
|
|
71
|
-
throw new Error('质押账户余额不足,请先 deposit');
|
|
72
|
-
}
|
|
73
|
-
const stakeAcc = this._stakeAccount(owner);
|
|
74
|
-
this.balances.set(owner, this.balance(owner) - stake);
|
|
75
|
-
this.balances.set(stakeAcc, this.balance(stakeAcc) + stake);
|
|
76
|
-
|
|
77
|
-
this.agents.set(card.did, {
|
|
78
|
-
card,
|
|
79
|
-
stake,
|
|
80
|
-
reputation: new Reputation(),
|
|
81
|
-
status: 'active',
|
|
82
|
-
});
|
|
83
|
-
return true;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/** 发布任务 */
|
|
87
|
-
publishTask(taskId, goal, budget, requester) {
|
|
88
|
-
if (!goal) throw new Error('goal 不能为空');
|
|
89
|
-
if (budget <= 0) throw new Error('预算必须为正');
|
|
90
|
-
if (this.balance(requester) < budget) {
|
|
91
|
-
throw new Error('需求方余额不足以覆盖预算');
|
|
92
|
-
}
|
|
93
|
-
// 预算锁定
|
|
94
|
-
this.balances.set(requester, this.balance(requester) - budget);
|
|
95
|
-
|
|
96
|
-
const task = new Task(taskId, goal);
|
|
97
|
-
task.transition(TaskStatus.OPEN);
|
|
98
|
-
task.requester = requester;
|
|
99
|
-
task.budget = budget;
|
|
100
|
-
this.tasks.set(taskId, task);
|
|
101
|
-
this.bids.set(taskId, []);
|
|
102
|
-
return task;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/** 提交投标 */
|
|
106
|
-
submitBid(taskId, agentId, price) {
|
|
107
|
-
if (!this.agents.has(agentId)) throw new Error('Agent 未注册');
|
|
108
|
-
const task = this.tasks.get(taskId);
|
|
109
|
-
if (!task || task.status !== TaskStatus.OPEN) {
|
|
110
|
-
throw new Error('任务不在开放状态');
|
|
111
|
-
}
|
|
112
|
-
this.bids.get(taskId).push(new Bid(agentId, price));
|
|
113
|
-
return true;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/** 匹配:选性价比最高(信誉/价格)的投标,平局选价格低者 */
|
|
117
|
-
matchTask(taskId) {
|
|
118
|
-
const bids = this.bids.get(taskId) || [];
|
|
119
|
-
if (bids.length === 0) throw new Error('无投标,无法匹配');
|
|
120
|
-
|
|
121
|
-
let best = bids[0];
|
|
122
|
-
let bestScore = this._bidScore(best);
|
|
123
|
-
for (let i = 1; i < bids.length; i++) {
|
|
124
|
-
const score = this._bidScore(bids[i]);
|
|
125
|
-
if (score > bestScore ||
|
|
126
|
-
(score === bestScore && bids[i].price < best.price)) {
|
|
127
|
-
best = bids[i];
|
|
128
|
-
bestScore = score;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
const task = this.tasks.get(taskId);
|
|
133
|
-
task.assign(best.agentId);
|
|
134
|
-
task.winnerPrice = best.price;
|
|
135
|
-
return best;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
_bidScore(bid) {
|
|
139
|
-
const agent = this.agents.get(bid.agentId);
|
|
140
|
-
const rep = agent.reputation.overall();
|
|
141
|
-
// 性价比 = 信誉 / 价格(价格为 0 时退化为只看信誉)
|
|
142
|
-
return bid.price > 0 ? rep / bid.price : rep;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/** 执行 → 完成 → 验证 */
|
|
146
|
-
completeTask(taskId, passed = true) {
|
|
147
|
-
const task = this.tasks.get(taskId);
|
|
148
|
-
task.start();
|
|
149
|
-
task.complete();
|
|
150
|
-
task.verify(passed);
|
|
151
|
-
return task;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/** 结算(验收通过才支付) */
|
|
155
|
-
settle(taskId) {
|
|
156
|
-
const task = this.tasks.get(taskId);
|
|
157
|
-
|
|
158
|
-
// 结算优先级短路
|
|
159
|
-
if (this.paidTasks.has(taskId)) {
|
|
160
|
-
return { paid: 0, reason: 'already_paid' };
|
|
161
|
-
}
|
|
162
|
-
if (task.status !== TaskStatus.VERIFIED) {
|
|
163
|
-
return { paid: 0, reason: 'rejected' };
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
const price = task.winnerPrice || task.budget;
|
|
167
|
-
const pay = Math.min(price, task.budget);
|
|
168
|
-
|
|
169
|
-
// 从任务锁定预算中支付给执行者(账户间转账,系统总余额不变)
|
|
170
|
-
const assignee = task.assignee;
|
|
171
|
-
this.balances.set(assignee, this.balance(assignee) + pay);
|
|
172
|
-
// 未用完的预算退还需求方
|
|
173
|
-
const refund = task.budget - pay;
|
|
174
|
-
if (refund > 0) {
|
|
175
|
-
this.balances.set(task.requester, this.balance(task.requester) + refund);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
task.settle();
|
|
179
|
-
this.paidTasks.add(taskId);
|
|
180
|
-
return { paid: pay, reason: 'settled' };
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/** 罚没(作恶):从质押锁定账户扣除,罚没部分退出系统(总余额减少) */
|
|
184
|
-
slash(agentId, amount, reason) {
|
|
185
|
-
const entry = this.agents.get(agentId);
|
|
186
|
-
if (!entry) throw new Error('Agent 不存在');
|
|
187
|
-
const actual = Math.min(amount, entry.stake);
|
|
188
|
-
entry.stake -= actual;
|
|
189
|
-
// 从锁定账户实际扣除(退出系统)
|
|
190
|
-
const stakeAcc = this._stakeAccount(agentId);
|
|
191
|
-
this.balances.set(stakeAcc, this.balance(stakeAcc) - actual);
|
|
192
|
-
this.totalSlashed += actual;
|
|
193
|
-
entry.status = entry.stake < MIN_STAKE ? 'suspended' : entry.status;
|
|
194
|
-
return { slashed: actual, reason, remainingStake: entry.stake };
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/** 按技能发现 Agent */
|
|
198
|
-
discoverBySkill(skill) {
|
|
199
|
-
const target = String(skill).toLowerCase();
|
|
200
|
-
const result = [];
|
|
201
|
-
for (const [id, entry] of this.agents) {
|
|
202
|
-
const skills = (entry.card.skills || [])
|
|
203
|
-
.map((s) => String(s).toLowerCase());
|
|
204
|
-
const caps = (entry.card.capabilities || [])
|
|
205
|
-
.map((s) => String(s).toLowerCase());
|
|
206
|
-
if (skills.includes(target) || caps.includes(target)) {
|
|
207
|
-
result.push(entry.card);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
return result;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/** 排行榜(按信誉综合分) */
|
|
214
|
-
leaderboard(limit = 10) {
|
|
215
|
-
const entries = [...this.agents.values()]
|
|
216
|
-
.filter((e) => e.status === 'active')
|
|
217
|
-
.map((e) => ({ agentId: e.card.did, score: e.reputation.overall() }))
|
|
218
|
-
.sort((a, b) => b.score - a.score);
|
|
219
|
-
return entries.slice(0, limit);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* 守恒检查
|
|
224
|
-
* 支付是账户间转账(系统总余额不变),只有罚没减少系统总余额。
|
|
225
|
-
* 总充值(预算/质押)− 总罚没 = 当前全部账户余额之和
|
|
226
|
-
*/
|
|
227
|
-
conservationCheck(totalDeposits) {
|
|
228
|
-
let balanceSum = 0;
|
|
229
|
-
for (const v of this.balances.values()) balanceSum += v;
|
|
230
|
-
const expected = totalDeposits - this.totalSlashed;
|
|
231
|
-
return {
|
|
232
|
-
conserved: Math.abs(balanceSum - expected) < 1e-9,
|
|
233
|
-
balanceSum,
|
|
234
|
-
totalSlashed: this.totalSlashed,
|
|
235
|
-
expected,
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
module.exports = { AgentMarket, Bid, Reputation, MIN_STAKE };
|
|
1
|
+
// 根包 /lib 子路径入口(v2.5.7 补):re-export js/lib,
|
|
2
|
+
// 使根发布包暴露 /lib/market.js 子路径。market.js 为纯逻辑(仅依赖 models,不引 node:crypto),
|
|
3
|
+
// 浏览器 / WKWebView 端只引此模块即可运行市场演示,避开密钥模块。
|
|
4
|
+
module.exports = require('../js/lib/market.js');
|
package/lib/mcp.js
CHANGED
|
@@ -1,101 +1,3 @@
|
|
|
1
|
-
// lib
|
|
2
|
-
//
|
|
3
|
-
|
|
4
|
-
// 完整走 initialize → notifications/initialized → ping / tools/list /
|
|
5
|
-
// tools/call。tools/call 由 daemon 端 MarketMcpBridge 真实路由执行。
|
|
6
|
-
// 使用 Node 18+ 内置 fetch,零额外依赖。
|
|
7
|
-
|
|
8
|
-
const MCP_PROTOCOL_VERSION = '2024-11-05';
|
|
9
|
-
|
|
10
|
-
class McpError extends Error {
|
|
11
|
-
constructor(code, message) {
|
|
12
|
-
super(`[JSON-RPC ${code}] ${message}`);
|
|
13
|
-
this.code = code;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
class McpHttpClient {
|
|
18
|
-
constructor(
|
|
19
|
-
baseUrl = 'http://127.0.0.1:4002',
|
|
20
|
-
path = '/api/v1/mcp',
|
|
21
|
-
timeout = 10000
|
|
22
|
-
) {
|
|
23
|
-
this.endpoint = baseUrl.replace(/\/$/, '') + path;
|
|
24
|
-
this.timeout = timeout;
|
|
25
|
-
this._id = 0;
|
|
26
|
-
this.initialized = false;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
async _post(payload, awaitResponse = true) {
|
|
30
|
-
const ctrl = new AbortController();
|
|
31
|
-
const timer = setTimeout(() => ctrl.abort(), this.timeout);
|
|
32
|
-
let res;
|
|
33
|
-
try {
|
|
34
|
-
res = await fetch(this.endpoint, {
|
|
35
|
-
method: 'POST',
|
|
36
|
-
headers: {
|
|
37
|
-
'Content-Type': 'application/json',
|
|
38
|
-
Accept: 'application/json',
|
|
39
|
-
},
|
|
40
|
-
body: JSON.stringify(payload),
|
|
41
|
-
signal: ctrl.signal,
|
|
42
|
-
});
|
|
43
|
-
} finally {
|
|
44
|
-
clearTimeout(timer);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const text = await res.text();
|
|
48
|
-
if (!awaitResponse || !text) return null;
|
|
49
|
-
const rpc = JSON.parse(text);
|
|
50
|
-
if (rpc.error) {
|
|
51
|
-
throw new McpError(rpc.error.code, rpc.error.message);
|
|
52
|
-
}
|
|
53
|
-
return rpc.result;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
async initialize() {
|
|
57
|
-
const result = await this._post({
|
|
58
|
-
jsonrpc: '2.0',
|
|
59
|
-
id: ++this._id,
|
|
60
|
-
method: 'initialize',
|
|
61
|
-
params: {
|
|
62
|
-
protocolVersion: MCP_PROTOCOL_VERSION,
|
|
63
|
-
clientInfo: { name: 'agent-universe-js', version: '2.3.6' },
|
|
64
|
-
capabilities: {},
|
|
65
|
-
},
|
|
66
|
-
});
|
|
67
|
-
await this._post(
|
|
68
|
-
{ jsonrpc: '2.0', method: 'notifications/initialized' },
|
|
69
|
-
false
|
|
70
|
-
);
|
|
71
|
-
this.initialized = true;
|
|
72
|
-
return result;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
async ping() {
|
|
76
|
-
await this._post({ jsonrpc: '2.0', id: ++this._id, method: 'ping' });
|
|
77
|
-
return true;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
async listTools() {
|
|
81
|
-
if (!this.initialized) await this.initialize();
|
|
82
|
-
const result = await this._post({
|
|
83
|
-
jsonrpc: '2.0',
|
|
84
|
-
id: ++this._id,
|
|
85
|
-
method: 'tools/list',
|
|
86
|
-
});
|
|
87
|
-
return result.tools;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
async callTool(name, args = {}) {
|
|
91
|
-
if (!this.initialized) await this.initialize();
|
|
92
|
-
return this._post({
|
|
93
|
-
jsonrpc: '2.0',
|
|
94
|
-
id: ++this._id,
|
|
95
|
-
method: 'tools/call',
|
|
96
|
-
params: { name, arguments: args },
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
module.exports = { McpHttpClient, McpError, MCP_PROTOCOL_VERSION };
|
|
1
|
+
// 根包 /lib 子路径入口(v2.5.7 补):re-export js/lib,
|
|
2
|
+
// 使根发布包暴露 /lib/mcp.js 子路径(与 js 子包发布结构对齐)。
|
|
3
|
+
module.exports = require('../js/lib/mcp.js');
|
package/lib/models.js
CHANGED
|
@@ -1,124 +1,3 @@
|
|
|
1
|
-
// lib
|
|
2
|
-
//
|
|
3
|
-
|
|
4
|
-
/** 任务状态枚举 */
|
|
5
|
-
const TaskStatus = {
|
|
6
|
-
PENDING: 'pending',
|
|
7
|
-
OPEN: 'open',
|
|
8
|
-
MATCHED: 'matched',
|
|
9
|
-
ASSIGNED: 'assigned',
|
|
10
|
-
RUNNING: 'running',
|
|
11
|
-
VERIFYING: 'verifying',
|
|
12
|
-
COMPLETED: 'completed',
|
|
13
|
-
VERIFIED: 'verified',
|
|
14
|
-
SETTLED: 'settled',
|
|
15
|
-
REWORK: 'rework',
|
|
16
|
-
DISPUTED: 'disputed',
|
|
17
|
-
REJECTED: 'rejected',
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
// 合法状态转移表
|
|
21
|
-
const TRANSITIONS = {
|
|
22
|
-
[TaskStatus.PENDING]: [TaskStatus.OPEN],
|
|
23
|
-
[TaskStatus.OPEN]: [TaskStatus.MATCHED, TaskStatus.ASSIGNED],
|
|
24
|
-
[TaskStatus.MATCHED]: [TaskStatus.ASSIGNED],
|
|
25
|
-
[TaskStatus.ASSIGNED]: [TaskStatus.RUNNING],
|
|
26
|
-
[TaskStatus.RUNNING]: [TaskStatus.COMPLETED, TaskStatus.REWORK],
|
|
27
|
-
[TaskStatus.COMPLETED]: [TaskStatus.VERIFIED, TaskStatus.DISPUTED, TaskStatus.REWORK],
|
|
28
|
-
[TaskStatus.VERIFIED]: [TaskStatus.SETTLED],
|
|
29
|
-
[TaskStatus.REWORK]: [TaskStatus.RUNNING],
|
|
30
|
-
[TaskStatus.DISPUTED]: [TaskStatus.SETTLED, TaskStatus.REJECTED],
|
|
31
|
-
[TaskStatus.SETTLED]: [],
|
|
32
|
-
[TaskStatus.REJECTED]: [],
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
/** 智能体卡片 */
|
|
36
|
-
class AgentCard {
|
|
37
|
-
constructor(did, name) {
|
|
38
|
-
this.did = did;
|
|
39
|
-
this.name = name;
|
|
40
|
-
this.capabilities = [];
|
|
41
|
-
this.skills = [];
|
|
42
|
-
this.version = '1.0.0';
|
|
43
|
-
this.stake = 0;
|
|
44
|
-
this.reputation = 0;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
static new({ did, name }) {
|
|
48
|
-
return new AgentCard(did, name);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
withCapability(cap) {
|
|
52
|
-
if (!this.capabilities.includes(cap)) this.capabilities.push(cap);
|
|
53
|
-
return this;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
withSkill(skill) {
|
|
57
|
-
if (!this.skills.includes(skill)) this.skills.push(skill);
|
|
58
|
-
return this;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
hasCapability(cap) {
|
|
62
|
-
return this.capabilities.includes(cap);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
toJSON() {
|
|
66
|
-
return {
|
|
67
|
-
did: this.did, name: this.name,
|
|
68
|
-
capabilities: this.capabilities, skills: this.skills,
|
|
69
|
-
version: this.version, stake: this.stake, reputation: this.reputation,
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/** 任务与状态机 */
|
|
75
|
-
class Task {
|
|
76
|
-
constructor(taskId, goal) {
|
|
77
|
-
this.taskId = taskId;
|
|
78
|
-
this.goal = goal;
|
|
79
|
-
this.status = TaskStatus.PENDING;
|
|
80
|
-
this.assignee = null;
|
|
81
|
-
this.history = [TaskStatus.PENDING];
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
transition(next) {
|
|
85
|
-
const allowed = TRANSITIONS[this.status] || [];
|
|
86
|
-
if (!allowed.includes(next)) {
|
|
87
|
-
throw new Error(`非法状态转移: ${this.status} → ${next}`);
|
|
88
|
-
}
|
|
89
|
-
this.status = next;
|
|
90
|
-
this.history.push(next);
|
|
91
|
-
return this;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
assign(did) {
|
|
95
|
-
if (this.status === TaskStatus.OPEN) this.transition(TaskStatus.MATCHED);
|
|
96
|
-
if (this.status === TaskStatus.MATCHED) this.transition(TaskStatus.ASSIGNED);
|
|
97
|
-
this.assignee = did;
|
|
98
|
-
return this;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
start() {
|
|
102
|
-
return this.transition(TaskStatus.RUNNING);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
complete() {
|
|
106
|
-
return this.transition(TaskStatus.COMPLETED);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
verify(passed) {
|
|
110
|
-
if (passed) return this.transition(TaskStatus.VERIFIED);
|
|
111
|
-
return this.transition(TaskStatus.DISPUTED);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
settle() {
|
|
115
|
-
if (this.status === TaskStatus.VERIFIED) return this.transition(TaskStatus.SETTLED);
|
|
116
|
-
throw new Error('只有验证通过的任务才能结算');
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
get isTerminal() {
|
|
120
|
-
return this.status === TaskStatus.SETTLED || this.status === TaskStatus.REJECTED;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
module.exports = { AgentCard, Task, TaskStatus, TRANSITIONS };
|
|
1
|
+
// 根包 /lib 子路径入口(v2.5.7 补):re-export js/lib,
|
|
2
|
+
// 使根发布包暴露 /lib/models.js 子路径(与 js 子包发布结构对齐)。
|
|
3
|
+
module.exports = require('../js/lib/models.js');
|
package/package.json
CHANGED
|
@@ -1,18 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@twinsearth/agent-universe",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.7",
|
|
4
4
|
"description": "Agent Universe - 群众化的 AGI 路线,去中心化的智能体共享 & 开源网络。使命:让科技造福全人类!",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
|
-
"
|
|
8
|
+
"start": "node index.js",
|
|
9
|
+
"test": "node js/test/test.js"
|
|
10
|
+
},
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/TwinsEarth/agent-universe.git"
|
|
9
14
|
},
|
|
10
15
|
"keywords": [
|
|
11
16
|
"agi",
|
|
12
|
-
"agent",
|
|
13
17
|
"p2p",
|
|
18
|
+
"agent",
|
|
14
19
|
"decentralized",
|
|
20
|
+
"gsn",
|
|
15
21
|
"swarm",
|
|
22
|
+
"libp2p",
|
|
16
23
|
"dht",
|
|
17
24
|
"mcp",
|
|
18
25
|
"a2a",
|
|
@@ -20,17 +27,13 @@
|
|
|
20
27
|
],
|
|
21
28
|
"author": "TwinsEarth",
|
|
22
29
|
"license": "MIT",
|
|
23
|
-
"repository": {
|
|
24
|
-
"type": "git",
|
|
25
|
-
"url": "git+https://github.com/TwinsEarth/agent-universe.git",
|
|
26
|
-
"directory": "js"
|
|
27
|
-
},
|
|
28
|
-
"homepage": "https://github.com/TwinsEarth/agent-universe#readme",
|
|
29
30
|
"bugs": {
|
|
30
31
|
"url": "https://github.com/TwinsEarth/agent-universe/issues"
|
|
31
32
|
},
|
|
33
|
+
"homepage": "https://github.com/TwinsEarth/agent-universe#readme",
|
|
32
34
|
"publishConfig": {
|
|
33
|
-
"registry": "https://registry.npmjs.org
|
|
35
|
+
"registry": "https://registry.npmjs.org",
|
|
36
|
+
"access": "public"
|
|
34
37
|
},
|
|
35
38
|
"engines": {
|
|
36
39
|
"node": ">=18"
|
|
@@ -38,6 +41,7 @@
|
|
|
38
41
|
"files": [
|
|
39
42
|
"index.js",
|
|
40
43
|
"index.d.ts",
|
|
44
|
+
"js",
|
|
41
45
|
"lib"
|
|
42
46
|
]
|
|
43
47
|
}
|