chore(仓库对齐): 文档库结构治理 + IM/插件线落地
build / build-and-scan (push) Canceled after 0s

文档库:目录改为编号制(01-规范/02-架构设计/03-数据库/04-调整方案/
05-交接单/06-ops/07-scripts/08-skills/09-archive),顶层散文件归入 01-规范/;
INDEX.md 与 docs-manifest.json 重刷(档案 146 篇);旧目录名引用全量对齐。

IM 线:src/im/**(SDK / hub / store / presence / ws / gateway-token)、
src/web/routes/im.ts、src/db/plugin-data/**、src/supervisor/plugin-assembly.ts
及对应 test/**。

插件线:poc/{im-agent-bridge,im-connection-gateway,im-conversation-tabs,
business-plugins-im,carbon-mcp-probe}、src/web/routes/{sessions,overlay-device}.ts、
src/net/relay/{device-grant,instance-credential}.ts。

仓库卫生:清出 40 个历史误入库 / 已改名文件(34 个交接单归档 + 6 个旧结构,
本地均有副本);dsh-server-docs/.gitignore 补 tmp/;交接单不入库(政策)。
This commit is contained in:
admin committed 2026-09-24 07:25:16 +08:00
1 parent 3d8f50e366
commit e6207aa691
239 files changed
+34477 -14633

No files matched your search

+66 -7
View File
@@ -40,6 +40,7 @@ import {
DIRECT_OFF_VALUES,
DirectCooldown,
DirectPath,
describeDialers,
NODES_REGISTRY_VERSION,
PUNCH_PORT_BASE,
PUNCH_PORT_SPAN,
@@ -212,15 +213,31 @@ test('T4 准入策略**复用** server.ts 的那一条(⛔ 防两处写分叉
const netSrc = readFileSync(ssPath, 'utf8')
const srvSrc = readFileSync(serverPath, 'utf8')
// ① 唯一出口确实在 network.ts 里,且语义就是"该网桶里有没有这个 hostId"
// ① 唯一出口确实在 network.ts 里,且语义就是"该网桶里有没有这个 hostId / 是否整网放行"
assert.match(netSrc, /export function isAllowedDialer\(/)
assert.match(netSrc, /return map\.get\(network\)\?\.has\(hostId\) === true/)
assert.match(netSrc, /bucket\.has\(DIALER_WILDCARD\)/, '网级通配(序㊻ S2)应在唯一出口里判')
assert.match(netSrc, /if \(bucket\.has\(hostId\)\) return true/, '逐设备命中仍在唯一出口里判')
assert.match(
netSrc,
/TENANT_NETWORK_WILDCARD\)\?\.has\(DIALER_WILDCARD\)/,
'租户网全域兜底(序㊻ 步骤6/遗留1)必须在**唯一出口**里判,⛔ 不许在调用方另判一处',
)
// ② server.ts 的两处闸门与它**同策略**(同 map 、同 `=== true` 默认拒绝)
const registerGate = srvSrc.includes('const wantDialer = this.dialers.get(network)?.has(hostId) === true')
const dialGate = srvSrc.includes('if (this.dialers.get(session.network)?.has(session.hostId) !== true) {')
assert.ok(registerGate, '注册闸门(server.ts)应仍是 dialers.get(network)?.has(hostId) === true(⛔ 本棒不许改它的语义)')
assert.ok(dialGate, 'DIAL 闸门(server.ts)应仍是 dialers.get(session.network)?.has(session.hostId) !== true')
// ② server.ts 的两处闸门**调用**它(序㊻ S2 起:等价性 = 同一份代码,⛔ 不再是"两份逐字相同")
assert.ok(
srvSrc.includes('const wantDialer = isAllowedDialer(this.dialers, network, hostId)'),
'注册闸门(server.ts)应调用 isAllowedDialer(this.dialers, network, hostId)',
)
assert.ok(
srvSrc.includes('if (!isAllowedDialer(this.dialers, session.network, session.hostId)) {'),
'DIAL 闸门(server.ts)应调用 isAllowedDialer(this.dialers, session.network, session.hostId)',
)
// ②b ⛔ 反证:server.ts 里**不许**再出现内联形态 —— 否则网级通配会"漏改一处"(本线老病根)
assert.ok(
!/this\.dialers\.get\([^)]*\)\?\.has\(/.test(srvSrc),
'server.ts 里又出现了内联白名单判定 dialers.get(...)?.has(...) ⇒ 序㊻ S2 之后它必须走唯一出口',
)
// ③ 直连模块**不许**自己再判一遍(⛔ 防"同一事实两处写")
for (const f of ['direct/candidate.ts', 'direct/index.ts', 'direct/punch.ts']) {
@@ -232,6 +249,48 @@ test('T4 准入策略**复用** server.ts 的那一条(⛔ 防两处写分叉
// ④ 等价性:默认拒绝(空桶 / 未列网络 / 名字错)—— 与 server.ts 同为"默认拒绝"
assert.equal(isAllowedDialer(new Map(), 'ops', 'manager'), false)
assert.equal(isAllowedDialer(dialers(), 'ops', 'MANAGER'), false, 'hostId 大小写敏感(与 HOST_RE 口径一致)')
// ⑤ 网级通配(序㊻ S2):只对**写了通配的那张网**放行,⛔ 不外溢到别的网
const wild = normalizeDialers(new Set(['ops:manager', 'u:5/*']))
assert.equal(isAllowedDialer(wild, 'u:5', 'd-any-brand-new-device'), true, '通配网里:未枚举的 hostId 也可拨')
assert.equal(isAllowedDialer(wild, 'ops', 'w-2'), false, '⛔ 通配不外溢:ops 桶里没有 w-2 就是拒')
assert.equal(isAllowedDialer(wild, 'u:7', 'd-any'), false, '⛔ 通配不外溢:没列到的网一律拒')
assert.deepEqual(describeDialers(wild).sort(), ['manager', 'u:5/*'], '通配在 /status 里要看得见')
/**
* ⑥ **租户网全域兜底**(序㊻ 步骤 6/遗留1):配一条「网名位 `u:*` + hostId 位 `*`」(等价于
* 分桶形态的 `u:*` 桶)⇒ **没被单独列举过**的租户网也放行。
*
* 这条要解决的是上一棒实测到的"零介入"硬缺口:**租户 id 是运行时才生成的**(`users.id`),
* 所以"把新租户网加进白名单"在原理上做不到 ⇒ 只能表达为"任何租户网"。
*/
const tenantAll = normalizeDialers(new Set(['ops:manager', 'u:*/*']))
assert.equal(
isAllowedDialer(tenantAll, 'u:brand-new-tenant-id', 'd-brand-new-device'),
true,
'未列举过的租户网也应命中(这条就是"新用户零介入"的准入面依据)',
)
assert.equal(isAllowedDialer(tenantAll, 'u', 'd-1'), false, '⛔ 裸 `u` 不是合法租户网 ⇒ 兜底不生效(保留字仍被挡住)')
assert.equal(isAllowedDialer(tenantAll, 'ops', 'w-2'), false, '⛔ 兜底**不外溢到 ops**(结构性:只对租户网生效)')
assert.equal(isAllowedDialer(tenantAll, 'named-net', 'w-2'), false, '⛔ 兜底不外溢到命名网')
assert.equal(isAllowedDialer(normalizeDialers(new Set(['ops:manager'])), 'u:5', 'd-1'), false, '⛔ 没写兜底就照旧默认拒绝')
// 取**并集**语义:精确条目与兜底互不覆盖(⛔ 不会"兜底把 ops 的条目压掉")
assert.equal(isAllowedDialer(tenantAll, 'ops', 'manager'), true, '精确条目在兜底存在时照旧生效')
assert.deepEqual(describeDialers(tenantAll).sort(), ['manager', 'u:*/*'], '兜底在 /status 里要看得见(一眼能确认它开着)')
// ⑦ 非法用法**装载即抛**(本模块的一贯判据:配错就炸,⛔ 不静默变成"谁也没匹配上")
for (const bad of ['ops:*', 'named-net:*', 'u:*/d-1']) {
assert.throws(
() => normalizeDialers(new Set([bad])),
/只能用在租户网|半通配/,
`${JSON.stringify(bad)} 应当装载即抛(实际没抛)`,
)
}
assert.throws(
() => normalizeDialers(new Map([['u:*', new Set(['manager'])]])),
/只允许写/,
'`u:*` 桶里写具体 hostId 应当抛(该桶只表达"任何租户网整网放行")',
)
})
// ── T5 · 打洞成功路径(真 dgram + NAT 模拟) ────────────────────────────────────