@bolloon/bolloon-agent 0.6.1 → 0.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +128 -111
- package/dist/agents/gateway-group.js +231 -6
- package/dist/agents/group-autopilot.js +256 -0
- package/dist/agents/pi-sdk-tools.js +302 -0
- package/dist/agents/pi-sdk.js +89 -140
- package/dist/agents/task-group.js +21 -4
- package/dist/cli/log-gate.js +68 -4
- package/dist/cli/mention-data.js +1 -1
- package/dist/cli/model-selector.js +84 -104
- package/dist/cli/setup-wizard.js +2 -10
- package/dist/cli/tui-select.js +99 -10
- package/dist/cli-entry.js +1 -9
- package/dist/electron-build/agents/gateway-group.js +814 -0
- package/dist/electron-build/agents/gateway-group.js.map +1 -0
- package/dist/electron-build/agents/group-autopilot.js +302 -0
- package/dist/electron-build/agents/group-autopilot.js.map +1 -0
- package/dist/electron-build/agents/pi-sdk-tools.js +302 -0
- package/dist/electron-build/agents/pi-sdk-tools.js.map +1 -1
- package/dist/electron-build/agents/pi-sdk.js +88 -139
- package/dist/electron-build/agents/pi-sdk.js.map +1 -1
- package/dist/electron-build/agents/task-group.js +601 -0
- package/dist/electron-build/agents/task-group.js.map +1 -0
- package/dist/electron-build/agents/task-public-text.js +97 -0
- package/dist/electron-build/agents/task-public-text.js.map +1 -0
- package/dist/electron-build/efficode/compress.js +86 -0
- package/dist/electron-build/efficode/compress.js.map +1 -0
- package/dist/electron-build/efficode/crc32.js +44 -0
- package/dist/electron-build/efficode/crc32.js.map +1 -0
- package/dist/electron-build/efficode/did.js +74 -0
- package/dist/electron-build/efficode/did.js.map +1 -0
- package/dist/electron-build/efficode/lz77.js +175 -0
- package/dist/electron-build/efficode/lz77.js.map +1 -0
- package/dist/electron-build/efficode/negotiate.js +233 -0
- package/dist/electron-build/efficode/negotiate.js.map +1 -0
- package/dist/electron-build/efficode/ops.js +96 -0
- package/dist/electron-build/efficode/ops.js.map +1 -0
- package/dist/electron-build/efficode/packet.js +279 -0
- package/dist/electron-build/efficode/packet.js.map +1 -0
- package/dist/electron-build/efficode/types.js +50 -0
- package/dist/electron-build/efficode/types.js.map +1 -0
- package/dist/electron-build/kernel/code-write-gate.js +55 -0
- package/dist/electron-build/kernel/code-write-gate.js.map +1 -0
- package/dist/electron-build/kernel/run-lifecycle.js +23 -0
- package/dist/electron-build/kernel/run-lifecycle.js.map +1 -1
- package/dist/electron-build/kernel/run-resume.js +62 -0
- package/dist/electron-build/kernel/run-resume.js.map +1 -0
- package/dist/electron-build/kernel/session-lifecycle.js +223 -0
- package/dist/electron-build/kernel/session-lifecycle.js.map +1 -0
- package/dist/electron-build/kernel/turn-selfcheck.js +65 -0
- package/dist/electron-build/kernel/turn-selfcheck.js.map +1 -0
- package/dist/electron-build/llm/config-store.js +2 -2
- package/dist/electron-build/llm/config-store.js.map +1 -1
- package/dist/electron-build/llm/model-selection.js +16 -2
- package/dist/electron-build/llm/model-selection.js.map +1 -1
- package/dist/electron-build/llm/pi-ai.js +2 -2
- package/dist/electron-build/llm/pi-ai.js.map +1 -1
- package/dist/electron-build/orbitdb/cid-database.js +98 -19
- package/dist/electron-build/orbitdb/cid-database.js.map +1 -1
- package/dist/electron-build/orbitdb/group-access.js +399 -0
- package/dist/electron-build/orbitdb/group-access.js.map +1 -0
- package/dist/index.js +143 -10
- package/dist/ios/bolloon-web.json +3 -3
- package/dist/ios/sw.js +1 -1
- package/dist/kernel/code-write-gate.js +47 -0
- package/dist/kernel/gate-scan.js +5 -1
- package/dist/kernel/plan-harness.js +3 -2
- package/dist/kernel/roster.js +6 -6
- package/dist/kernel/run-lifecycle.js +21 -0
- package/dist/kernel/run-resume.js +58 -0
- package/dist/kernel/session-lifecycle.js +210 -0
- package/dist/kernel/turn-selfcheck.js +60 -0
- package/dist/llm/config-store.js +2 -2
- package/dist/llm/model-selection.js +16 -2
- package/dist/llm/pi-ai.js +2 -2
- package/dist/orbitdb/cid-database.js +95 -19
- package/dist/web/bolloon-web.json +3 -3
- package/dist/web/sw.js +1 -1
- package/package.json +1 -1
|
@@ -54,7 +54,10 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
54
54
|
})();
|
|
55
55
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
56
56
|
exports.OrbitDBAdapter = exports.OrbitDBStoreUnreachableError = void 0;
|
|
57
|
+
exports.withStageTimeout = withStageTimeout;
|
|
58
|
+
exports.describeOrbitDbFailure = describeOrbitDbFailure;
|
|
57
59
|
exports.contentToCid = contentToCid;
|
|
60
|
+
exports.bytesToCid = bytesToCid;
|
|
58
61
|
exports.getCIDDatabase = getCIDDatabase;
|
|
59
62
|
const cid_1 = require("multiformats/cid");
|
|
60
63
|
const dagCbor = __importStar(require("@ipld/dag-cbor"));
|
|
@@ -82,6 +85,42 @@ const os = __importStar(require("os"));
|
|
|
82
85
|
* 2026-09-24: 原来 `openStoreByAddress` 失败返回 null, 上游 (gateway-group) 把它当"空群",
|
|
83
86
|
* 于是"读不到"被显示成"没有消息"。改成**抛**: 打不开 ≠ 没内容。
|
|
84
87
|
*/
|
|
88
|
+
/**
|
|
89
|
+
* **有界等待** (2026-10-02): 没有它时"打不开"会变成**永远卡住** ——
|
|
90
|
+
* 实测直接调 `createGroup` 的探针 300s 都没返回 (进程被强杀)。
|
|
91
|
+
* 超时抛出的错误**带卡点** (哪一步 · 等了多久), 上游才能给出可行动的话术。
|
|
92
|
+
*/
|
|
93
|
+
async function withStageTimeout(stage, ms, p) {
|
|
94
|
+
let timer;
|
|
95
|
+
try {
|
|
96
|
+
return await Promise.race([
|
|
97
|
+
p,
|
|
98
|
+
new Promise((_, reject) => {
|
|
99
|
+
timer = setTimeout(() => reject(new Error(`[orbitdb] ${stage} 超时 (${ms}ms) —— 这一步没能在预算内完成`)), ms);
|
|
100
|
+
}),
|
|
101
|
+
]);
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
if (timer)
|
|
105
|
+
clearTimeout(timer);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 把底层错误翻成**可行动的原因** (2026-10-02)。
|
|
110
|
+
* 最常见的两种原文都毫无提示: `Database failed to open` 与裸的 `ELOCKED` ——
|
|
111
|
+
* 真身几乎总是"**另一个 bolloon 实例正握着 keystore 单写锁**"(同机同 dataDir 只允许一个进程写)。
|
|
112
|
+
*/
|
|
113
|
+
function describeOrbitDbFailure(err) {
|
|
114
|
+
// 有些底层库抛的是**没有 message 的对象** (只有 code, 如 `{ code: 'ELOCKED' }`) ⇒ 别让 String() 把它变成 `[object Object]`
|
|
115
|
+
const raw = String(err?.message ?? err?.code ?? err ?? '');
|
|
116
|
+
if (/Resource temporarily unavailable|ELOCKED|lock .*LOCK|Database failed to open/i.test(raw)) {
|
|
117
|
+
return 'OrbitDB 库被另一个进程占着 (同机同一 dataDir 只允许一个进程写; 常见原因: 另有一个 bolloon 实例在跑)。'
|
|
118
|
+
+ ' 处理: 退出其它实例, 或设 `BOLLOON_HOME=<独立目录>` 跑一个隔离实例。原始错误: ' + raw.slice(0, 160);
|
|
119
|
+
}
|
|
120
|
+
if (/超时 \(\d+ms\)/.test(raw))
|
|
121
|
+
return raw.slice(0, 220);
|
|
122
|
+
return raw.slice(0, 200) || '未知原因';
|
|
123
|
+
}
|
|
85
124
|
class OrbitDBStoreUnreachableError extends Error {
|
|
86
125
|
address;
|
|
87
126
|
cause;
|
|
@@ -104,6 +143,11 @@ async function contentToCid(obj) {
|
|
|
104
143
|
const hash = await sha2_1.sha256.digest(bytes);
|
|
105
144
|
return cid_1.CID.createV1(0x71, hash).toString();
|
|
106
145
|
}
|
|
146
|
+
/** 2026-10-02: 原始字节 → CID (raw 0x55 + sha256, 与 `contentToCid` 同一套内容寻址口径) */
|
|
147
|
+
async function bytesToCid(bytes) {
|
|
148
|
+
const hash = await sha2_1.sha256.digest(bytes);
|
|
149
|
+
return cid_1.CID.createV1(0x55, hash).toString();
|
|
150
|
+
}
|
|
107
151
|
const home = () => process.env.HOME || os.homedir() || '/tmp';
|
|
108
152
|
/**
|
|
109
153
|
* OrbitDB 身份在 keystore 里的槽名 (2026-09-24)。
|
|
@@ -134,7 +178,13 @@ class OrbitDBAdapter {
|
|
|
134
178
|
db = null;
|
|
135
179
|
_orbitdb = null;
|
|
136
180
|
orbitdb;
|
|
137
|
-
|
|
181
|
+
/**
|
|
182
|
+
* 2026-10-02: **必须认 `BOLLOON_HOME`** —— 原来只走 `home()` (≈ `$HOME`),于是
|
|
183
|
+
* `BOLLOON_HOME=/tmp/x` 的"隔离运行"其实还在开**真实** `~/.bolloon/orbitdb/…`
|
|
184
|
+
* (实测: 隔离 HOME 下报的锁路径是 `/Users/apple/.bolloon/…`) ⇒ 隔离失效、测试会写真实库。
|
|
185
|
+
* 与仓里其它模块同一口径: `${BOLLOON_HOME:-~/.bolloon}`。
|
|
186
|
+
*/
|
|
187
|
+
constructor(dataDir = path.join(process.env.BOLLOON_HOME || path.join(home(), '.bolloon'), 'orbitdb')) {
|
|
138
188
|
this.dataDir = dataDir;
|
|
139
189
|
}
|
|
140
190
|
/** 落盘位置 (未初始化时 null; 诊断/验收用) */
|
|
@@ -200,24 +250,32 @@ class OrbitDBAdapter {
|
|
|
200
250
|
async ensure() {
|
|
201
251
|
if (this.db)
|
|
202
252
|
return;
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
253
|
+
// 2026-10-02: 默认 20s/步 —— 可调; 目的是"卡住"必须变成**可判定的失败**, 不许无声挂死
|
|
254
|
+
const stageMs = Number(process.env.BOLLOON_ORBITDB_STAGE_TIMEOUT_MS || 20_000);
|
|
255
|
+
try {
|
|
256
|
+
this.node = await withStageTimeout('启动 IPFS/helia 节点', stageMs, (0, ipfs_node_js_1.createBolloonIpfs)(path.join(this.dataDir, 'ipfs')));
|
|
257
|
+
// 2026-09-24: 身份必须**跨进程稳定**。不给 id 时 @orbitdb/core 用 createId()
|
|
258
|
+
// (32 位随机串) 当 keystore 槽名 (src/orbitdb.js:43 `id = id || await createId()`
|
|
259
|
+
// → :61 `createIdentity({ id })`) → 每个进程一对新密钥 → 新身份 → 写自己的 store
|
|
260
|
+
// 会被访问控制拒掉 ("Key … is not allowed to write to the log")。
|
|
261
|
+
// 给固定槽名后, 密钥从 <dataDir>/stores/keystore 读出复用 → 同 dataDir 同身份。
|
|
262
|
+
// 类型注: `id` 是 @orbitdb/core 的真选项 (src/orbitdb.js:33), 但 TS7 从 JS 推断出的
|
|
263
|
+
// 参数类型漏了它 → 显式取 Parameters<typeof createOrbitDB>[0] 再补 { id }
|
|
264
|
+
// (不裸 any 掉整个入参)。
|
|
265
|
+
const init = {
|
|
266
|
+
ipfs: this.node.helia,
|
|
267
|
+
directory: path.join(this.dataDir, 'stores'),
|
|
268
|
+
id: ORBITDB_IDENTITY_ID,
|
|
269
|
+
};
|
|
270
|
+
this._orbitdb = await withStageTimeout('创建 OrbitDB 实例 (含 keystore)', stageMs, (0, core_1.createOrbitDB)(init));
|
|
271
|
+
this.db = await withStageTimeout('打开 CID 库', stageMs, this._orbitdb.open('bolloon-cid-store', { type: 'keyvalue' }));
|
|
272
|
+
// 共享底层实例 (只读暴露)
|
|
273
|
+
this.orbitdb = this._orbitdb;
|
|
274
|
+
}
|
|
275
|
+
catch (e) {
|
|
276
|
+
// 打不开 ⇒ 一句**可行动**的话 (锁被谁占着 / 卡在哪一步), 不再让 "Database failed to open" 误导人
|
|
277
|
+
throw new Error(describeOrbitDbFailure(e), { cause: e });
|
|
278
|
+
}
|
|
221
279
|
}
|
|
222
280
|
async save(data) {
|
|
223
281
|
await this.ensure();
|
|
@@ -302,6 +360,25 @@ class OrbitDBAdapter {
|
|
|
302
360
|
})
|
|
303
361
|
.sort((a, b) => a.timestamp - b.timestamp);
|
|
304
362
|
}
|
|
363
|
+
async putBytes(bytes) {
|
|
364
|
+
await this.ensure();
|
|
365
|
+
const cid = await bytesToCid(bytes);
|
|
366
|
+
await this.node.helia.blockstore.put(cid_1.CID.parse(cid), bytes);
|
|
367
|
+
return { cid, bytes: bytes.length };
|
|
368
|
+
}
|
|
369
|
+
async getBytes(cid) {
|
|
370
|
+
await this.ensure();
|
|
371
|
+
try {
|
|
372
|
+
const stream = this.node.helia.blockstore.get(cid_1.CID.parse(cid));
|
|
373
|
+
let out = new Uint8Array(0);
|
|
374
|
+
for await (const chunk of stream)
|
|
375
|
+
out = (0, concat_1.concat)([out, chunk]);
|
|
376
|
+
return out;
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
return null;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
305
382
|
async share(cid) {
|
|
306
383
|
await this.ensure();
|
|
307
384
|
const rec = await this.load(cid);
|
|
@@ -322,6 +399,8 @@ class OrbitDBAdapter {
|
|
|
322
399
|
// events store 的 all() 返回 { hash, payload } — 统一成 { key, value }
|
|
323
400
|
return entries.map(e => ({
|
|
324
401
|
key: String(e.key ?? e.hash ?? ''),
|
|
402
|
+
// 2026-10-02: 条目自带的 hash/id **透出来** —— 回复某条 / 建分支要的锚点 (拿不到才留空, 不假造)
|
|
403
|
+
id: String((e.hash ?? e.id ?? e.payload?.key ?? '') || ''),
|
|
325
404
|
value: e.payload !== undefined ? e.payload : e.value,
|
|
326
405
|
}));
|
|
327
406
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cid-database.js","sourceRoot":"","sources":["../../../src/orbitdb/cid-database.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cid-database.js","sourceRoot":"","sources":["../../../src/orbitdb/cid-database.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,0CAAuC;AACvC,MAAY,OAAO,2CAAuB;AAC1C,mDAAkD;AAClD,+CAA2D;AAC3D,wCAA2E;AAC3E,MAAY,aAAa,0CAAsB;AAE/C;;;;;;;;;GASG;AACH,MAAM,oBAAoB,GAAI,aAE5B,CAAC,oBAAoB,CAAC;AACxB,iDAAqE;AACrE,MAAY,IAAI,iCAAa;AAC7B,MAAY,EAAE,+BAAW;AAIzB;;;;;GAKG;AACH;;;;GAIG;AACI,KAAK,2BAA8B,KAAa,EAAE,EAAU,EAAE,CAAa;IAChF,IAAI,KAAgD,CAAC;IACrD,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACxB,CAAC;YACD,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAC/B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,KAAK,QAAQ,EAAE,oBAAoB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpG,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,gCAAuC,GAAY;IACjD,qGAAqG;IACrG,MAAM,GAAG,GAAG,MAAM,CAAE,GAAa,EAAE,OAAO,IAAK,GAA0B,EAAE,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;IAC9F,IAAI,+EAA+E,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9F,OAAO,qEAAqE;cACxE,sDAAsD,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC;AACrC,CAAC;AAED,kCAA0C,SAAQ,KAAK;IAEhC,OAAO;IAAmB,KAAK;IAAqB,OAAO;IADvE,IAAI,GAAG,mBAAmB,CAAC;IACpC,YAAqB,OAAe,EAAW,KAAe,EAAW,OAAgB;QACvF,MAAM,GAAG,GAAG,MAAM,CAAE,KAAe,EAAE,OAAO,IAAI,KAAK,IAAI,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/E,KAAK,CAAC,cAAc,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC;uBAFrB,OAAO;qBAAmB,KAAK;uBAAqB,OAAO;QAG9E,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;IAC7C,CAAC;CACF;;AAwFD,oFAAoF;AAC7E,KAAK,uBAAuB,GAAY;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAY,CAAC,CAAC,kBAAkB;IAC9E,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,aAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO,SAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC7C,CAAC;AAED,6EAA6E;AACtE,KAAK,qBAAqB,KAA8B;IAC7D,MAAM,IAAI,GAAG,MAAM,aAAM,CAAC,MAAM,CAAC,KAAc,CAAC,CAAC;IACjD,OAAO,SAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,IAAI,GAAG,GAAW,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,MAAM,CAAC;AAEtE;;;;;GAKG;AACH,MAAM,mBAAmB,GAAG,SAAS,CAAC;AAEtC;;;;;;;;GAQG;AACH,SAAS,sBAAsB,CAAC,IAAiD;IAC/E,MAAM,KAAK,GAAG,IAAI,EAAE,gBAAgB,EAAE,KAAK,CAAC;IAC5C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3G,CAAC;AAED;;GAEG;AACH;IAYuB,OAAO;IAXpB,IAAI,GAAuB,IAAI,CAAC;IAChC,EAAE,GAAoB,IAAI,CAAC;IAC3B,QAAQ,GAAmB,IAAI,CAAC;IAC/B,OAAO,CAAsB;IAEtC;;;;;OAKG;IACH,YAAqB,OAAO,GAAW,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC;uBAAjG,OAAO;IAA6F,CAAC;IAE1H,gCAAgC;IAChC,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC;IAClC,CAAC;IAED,iEAAiE;IACjE,+DAA+D;IAC/D,2CAA2C;IAE3C,sCAAsC;IACtC,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC;IACnC,CAAC;IAED,0CAA0C;IAC1C,WAAW;QACT,MAAM,CAAC,GAAI,IAAI,CAAC,IAAI,EAAE,KAAa,EAAE,MAAM,CAAC;QAC5C,IAAI,CAAC;YACH,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,eAAe;QACb,MAAM,CAAC,GAAI,IAAI,CAAC,IAAI,EAAE,KAAa,EAAE,MAAM,CAAC;QAC5C,IAAI,CAAC;YACH,OAAO,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;gBAClD,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;gBAC7D,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;gBAC3C,OAAO,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,iBAAiB,CAAC,KAAa;QAC7B,MAAM,EAAE,GAAI,IAAI,CAAC,IAAI,EAAE,KAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC;QAC/D,IAAI,CAAC;YACH,OAAO,CAAC,EAAE,EAAE,cAAc,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,EAAE,SAAS,EAAE,GAAG,wDAAa,yBAAyB,GAAC,CAAC;QAC9D,MAAO,IAAI,CAAC,IAAK,CAAC,KAAa,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,wDAAwD;IAChD,KAAK,CAAC,MAAM;QAClB,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO;QACpB,4DAA4D;QAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gCAAgC,IAAI,MAAM,CAAC,CAAC;QAC/E,IAAI,CAAC;YACL,IAAI,CAAC,IAAI,GAAG,MAAM,gBAAgB,CAAC,kBAAkB,EAAE,OAAO,EAAE,IAAA,gCAAiB,EAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YACpH,+DAA+D;YAC/D,2EAA2E;YAC3E,iEAAiE;YACjE,yDAAyD;YACzD,8DAA8D;YAC9D,sEAAsE;YACtE,8DAA8D;YAC9D,kBAAkB;YAClB,MAAM,IAAI,GAA0D;gBAClE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAY;gBAC5B,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;gBAC5C,EAAE,EAAE,mBAAmB;aACxB,CAAC;YACF,IAAI,CAAC,QAAQ,GAAG,MAAM,gBAAgB,CAAC,4BAA4B,EAAE,OAAO,EAAE,IAAA,oBAAa,EAAC,IAAI,CAAC,CAAC,CAAC;YACnG,IAAI,CAAC,EAAE,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;YACrH,gBAAgB;YACf,IAAY,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;QACtC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,uEAAuE;YACvE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAU,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAiB;QAC1B,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,gEAAgE;QAChE,MAAM,MAAM,GAAc;YACxB,EAAE,EAAE,MAAM,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;YACzF,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;YAC7B,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,IAAI,CAAC,EAAG,CAAC,OAAO;SAC5B,CAAC;QACF,gEAAgE;QAChE,MAAM,IAAI,CAAC,EAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAClE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,GAAG;YAAE,OAAO,GAA2B,CAAC;QAC5C,kCAAkC;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAK,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,SAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAyC,CAAC;YACvG,IAAI,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAA4B,CAAC;YACzD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM;gBAAE,KAAK,GAAG,IAAA,eAAW,EAAC,CAAC,KAAK,EAAE,KAAgC,CAAC,CAA4B,CAAC;YAC5H,OAAO,OAAO,CAAC,MAAM,CAAC,KAAY,CAAyB,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,OAAgB,EAAE,QAAkC;QAC5E,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,MAAM,GAAc;YACxB,EAAE,EAAE,MAAM,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;YACzE,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO;YACP,QAAQ,EAAE,QAAQ,IAAI,GAAG,CAAC,QAAQ;YAClC,OAAO,EAAE,GAAG,CAAC,OAAO,GAAG,CAAC;YACxB,QAAQ,EAAE,GAAG,CAAC,EAAE;YAChB,SAAS,EAAE,IAAI,CAAC,EAAG,CAAC,OAAO;SAC5B,CAAC;QACF,MAAM,IAAI,CAAC,EAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAClE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW;QACvB,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,KAAK,GAAgB,EAAE,CAAC;QAC9B,IAAI,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,uBAAuB;QACvB,MAAM,GAAG,GAAgB,EAAE,CAAC;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,GAAG,IAAI,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACd,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5D,CAAC;QACD,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAmD;QAC5D,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,sDAAsD;QACtD,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,EAAG,CAAC,GAAG,EAAE,CAAoE,CAAC;QACtG,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAA6B,CAAC,CAAC;QAC9D,OAAO,OAAO;aACX,MAAM,CAAC,CAAC,CAAC,EAAE;YACV,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC9C,IAAI,MAAM,EAAE,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO;gBAAE,OAAO,KAAK,CAAC;YAClE,IAAI,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YACzD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAA8B;QAC3C,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,IAAI,CAAC,IAAK,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,SAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAc,CAAC,CAAC;QACtE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAK,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,SAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAyC,CAAC;YACvG,IAAI,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,CAA4B,CAAC;YACvD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM;gBAAE,GAAG,GAAG,IAAA,eAAW,EAAC,CAAC,GAAG,EAAE,KAAgC,CAAC,CAA4B,CAAC;YACxH,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAW;QACrB,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;QAC3C,+CAA+C;QAC/C,MAAM,IAAI,CAAC,IAAK,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,SAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9E,OAAO,iBAAiB,GAAG,CAAC,EAAE,EAAE,CAAC;IACnC,CAAC;IAED,wDAAwD;IAChD,SAAS,CAAC,GAAQ;QACxB,OAAO;YACL,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrF,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,GAAG,EAAE,KAAK,IAAI,EAAE;gBACd,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,CAAmC,CAAC;gBACpE,iEAAiE;gBACjE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACvB,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;oBAClC,oEAAoE;oBACpE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,IAAK,CAAC,CAAC,OAAyC,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;oBAC7F,KAAK,EAAE,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;iBACrD,CAAC,CAAC,CAAC;YACN,CAAC;YACD,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAY,CAAC,CAAC,CAAC;YAC/D,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE;gBACf,MAAM,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;oBAAC,EAAE,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzD,GAAG,CAAC,MAAc,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACrC,GAAG,CAAC,MAAc,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACtC,GAAG,CAAC,MAAc,EAAE,EAAE,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBAC3C,OAAO,GAAG,EAAE;oBACV,IAAI,CAAC;wBACF,GAAG,CAAC,MAAc,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;wBACtC,GAAG,CAAC,MAAc,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;wBACvC,GAAG,CAAC,MAAc,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;oBAC9C,CAAC;oBAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACtB,CAAC,CAAC;YACJ,CAAC;SACF,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,IAAI,GAA0B,UAAU,EAAE,IAAiD;QACvH,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,OAAO,GAAQ,EAAE,IAAI,EAAE,GAAG,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/D,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,QAAS,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAQ,CAAC;QAC9D,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,kBAAkB,CAAC,OAAe,EAAE,IAAI,GAA0B,UAAU,EAAE,IAAoE;QACtJ,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,OAAO,GAAQ,EAAE,IAAI,EAAE,GAAG,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/D,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,QAAS,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAQ,CAAC;YACjE,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,+EAA+E;YAC/E,MAAM,IAAI,4BAA4B,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC;YAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC;YAAC,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACf,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;;AAED,2BAA2B;AAC3B,IAAI,QAAQ,GAA0B,IAAI,CAAC;AAC3C;IACE,IAAI,CAAC,QAAQ;QAAE,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;IAC/C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* group-access.ts — 群写入权限的 **DID 门控** (2026-10-01, P1)
|
|
4
|
+
* ==========================================================================
|
|
5
|
+
* 目标: 把群 (OrbitDB events store) 的写入权限从 `write:['*']` 收紧成"DID 白名单":
|
|
6
|
+
* 建群者 + **显式加入**的成员能写; 其余人**写不进 log**; 成员变更本身是一条
|
|
7
|
+
* **可离线验签**的群事件 (成员自签 + 管理员签 ⇒ 不是某个中心节点单方面说了算)。
|
|
8
|
+
*
|
|
9
|
+
* ── 先读源码再动手 (@orbitdb/core 4.0.0, node_modules 里就是权威) ───────────
|
|
10
|
+
*
|
|
11
|
+
* ① 真正的写闸门 = store manifest 里的 access controller (AC)。
|
|
12
|
+
* `IPFSAccessController.canAppend` 逐条判:
|
|
13
|
+
* `write.includes(entry 写者的 identity.id) || write.includes('*')`
|
|
14
|
+
* —— `access-controllers/ipfs.js:78-90`。
|
|
15
|
+
* ⚠️ 比较的是 **OrbitDB 身份 id**, 不是 DID。而 OrbitDB 身份 id =
|
|
16
|
+
* keystore 里该身份的**压缩 secp256k1 公钥 hex** (66 位, 02/03 开头):
|
|
17
|
+
* `key-store.js:213 generateKeyPair('secp256k1')` +
|
|
18
|
+
* `identities/providers/publickey.js:55 base16(publicKey.raw)`。
|
|
19
|
+
* **不是 Ed25519** ⇒ DID 与写身份是**两把钥匙**, 必须显式绑定。
|
|
20
|
+
* 本模块的成员事件就是那张绑定凭证 (`member.did ↔ member.orbitdbId`)。
|
|
21
|
+
*
|
|
22
|
+
* ② 白名单能否在**既有 store** 上增量更新? —— 对 IPFS 型 AC: **不能**。
|
|
23
|
+
* `write` 被打进一个 dag-cbor 的 ACL manifest, 该 ACL 的 **CID** 写进 store
|
|
24
|
+
* manifest 的 `accessController` 字段, 而 store manifest 的 **CID 就是 store 地址**:
|
|
25
|
+
* `access-controllers/ipfs.js:16-25, 62-69` → `manifest-store.js:38-56`
|
|
26
|
+
* → `orbitdb.js:125-134,140-142`。
|
|
27
|
+
* 改白名单 ⇒ 新 ACL 块 ⇒ 新 manifest ⇒ **新地址**。
|
|
28
|
+
* 整个包对 IPFS 型 AC **没有任何"就地改 AC"的 API**
|
|
29
|
+
* (`ipfs.js` 只返回 `{type, address, write, canAppend}`, 没有 grant/revoke/mutate)。
|
|
30
|
+
* ⇒ **白名单变更 = 重建 store (换地址)**; 老地址的写集合永远不变 (历史不可追认)。
|
|
31
|
+
* 代价见 `aclChangePlan()`。
|
|
32
|
+
*
|
|
33
|
+
* ③ 4.0.0 另有一个 `OrbitDBAccessController` (type `'orbitdb'`), 它把白名单搬进一个
|
|
34
|
+
* **独立的 keyvalue db** 并提供 `grant`/`revoke` (`access-controllers/orbitdb.js:152-174`),
|
|
35
|
+
* 所以**那一层是**可增量的。但:
|
|
36
|
+
* · 那个 kv db 自己的**根写名单仍冻结**在它的 IPFS 型 manifest 里 —— 只有根名单里的人
|
|
37
|
+
* 能 grant/revoke (`OrbitDBAccessController({write})` 内部就是这么建的, 见 orbitdb.js:40);
|
|
38
|
+
* · 增量要生效, 必须先把这个 **AC kv db 复制到对端** (等于多同步一个 store);
|
|
39
|
+
* · 2026-10-01 本机真两节点实测 (见报告): 对一个**开 store 前就已 grant** 的新节点,
|
|
40
|
+
* 动态白名单能拿到; 但对一个**已经开着 store** 的节点, 180s 内**没看到** live grant
|
|
41
|
+
* 传播到位。⇒ 不当默认, 只作为可选增量通道记录在此, 不冒充"已实现"。
|
|
42
|
+
* ⇒ 默认策略 = ① 的静态白名单 + ②的重建; 语义确定, 不留"白名单到底传没传过去"的悬念。
|
|
43
|
+
*
|
|
44
|
+
* ── 诚实边界 ──────────────────────────────────────────────────────────────
|
|
45
|
+
* · 本模块**只做**身份/白名单/成员事件的构造与验证 + ACL 选项生成;
|
|
46
|
+
* 它不自己开 store、不自己起节点 (由 gateway-group / 验收门调)。
|
|
47
|
+
* · `verifyMembershipEvent` 是**真** Ed25519 验签 (`ed25519Verify`), 不是摘要比对。
|
|
48
|
+
* · 白名单里的东西是 **OrbitDB 身份 id**, 不是 DID 字符串 —— 别把 DID 塞进 `write`,
|
|
49
|
+
* `canAppend` 永远匹配不上 (这会静默变成"谁都写不了")。
|
|
50
|
+
*/
|
|
51
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
|
+
exports.ACL_INPLACE_UPDATE = exports.DID_KEY_RE = exports.ED25519_PUBKEY_HEX_RE = exports.ORBITDB_IDENTITY_ID_RE = exports.GROUP_MEMBERSHIP_KIND = exports.GROUP_MEMBERSHIP_PROTOCOL = void 0;
|
|
53
|
+
exports.buildMembershipStatement = buildMembershipStatement;
|
|
54
|
+
exports.membershipSigningPayload = membershipSigningPayload;
|
|
55
|
+
exports.statementOfEvent = statementOfEvent;
|
|
56
|
+
exports.signAsMember = signAsMember;
|
|
57
|
+
exports.signAsAdmin = signAsAdmin;
|
|
58
|
+
exports.assembleMembershipEvent = assembleMembershipEvent;
|
|
59
|
+
exports.createMembershipEvent = createMembershipEvent;
|
|
60
|
+
exports.membershipEntryOf = membershipEntryOf;
|
|
61
|
+
exports.verifyMembershipEvent = verifyMembershipEvent;
|
|
62
|
+
exports.writeListAllows = writeListAllows;
|
|
63
|
+
exports.normalizeWriteList = normalizeWriteList;
|
|
64
|
+
exports.applyMembershipEvents = applyMembershipEvents;
|
|
65
|
+
exports.groupAccessOptions = groupAccessOptions;
|
|
66
|
+
exports.aclChangePlan = aclChangePlan;
|
|
67
|
+
const paid_info_protocol_js_1 = require("../agents/x402/paid-info-protocol.js");
|
|
68
|
+
const address_binding_js_1 = require("../agents/identity/address-binding.js");
|
|
69
|
+
// ─────────────────────────────────────────────────────────── 常量 (冻结)
|
|
70
|
+
/** 成员事件协议名 (冻结; 签名对象里的 `protocol`) */
|
|
71
|
+
exports.GROUP_MEMBERSHIP_PROTOCOL = 'bolloon-group-membership/1';
|
|
72
|
+
/** 落在群 store 里的条目种类标记 (带这个 kind 的条目**不是**聊天消息) */
|
|
73
|
+
exports.GROUP_MEMBERSHIP_KIND = 'bolloon.group.membership';
|
|
74
|
+
/** OrbitDB 写身份 id 的形状: 压缩 secp256k1 公钥 hex = 33B = 66 位, 02/03 开头 */
|
|
75
|
+
exports.ORBITDB_IDENTITY_ID_RE = /^0[23][0-9a-f]{64}$/;
|
|
76
|
+
/** Ed25519 公钥 (raw 32B) hex 形状 */
|
|
77
|
+
exports.ED25519_PUBKEY_HEX_RE = /^[0-9a-f]{64}$/;
|
|
78
|
+
/** `did:key:z…` 形状 (与 address-binding 的 BINDING_DID_RE 同构) */
|
|
79
|
+
exports.DID_KEY_RE = /^did:key:z[1-9A-HJ-NP-Za-km-z]{20,}$/;
|
|
80
|
+
// ─────────────────────────────────────────────────────────── 形状校验
|
|
81
|
+
function assertMemberRef(m, where) {
|
|
82
|
+
const r = m;
|
|
83
|
+
if (!r || typeof r !== 'object')
|
|
84
|
+
throw new Error(`${where}: 成员对象缺失`);
|
|
85
|
+
if (!exports.DID_KEY_RE.test(String(r.did || ''))) {
|
|
86
|
+
throw new Error(`${where}: did 形状非法 (要 did:key:z…), 实得 ${String(r.did || '').slice(0, 40)}`);
|
|
87
|
+
}
|
|
88
|
+
if (!exports.ED25519_PUBKEY_HEX_RE.test(String(r.publicKeyHex || ''))) {
|
|
89
|
+
throw new Error(`${where}: publicKeyHex 必须是 64 位小写 hex`);
|
|
90
|
+
}
|
|
91
|
+
if (!exports.ORBITDB_IDENTITY_ID_RE.test(String(r.orbitdbId || ''))) {
|
|
92
|
+
throw new Error(`${where}: orbitdbId 形状非法 (要 66 位压缩 secp256k1 公钥 hex, 02/03 开头), 实得 ${String(r.orbitdbId || '').slice(0, 24)}`);
|
|
93
|
+
}
|
|
94
|
+
const derived = (0, address_binding_js_1.didFromEd25519PublicKey)(r.publicKeyHex);
|
|
95
|
+
if (derived !== r.did) {
|
|
96
|
+
throw new Error(`${where}: did 与 publicKeyHex 不是同一把钥匙 (期望 ${derived.slice(0, 24)}…, 实得 ${r.did.slice(0, 24)}…)`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 造一条成员变更声明 (纯函数, 不签名)。
|
|
101
|
+
* 校验: op/ts/group 形状 + 成员与发起人的 (did ↔ 公钥) 一致 + orbitdbId 形状。
|
|
102
|
+
*/
|
|
103
|
+
function buildMembershipStatement(input) {
|
|
104
|
+
const group = String(input.group || '').trim();
|
|
105
|
+
if (!group.startsWith('/orbitdb/'))
|
|
106
|
+
throw new Error(`group 必须是 /orbitdb/… 地址, 实得 ${group.slice(0, 40)}`);
|
|
107
|
+
if (input.op !== 'add' && input.op !== 'remove')
|
|
108
|
+
throw new Error(`op 必须是 add|remove, 实得 ${String(input.op)}`);
|
|
109
|
+
assertMemberRef(input.member, 'member');
|
|
110
|
+
if (!input.by || typeof input.by !== 'object')
|
|
111
|
+
throw new Error('by 缺失');
|
|
112
|
+
if (!exports.DID_KEY_RE.test(String(input.by.did || '')))
|
|
113
|
+
throw new Error('by.did 形状非法 (要 did:key:z…)');
|
|
114
|
+
if (!exports.ED25519_PUBKEY_HEX_RE.test(String(input.by.publicKeyHex || '')))
|
|
115
|
+
throw new Error('by.publicKeyHex 必须是 64 位小写 hex');
|
|
116
|
+
const derivedBy = (0, address_binding_js_1.didFromEd25519PublicKey)(input.by.publicKeyHex);
|
|
117
|
+
if (derivedBy !== input.by.did)
|
|
118
|
+
throw new Error('by.did 与 by.publicKeyHex 不是同一把钥匙');
|
|
119
|
+
const ts = input.ts ?? Date.now();
|
|
120
|
+
if (!Number.isInteger(ts) || ts <= 0)
|
|
121
|
+
throw new Error(`ts 必须是正整数毫秒, 实得 ${String(input.ts)}`);
|
|
122
|
+
return {
|
|
123
|
+
protocol: exports.GROUP_MEMBERSHIP_PROTOCOL,
|
|
124
|
+
group,
|
|
125
|
+
op: input.op,
|
|
126
|
+
member: { did: input.member.did, publicKeyHex: input.member.publicKeyHex, orbitdbId: input.member.orbitdbId },
|
|
127
|
+
by: { did: input.by.did, publicKeyHex: input.by.publicKeyHex },
|
|
128
|
+
ts,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/** 签名对象 = `canonicalize(statement)` 的字节串 (键递归排序, 无空格) */
|
|
132
|
+
function membershipSigningPayload(stmt) {
|
|
133
|
+
return (0, paid_info_protocol_js_1.canonicalize)(stmt);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* 从事件里**剥出正文** (丢掉 memberSig/adminSig) —— 验签必须对正文, 不能对整条事件:
|
|
137
|
+
* 签名在事件里, 拿整条事件去 canonicalize 会把签名本身搅进被签字节串, 自己签自己, 永远验不过。
|
|
138
|
+
*/
|
|
139
|
+
function statementOfEvent(ev) {
|
|
140
|
+
return {
|
|
141
|
+
protocol: ev.protocol,
|
|
142
|
+
group: ev.group,
|
|
143
|
+
op: ev.op,
|
|
144
|
+
member: ev.member,
|
|
145
|
+
by: ev.by,
|
|
146
|
+
ts: ev.ts,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/** 成员侧签名 (证明"我认领这个 orbitdbId") */
|
|
150
|
+
async function signAsMember(stmt, memberPrivateKeyHex) {
|
|
151
|
+
const seed = Buffer.from(String(memberPrivateKeyHex || ''), 'hex');
|
|
152
|
+
if (seed.length !== 32)
|
|
153
|
+
throw new Error(`成员私钥必须是 32 字节 hex (Ed25519 种子), 实得 ${seed.length}B`);
|
|
154
|
+
return (0, paid_info_protocol_js_1.ed25519Sign)(seed, membershipSigningPayload(stmt));
|
|
155
|
+
}
|
|
156
|
+
/** 管理侧签名 (证明"我同意这次成员变更") */
|
|
157
|
+
async function signAsAdmin(stmt, adminPrivateKeyHex) {
|
|
158
|
+
const seed = Buffer.from(String(adminPrivateKeyHex || ''), 'hex');
|
|
159
|
+
if (seed.length !== 32)
|
|
160
|
+
throw new Error(`发起人私钥必须是 32 字节 hex (Ed25519 种子), 实得 ${seed.length}B`);
|
|
161
|
+
return (0, paid_info_protocol_js_1.ed25519Sign)(seed, membershipSigningPayload(stmt));
|
|
162
|
+
}
|
|
163
|
+
/** 把两枚签名与正文组装成事件 (只校形状, 不验签; 验签用 verifyMembershipEvent) */
|
|
164
|
+
function assembleMembershipEvent(stmt, sigs) {
|
|
165
|
+
const memberSig = String(sigs.memberSig || '');
|
|
166
|
+
const adminSig = String(sigs.adminSig || '');
|
|
167
|
+
if (!memberSig)
|
|
168
|
+
throw new Error('缺 memberSig (成员必须自己签)');
|
|
169
|
+
if (!adminSig)
|
|
170
|
+
throw new Error('缺 adminSig (发起人必须自己签)');
|
|
171
|
+
return { ...stmt, memberSig, adminSig };
|
|
172
|
+
}
|
|
173
|
+
/** 一次性造事件 (成员 + 管理员各自私钥都在手上时用; 门/测试用) */
|
|
174
|
+
async function createMembershipEvent(input) {
|
|
175
|
+
const memberSig = await signAsMember(input.statement, input.memberPrivateKeyHex);
|
|
176
|
+
const adminSig = await signAsAdmin(input.statement, input.adminPrivateKeyHex);
|
|
177
|
+
return assembleMembershipEvent(input.statement, { memberSig, adminSig });
|
|
178
|
+
}
|
|
179
|
+
/** 事件 → 落库条目 */
|
|
180
|
+
function membershipEntryOf(ev) {
|
|
181
|
+
return { kind: exports.GROUP_MEMBERSHIP_KIND, event: ev, ts: ev.ts };
|
|
182
|
+
}
|
|
183
|
+
// ─────────────────────────────────────────────────────────── 验签
|
|
184
|
+
function fail(checks, name, detail) {
|
|
185
|
+
checks.push({ name, ok: false, detail });
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* 验一条成员事件 —— **真 Ed25519 验签**, 双侧都验 (成员 + 管理员), 少一侧 = 拒。
|
|
190
|
+
*
|
|
191
|
+
* 检查项 (任何一项不过 → `ok:false`, 但 `checks` 全量列出, 便于定位):
|
|
192
|
+
* ① 协议名 / op / ts / group 形状
|
|
193
|
+
* ② member.did 由 member.publicKeyHex 派生、by.did 由 by.publicKeyHex 派生 (两把钥匙一致)
|
|
194
|
+
* ③ member.orbitdbId 形状 (必须真能被当成写身份)
|
|
195
|
+
* ④ adminSig 对 `canonicalize(statement)` 验签通过 (by.publicKeyHex)
|
|
196
|
+
* ⑤ memberSig 对同一份字节串验签通过 (member.publicKeyHex)
|
|
197
|
+
* ⑥ 若给了 opts.group → 事件必须指向同一个群
|
|
198
|
+
*/
|
|
199
|
+
async function verifyMembershipEvent(ev, opts = {}) {
|
|
200
|
+
const checks = [];
|
|
201
|
+
const e = ev;
|
|
202
|
+
if (!e || typeof e !== 'object')
|
|
203
|
+
return { ok: false, checks: [{ name: 'shape', ok: false, detail: '事件不是对象' }] };
|
|
204
|
+
checks.push({
|
|
205
|
+
name: 'protocol',
|
|
206
|
+
ok: e.protocol === exports.GROUP_MEMBERSHIP_PROTOCOL,
|
|
207
|
+
detail: `protocol=${String(e.protocol)} (要 ${exports.GROUP_MEMBERSHIP_PROTOCOL})`,
|
|
208
|
+
});
|
|
209
|
+
checks.push({ name: 'op', ok: e.op === 'add' || e.op === 'remove', detail: `op=${String(e.op)}` });
|
|
210
|
+
checks.push({
|
|
211
|
+
name: 'group',
|
|
212
|
+
ok: typeof e.group === 'string' && e.group.startsWith('/orbitdb/'),
|
|
213
|
+
detail: `group=${String(e.group).slice(0, 48)}`,
|
|
214
|
+
});
|
|
215
|
+
checks.push({
|
|
216
|
+
name: 'ts',
|
|
217
|
+
ok: Number.isInteger(e.ts) && e.ts > 0,
|
|
218
|
+
detail: `ts=${String(e.ts)}`,
|
|
219
|
+
});
|
|
220
|
+
const memberOk = (() => {
|
|
221
|
+
try {
|
|
222
|
+
assertMemberRef(e.member, 'member');
|
|
223
|
+
return true;
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
checks.push({ name: 'member-binding', ok: false, detail: String(err.message) });
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
})();
|
|
230
|
+
if (memberOk)
|
|
231
|
+
checks.push({ name: 'member-binding', ok: true, detail: 'member.did ↔ member.publicKeyHex 同钥匙 (did:key 由公钥派生)' });
|
|
232
|
+
let byOk = false;
|
|
233
|
+
try {
|
|
234
|
+
if (!e.by || !exports.DID_KEY_RE.test(String(e.by.did || '')) || !exports.ED25519_PUBKEY_HEX_RE.test(String(e.by.publicKeyHex || ''))) {
|
|
235
|
+
fail(checks, 'by-binding', `by 形状非法 (did=${String(e.by?.did || '').slice(0, 20)})`);
|
|
236
|
+
}
|
|
237
|
+
else if ((0, address_binding_js_1.didFromEd25519PublicKey)(e.by.publicKeyHex) !== e.by.did) {
|
|
238
|
+
fail(checks, 'by-binding', 'by.did 与 by.publicKeyHex 不是同一把钥匙');
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
byOk = true;
|
|
242
|
+
checks.push({ name: 'by-binding', ok: true, detail: 'by.did ↔ by.publicKeyHex 同钥匙' });
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
catch (err) {
|
|
246
|
+
fail(checks, 'by-binding', String(err.message));
|
|
247
|
+
}
|
|
248
|
+
// ④⑤ 验签 (把不通过的项也列出来; 形如 sig 缺失直接判否)
|
|
249
|
+
let adminSigOk = false;
|
|
250
|
+
let memberSigOk = false;
|
|
251
|
+
try {
|
|
252
|
+
const payload = membershipSigningPayload(statementOfEvent(e));
|
|
253
|
+
adminSigOk = byOk && typeof e.adminSig === 'string' && e.adminSig.length > 0
|
|
254
|
+
? await (0, paid_info_protocol_js_1.ed25519Verify)(e.by.publicKeyHex, payload, e.adminSig)
|
|
255
|
+
: false;
|
|
256
|
+
checks.push({
|
|
257
|
+
name: 'adminSig',
|
|
258
|
+
ok: adminSigOk,
|
|
259
|
+
detail: adminSigOk ? '发起人 Ed25519 验签通过' : '发起人签名验签**不通过** (或 by 公钥不可用)',
|
|
260
|
+
});
|
|
261
|
+
memberSigOk = memberOk && typeof e.memberSig === 'string' && e.memberSig.length > 0
|
|
262
|
+
? await (0, paid_info_protocol_js_1.ed25519Verify)(e.member.publicKeyHex, payload, e.memberSig)
|
|
263
|
+
: false;
|
|
264
|
+
checks.push({
|
|
265
|
+
name: 'memberSig',
|
|
266
|
+
ok: memberSigOk,
|
|
267
|
+
detail: memberSigOk ? '成员 Ed25519 验签通过 (成员同意)' : '成员签名验签**不通过** (成员未同意 / 被改过)',
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
catch (err) {
|
|
271
|
+
fail(checks, 'sig-verify', String(err.message));
|
|
272
|
+
}
|
|
273
|
+
if (opts.group !== undefined) {
|
|
274
|
+
checks.push({
|
|
275
|
+
name: 'group-match',
|
|
276
|
+
ok: e.group === opts.group,
|
|
277
|
+
detail: `事件群=${String(e.group).slice(0, 40)} 期望=${String(opts.group).slice(0, 40)}`,
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
return { ok: checks.every((c) => c.ok), checks };
|
|
281
|
+
}
|
|
282
|
+
// ─────────────────────────────────────────────────────────── 白名单派生
|
|
283
|
+
/** 镜像 `access-controllers/ipfs.js:85` 的判定 (`write.includes(id) || write.includes('*')`) */
|
|
284
|
+
function writeListAllows(orbitdbId, write) {
|
|
285
|
+
if (!Array.isArray(write))
|
|
286
|
+
return false;
|
|
287
|
+
return write.includes('*') || write.includes(String(orbitdbId));
|
|
288
|
+
}
|
|
289
|
+
/** 去重 + 稳定排序 —— 同一成员集合在任何节点派生出的白名单**逐字节一致** (ACL CID 才会一致) */
|
|
290
|
+
function normalizeWriteList(ids) {
|
|
291
|
+
const uniq = Array.from(new Set(ids.map((x) => String(x).trim()).filter(Boolean)));
|
|
292
|
+
return uniq.sort();
|
|
293
|
+
}
|
|
294
|
+
const normalizeWrite = normalizeWriteList;
|
|
295
|
+
/**
|
|
296
|
+
* 从群主 + 成员事件**派生** ACL 写名单。
|
|
297
|
+
*
|
|
298
|
+
* 规则 (v1, 刻意简单因此可核验):
|
|
299
|
+
* · 群主恒在名单里, 且**不可被 remove**;
|
|
300
|
+
* · 只有 `by.did === owner.did` 的 add/remove 被接受 (v1 只有群主能改成员);
|
|
301
|
+
* · 事件必须先**验签通过** (`verifyMembershipEvent`) 才参与派生 —— 没验过的事件不改白名单;
|
|
302
|
+
* · 事件按 `ts` 升序应用 (同 ts 按输入顺序), `add` 去重、`remove` 移除 (除群主)。
|
|
303
|
+
* · **不受 ts 单调性以外的时序影响**: 同一批事件 → 同一名单 → 同一 ACL。
|
|
304
|
+
*/
|
|
305
|
+
async function applyMembershipEvents(input) {
|
|
306
|
+
try {
|
|
307
|
+
assertMemberRef(input.owner, 'owner');
|
|
308
|
+
}
|
|
309
|
+
catch (err) {
|
|
310
|
+
throw new Error(`群主身份非法: ${err.message}`);
|
|
311
|
+
}
|
|
312
|
+
const order = input.events.map((e, i) => ({ e, i }))
|
|
313
|
+
.sort((a, b) => (Number(a.e?.ts ?? 0) - Number(b.e?.ts ?? 0)) || (a.i - b.i));
|
|
314
|
+
const accepted = [];
|
|
315
|
+
const rejected = [];
|
|
316
|
+
const members = new Map();
|
|
317
|
+
for (const { e } of order) {
|
|
318
|
+
const v = await verifyMembershipEvent(e, input.group !== undefined ? { group: input.group } : {});
|
|
319
|
+
if (!v.ok) {
|
|
320
|
+
rejected.push({ event: e, reason: 'VERIFY_FAILED: ' + v.checks.filter((c) => !c.ok).map((c) => c.name).join(',') });
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
if (e.by.did !== input.owner.did) {
|
|
324
|
+
rejected.push({ event: e, reason: `UNAUTHORIZED_ISSUER: ${e.by.did.slice(0, 24)}… 不是群主` });
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
if (e.op === 'add') {
|
|
328
|
+
if (e.member.orbitdbId === input.owner.orbitdbId) {
|
|
329
|
+
rejected.push({ event: e, reason: 'OWNER_ALREADY_MEMBER' });
|
|
330
|
+
continue;
|
|
331
|
+
}
|
|
332
|
+
members.set(e.member.orbitdbId, {
|
|
333
|
+
did: e.member.did, publicKeyHex: e.member.publicKeyHex, orbitdbId: e.member.orbitdbId,
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
if (e.member.orbitdbId === input.owner.orbitdbId) {
|
|
338
|
+
rejected.push({ event: e, reason: 'CANNOT_REMOVE_OWNER' });
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
members.delete(e.member.orbitdbId);
|
|
342
|
+
}
|
|
343
|
+
accepted.push(e);
|
|
344
|
+
}
|
|
345
|
+
const memberRefs = Array.from(members.values()).sort((a, b) => (a.orbitdbId < b.orbitdbId ? -1 : a.orbitdbId > b.orbitdbId ? 1 : 0));
|
|
346
|
+
return {
|
|
347
|
+
write: normalizeWrite([input.owner.orbitdbId, ...memberRefs.map((m) => m.orbitdbId)]),
|
|
348
|
+
members: memberRefs,
|
|
349
|
+
accepted,
|
|
350
|
+
rejected,
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
// ─────────────────────────────────────────────────────────── ACL 选项 / 变更代价
|
|
354
|
+
/**
|
|
355
|
+
* 把白名单接成 `CIDDatabase.openStore` 认的选项。
|
|
356
|
+
* `cid-database.accessControllerOption()` 会把它翻成 OrbitDB v4 真认的大写
|
|
357
|
+
* `AccessController: IPFSAccessController({ write })` (小写会被静默丢弃 —— 2026-09-24 的坑)。
|
|
358
|
+
*/
|
|
359
|
+
function groupAccessOptions(write) {
|
|
360
|
+
if (!Array.isArray(write) || write.length === 0)
|
|
361
|
+
throw new Error('白名单不能为空 (空名单会被 accessControllerOption 丢掉 → 落回默认策略)');
|
|
362
|
+
return { accessController: { write: normalizeWrite(write) } };
|
|
363
|
+
}
|
|
364
|
+
/** IPFS 型 AC 的"就地更新"能力 —— 源码事实, 不是推测 */
|
|
365
|
+
exports.ACL_INPLACE_UPDATE = {
|
|
366
|
+
ipfsType: {
|
|
367
|
+
inPlace: false,
|
|
368
|
+
why: 'write 在内容寻址的 ACL manifest 里, ACL CID → store manifest → store 地址; 改白名单必然换地址; 包里没有 AC 的 mutate/grant API',
|
|
369
|
+
},
|
|
370
|
+
orbitdbType: {
|
|
371
|
+
inPlace: 'partial',
|
|
372
|
+
why: 'grant/revoke 写一个独立的 AC keyvalue db (可复制); 但那 kv db 自己的根写名单仍冻结在它的 IPFS manifest 里 —— 只有根名单里的人能改; 且增量生效依赖该 kv db 复制到对端',
|
|
373
|
+
},
|
|
374
|
+
};
|
|
375
|
+
/**
|
|
376
|
+
* 成员变更的执行计划 (诚实版): IPFS 型 AC 下**只能重建**。
|
|
377
|
+
* 把代价逐条写出来, 免得下游把"换地址"当免费操作。
|
|
378
|
+
*/
|
|
379
|
+
function aclChangePlan(input) {
|
|
380
|
+
const before = normalizeWrite(input.before);
|
|
381
|
+
const after = normalizeWrite(input.after);
|
|
382
|
+
const changed = before.join(',') !== after.join(',');
|
|
383
|
+
return {
|
|
384
|
+
mustRebuild: true,
|
|
385
|
+
strategy: 'rebuild',
|
|
386
|
+
why: exports.ACL_INPLACE_UPDATE.ipfsType.why,
|
|
387
|
+
changed,
|
|
388
|
+
before,
|
|
389
|
+
after,
|
|
390
|
+
costs: [
|
|
391
|
+
'新建 store ⇒ **新地址 (新 manifest CID)**: 老成员手里的群链接/群地址全部作废, 必须重新分发',
|
|
392
|
+
'老地址的写名单**不可追认**: 未在重建时列进去的人, 连老地址都写不了 (老地址本身已经是收紧后的名单)',
|
|
393
|
+
'历史消息**不会自动搬过去**: 新 store 只有新地址的 oplog; 要保留历史必须显式回放 (逐条 add) 或让成员两头都读',
|
|
394
|
+
`本机已落盘的旧 store 不会删除 (占用不回收); 消息条数 ${Number(input.messageCount ?? 0)} 条需要回放才不丢`,
|
|
395
|
+
'重建期间**两边都能写**的窗口不存在: 切换只认新地址, 老地址冻结 (没有双写机制, 别假装有)',
|
|
396
|
+
],
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
//# sourceMappingURL=group-access.js.map
|