@bolloon/bolloon-agent 0.4.33 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/contacts/chain.js +27 -7
- package/dist/agents/execution-supervisor.js +580 -40
- package/dist/agents/external-events.js +35 -6
- package/dist/agents/gateway-group.js +100 -12
- package/dist/agents/goal-criteria.js +10 -3
- package/dist/agents/goal-flywheel/block-executor.js +346 -0
- package/dist/agents/goal-flywheel/continuation-decision.js +592 -0
- package/dist/agents/goal-flywheel/goal-change.js +754 -0
- package/dist/agents/goal-flywheel/index.js +26 -0
- package/dist/agents/goal-flywheel/memory-layers.js +227 -0
- package/dist/agents/goal-flywheel/run-closure.js +809 -0
- package/dist/agents/goal-flywheel/skill-candidate.js +628 -0
- package/dist/agents/goal-flywheel/types.js +329 -0
- package/dist/agents/goal-flywheel/wiring/change.js +288 -0
- package/dist/agents/goal-flywheel/wiring/closure.js +697 -0
- package/dist/agents/goal-flywheel/wiring/continuation.js +432 -0
- package/dist/agents/goal-flywheel/wiring/contract.js +270 -0
- package/dist/agents/goal-flywheel/wiring/index.js +26 -0
- package/dist/agents/goal-flywheel/wiring/monitor.js +254 -0
- package/dist/agents/goal-flywheel/wiring/seams.js +592 -0
- package/dist/agents/goal-flywheel/work-contract.js +478 -0
- package/dist/agents/goal-flywheel/work-monitor.js +488 -0
- package/dist/agents/goal-flywheel-wiring.js +1870 -0
- package/dist/agents/goal-state-reducer.js +406 -0
- package/dist/agents/goal-store.js +35 -1
- package/dist/agents/mobile-flywheel-view.js +144 -0
- package/dist/agents/mobile-task-actions-verify.js +74 -0
- package/dist/agents/mobile-task-actions.js +178 -0
- package/dist/agents/mobile-task-views.js +199 -0
- package/dist/agents/model-policy.js +651 -0
- package/dist/agents/network-pulse.js +304 -18
- package/dist/agents/pi-sdk-tools.js +84 -33
- package/dist/agents/pi-sdk.js +157 -42
- package/dist/agents/run-store.js +71 -5
- package/dist/agents/skill-readiness.js +52 -10
- package/dist/agents/subagent-manager.js +209 -3
- package/dist/agents/task/task-runner.js +17 -4
- package/dist/agents/task-group.js +8 -51
- package/dist/agents/task-public-text.js +89 -0
- package/dist/agents/workflow-pivot-loop.js +19 -12
- package/dist/cli/clipboard.js +65 -0
- package/dist/cli/commands/index.js +1 -0
- package/dist/cli/commands/tasks.js +350 -2
- package/dist/cli/identity-command.js +177 -0
- package/dist/cli/ink-app.js +145 -17
- package/dist/cli/log-gate.js +386 -0
- package/dist/cli/mention-data.js +2 -0
- package/dist/cli/model-selector.js +538 -0
- package/dist/cli/reply-hygiene.js +54 -0
- package/dist/cli/setup-wizard.js +757 -69
- package/dist/cli/startup-notice.js +160 -0
- package/dist/cli/stores.js +22 -1
- package/dist/cli/theme.js +49 -0
- package/dist/cli/tui-select.js +970 -0
- package/dist/cli/update-commands.js +150 -24
- package/dist/cli-entry.js +137 -20
- package/dist/electron-build/agents/contacts/chain.js +26 -6
- package/dist/electron-build/agents/contacts/chain.js.map +1 -1
- package/dist/electron-build/agents/execution-supervisor.js +578 -38
- package/dist/electron-build/agents/execution-supervisor.js.map +1 -1
- package/dist/electron-build/agents/external-events.js +34 -5
- package/dist/electron-build/agents/external-events.js.map +1 -1
- package/dist/electron-build/agents/goal-criteria.js +10 -3
- package/dist/electron-build/agents/goal-criteria.js.map +1 -1
- package/dist/electron-build/agents/goal-flywheel/continuation-decision.js +598 -0
- package/dist/electron-build/agents/goal-flywheel/continuation-decision.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/goal-change.js +773 -0
- package/dist/electron-build/agents/goal-flywheel/goal-change.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/memory-layers.js +269 -0
- package/dist/electron-build/agents/goal-flywheel/memory-layers.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/run-closure.js +818 -0
- package/dist/electron-build/agents/goal-flywheel/run-closure.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/skill-candidate.js +642 -0
- package/dist/electron-build/agents/goal-flywheel/skill-candidate.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/types.js +333 -0
- package/dist/electron-build/agents/goal-flywheel/types.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/change.js +294 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/change.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/closure.js +742 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/closure.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/continuation.js +444 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/continuation.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/contract.js +279 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/contract.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/index.js +111 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/index.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/monitor.js +264 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/monitor.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/seams.js +612 -0
- package/dist/electron-build/agents/goal-flywheel/wiring/seams.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/work-contract.js +488 -0
- package/dist/electron-build/agents/goal-flywheel/work-contract.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel/work-monitor.js +501 -0
- package/dist/electron-build/agents/goal-flywheel/work-monitor.js.map +1 -0
- package/dist/electron-build/agents/goal-flywheel-wiring.js +1962 -0
- package/dist/electron-build/agents/goal-flywheel-wiring.js.map +1 -0
- package/dist/electron-build/agents/goal-state-reducer.js +414 -0
- package/dist/electron-build/agents/goal-state-reducer.js.map +1 -0
- package/dist/electron-build/agents/goal-store.js +35 -1
- package/dist/electron-build/agents/goal-store.js.map +1 -1
- package/dist/electron-build/agents/model-policy.js +706 -0
- package/dist/electron-build/agents/model-policy.js.map +1 -0
- package/dist/electron-build/agents/network-pulse.js +307 -19
- package/dist/electron-build/agents/network-pulse.js.map +1 -1
- package/dist/electron-build/agents/pi-sdk-tools.js +84 -33
- package/dist/electron-build/agents/pi-sdk-tools.js.map +1 -1
- package/dist/electron-build/agents/pi-sdk-types.js.map +1 -1
- package/dist/electron-build/agents/pi-sdk.js +156 -41
- package/dist/electron-build/agents/pi-sdk.js.map +1 -1
- package/dist/electron-build/agents/run-store.js +75 -6
- package/dist/electron-build/agents/run-store.js.map +1 -1
- package/dist/electron-build/agents/skill-readiness.js +52 -9
- package/dist/electron-build/agents/skill-readiness.js.map +1 -1
- package/dist/electron-build/agents/task/task-runner.js +16 -3
- package/dist/electron-build/agents/task/task-runner.js.map +1 -1
- package/dist/electron-build/agents/workflow-pivot-loop.js +19 -12
- package/dist/electron-build/agents/workflow-pivot-loop.js.map +1 -1
- package/dist/electron-build/llm/config-store.js +146 -6
- package/dist/electron-build/llm/config-store.js.map +1 -1
- package/dist/electron-build/llm/connection-probe.js +764 -0
- package/dist/electron-build/llm/connection-probe.js.map +1 -0
- package/dist/electron-build/llm/custom-provider-store.js +272 -0
- package/dist/electron-build/llm/custom-provider-store.js.map +1 -0
- package/dist/electron-build/llm/data/provider-catalog-baked.js +23 -0
- package/dist/electron-build/llm/data/provider-catalog-baked.js.map +1 -0
- package/dist/electron-build/llm/model-catalog.js +778 -0
- package/dist/electron-build/llm/model-catalog.js.map +1 -0
- package/dist/electron-build/llm/model-discovery.js +1202 -0
- package/dist/electron-build/llm/model-discovery.js.map +1 -0
- package/dist/electron-build/llm/model-selection.js +1315 -0
- package/dist/electron-build/llm/model-selection.js.map +1 -0
- package/dist/electron-build/llm/pi-ai.js +70 -11
- package/dist/electron-build/llm/pi-ai.js.map +1 -1
- package/dist/electron-build/llm/provider-catalog.js +969 -0
- package/dist/electron-build/llm/provider-catalog.js.map +1 -0
- package/dist/electron-build/llm/provider-registry.js +950 -0
- package/dist/electron-build/llm/provider-registry.js.map +1 -0
- package/dist/electron-build/llm/tool-name.js +266 -0
- package/dist/electron-build/llm/tool-name.js.map +1 -0
- package/dist/electron-build/orbitdb/cid-database.js +83 -17
- package/dist/electron-build/orbitdb/cid-database.js.map +1 -1
- package/dist/electron-build/orbitdb/ipfs-node.js +31 -2
- package/dist/electron-build/orbitdb/ipfs-node.js.map +1 -1
- package/dist/electron-build/utils/dual-source-facts.js +236 -0
- package/dist/electron-build/utils/dual-source-facts.js.map +1 -0
- package/dist/electron-build/utils/dual-source.js +347 -0
- package/dist/electron-build/utils/dual-source.js.map +1 -0
- package/dist/electron-build/utils/update-manager.js +328 -104
- package/dist/electron-build/utils/update-manager.js.map +1 -1
- package/dist/electron-build/utils/update-state.js +9 -11
- package/dist/electron-build/utils/update-state.js.map +1 -1
- package/dist/electron-build/utils/version-identity.js +193 -0
- package/dist/electron-build/utils/version-identity.js.map +1 -0
- package/dist/electron-build/utils/version-info.js +57 -31
- package/dist/electron-build/utils/version-info.js.map +1 -1
- package/dist/index.js +385 -108
- package/dist/ios/bolloon-web.json +10 -0
- package/dist/ios/chain-explorer.js +617 -0
- package/dist/ios/explorer.html +163 -0
- package/dist/ios/index.html +96 -0
- package/dist/ios/mobile-agent.js +2 -2
- package/dist/ios/mobile-contacts.js +362 -0
- package/dist/ios/mobile-core.js +3102 -310
- package/dist/ios/mobile-privacy.js +185 -0
- package/dist/ios/mobile-tasks.js +339 -0
- package/dist/ios/mobile-update.js +1442 -0
- package/dist/ios/mobile.css +19 -0
- package/dist/ios/mobile.html +96 -0
- package/dist/ios/mobile.js +1013 -41
- package/dist/ios/routes-chain-index.js +108 -0
- package/dist/ios/routes-contacts.js +420 -0
- package/dist/ios/routes-llm-config.js +344 -52
- package/dist/ios/routes-mobile-tasks.js +353 -0
- package/dist/ios/routes-onchain-trade.js +99 -0
- package/dist/ios/routes-x402-info.js +1 -0
- package/dist/ios/server.js +921 -0
- package/dist/ios/sw.js +1 -1
- package/dist/ios/task-frame-server.js +211 -0
- package/dist/llm/config-store.js +146 -6
- package/dist/llm/connection-probe.js +744 -0
- package/dist/llm/custom-provider-store.js +224 -0
- package/dist/llm/data/provider-catalog-baked.js +19 -0
- package/dist/llm/model-catalog.js +717 -0
- package/dist/llm/model-discovery.js +1137 -0
- package/dist/llm/model-selection.js +1241 -0
- package/dist/llm/pi-ai.js +70 -11
- package/dist/llm/provider-catalog.js +898 -0
- package/dist/llm/provider-registry.js +917 -0
- package/dist/llm/tool-name.js +220 -0
- package/dist/orbitdb/cid-database.js +81 -16
- package/dist/orbitdb/ipfs-node.js +31 -2
- package/dist/setup/onboard.js +34 -8
- package/dist/utils/dual-source-facts.js +223 -0
- package/dist/utils/dual-source.js +297 -0
- package/dist/utils/update-cli.js +16 -21
- package/dist/utils/update-health.js +35 -5
- package/dist/utils/update-manager.js +325 -96
- package/dist/utils/update-state.js +13 -10
- package/dist/utils/version-identity.js +176 -0
- package/dist/utils/version-info.js +27 -22
- package/dist/web/bolloon-web.json +10 -0
- package/dist/web/mobile-contacts.js +44 -11
- package/dist/web/mobile-core.js +2901 -580
- package/dist/web/mobile-tasks.js +339 -0
- package/dist/web/mobile-update.js +1442 -0
- package/dist/web/mobile.css +19 -0
- package/dist/web/mobile.html +64 -0
- package/dist/web/mobile.js +838 -35
- package/dist/web/routes-llm-config.js +344 -52
- package/dist/web/routes-mobile-tasks.js +353 -0
- package/dist/web/server.js +163 -4
- package/dist/web/sw.js +1 -1
- package/package.json +3 -1
- package/scripts/build-web.ts +36 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* dual-source-facts.ts — 双源的**语义核心** (2026-09-26, update-protocol §12)
|
|
4
|
+
*
|
|
5
|
+
* 为什么从 `dual-source.ts` 里抽出这一半: 手机端 WebView **没有 node:**, 但手机端双源更新
|
|
6
|
+
* 必须用**和桌面同一份**交叉校验 / 错误分类 / dev 快照比较 —— 否则同一件事在电脑上和手机上
|
|
7
|
+
* 会长出两套说法 (而"两个源指向不同版本就拒绝"这种事, 两套说法迟早有一处是错的)。
|
|
8
|
+
*
|
|
9
|
+
* 这里只放**纯函数与类型** (不 import 任何 `node:*`, 不在顶层读 `process.env`):
|
|
10
|
+
* · GitHub 侧错误分类 `classifyGithubError` (§12.3, 与 registry 侧并列不合并)
|
|
11
|
+
* · stable 的交叉校验 `crossCheckStable` (§12.1)
|
|
12
|
+
* · dev 的按 sha 比较 `compareDevSnapshots` (§12.1)
|
|
13
|
+
* · 事实/报告的紧凑视图 `toGithubReport` / `renderGithubReportLine`
|
|
14
|
+
*
|
|
15
|
+
* 需要网络与子进程的那一半 (真调 api.github.com / codeload 下载 / 现场构建 dev 快照)
|
|
16
|
+
* 仍在 `dual-source.ts` —— 它在这份纯模块之上, 且把这些名字原样再导出。
|
|
17
|
+
*
|
|
18
|
+
* 硬口径 (§12.5, 验收核心, 两边共用):
|
|
19
|
+
* - 源不可达 / 版本不存在 → **拒绝并说清** (带具体分类), 绝不静默装回旧版
|
|
20
|
+
* - 不编造不存在的路径: 本仓 GitHub 上**真的没有 Release** (0 个), 所以 "Release 缺" 时
|
|
21
|
+
* 如实报 "发布记录缺 Tag / Release" (提醒级), **不是** fake 一个 Release 出来
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.OFFLINE_CODES = exports.GITHUB_REASONS = exports.DEV_CHANNEL_WARNING = void 0;
|
|
25
|
+
exports.toGithubReport = toGithubReport;
|
|
26
|
+
exports.renderGithubReportLine = renderGithubReportLine;
|
|
27
|
+
exports.collectNetEvidence = collectNetEvidence;
|
|
28
|
+
exports.classifyGithubError = classifyGithubError;
|
|
29
|
+
exports.classifyRegistryError = classifyRegistryError;
|
|
30
|
+
exports.newestGithubVersion = newestGithubVersion;
|
|
31
|
+
exports.numericCompare = numericCompare;
|
|
32
|
+
exports.crossCheckStable = crossCheckStable;
|
|
33
|
+
exports.compareDevSnapshots = compareDevSnapshots;
|
|
34
|
+
const version_identity_js_1 = require("./version-identity.js");
|
|
35
|
+
Object.defineProperty(exports, "DEV_CHANNEL_WARNING", { enumerable: true, get: function () { return version_identity_js_1.DEV_CHANNEL_WARNING; } });
|
|
36
|
+
// ── 类型 ────────────────────────────────────────────────────────────────────
|
|
37
|
+
/**
|
|
38
|
+
* GitHub 侧错误的分类 (§12.3) —— 与 registry 的分类**并列且不合并**:
|
|
39
|
+
* offline 网络不可达 (ENOTFOUND/EAI_AGAIN/ECONNREFUSED/超时)
|
|
40
|
+
* rate_limited HTTP 403/429 (限流; 带重试时间)
|
|
41
|
+
* not_found HTTP 404 (没有 Release / 没有 master 分支 / 仓库不存在)
|
|
42
|
+
* http_error 其它 HTTP 状态 (5xx 等) —— 不塞进上面三类, 免得把"服务有问题"说成"网不通"
|
|
43
|
+
* parse_error 拿到了内容但解析不了
|
|
44
|
+
*/
|
|
45
|
+
exports.GITHUB_REASONS = ['offline', 'rate_limited', 'not_found', 'http_error', 'parse_error'];
|
|
46
|
+
function toGithubReport(r) {
|
|
47
|
+
if (!r.ok) {
|
|
48
|
+
return {
|
|
49
|
+
reachable: false, reason: r.reason, detail: r.detail, retryAt: r.retryAt,
|
|
50
|
+
headSha: r.facts?.headSha ?? null, ref: r.facts?.ref ?? `refs/heads/${version_identity_js_1.DEV_BRANCH}`,
|
|
51
|
+
releases: r.facts?.releases.length, tags: r.facts?.tags.length,
|
|
52
|
+
newestVersion: r.facts ? newestGithubVersion(r.facts) : null,
|
|
53
|
+
partial: r.facts?.partial, fetchedAt: r.facts?.fetchedAt,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
reachable: true, headSha: r.facts.headSha, ref: r.facts.ref,
|
|
58
|
+
releases: r.facts.releases.length, tags: r.facts.tags.length,
|
|
59
|
+
newestVersion: newestGithubVersion(r.facts), partial: r.facts.partial, fetchedAt: r.facts.fetchedAt,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function renderGithubReportLine(g) {
|
|
63
|
+
if (!g)
|
|
64
|
+
return 'GitHub 源: 未查询';
|
|
65
|
+
if (!g.reachable) {
|
|
66
|
+
const retry = g.retryAt ? `, 限流重试时间 ${g.retryAt}` : '';
|
|
67
|
+
return `GitHub 源: 不可达 — github_unavailable(${g.reason}) ${g.detail || ''}${retry}`;
|
|
68
|
+
}
|
|
69
|
+
return `GitHub 源: 可达 · master HEAD ${g.headSha ? g.headSha.slice(0, 7) : '未知'} · Release ${g.releases ?? 0} 个 · Tag ${g.tags ?? 0} 个 · 最新版本标签 ${g.newestVersion || '无'}${g.partial ? ' (部分请求失败)' : ''}`;
|
|
70
|
+
}
|
|
71
|
+
// ── 错误分类 ────────────────────────────────────────────────────────────────
|
|
72
|
+
exports.OFFLINE_CODES = new Set(['ENOTFOUND', 'EAI_AGAIN', 'ECONNREFUSED', 'ECONNRESET', 'ETIMEDOUT', 'EHOSTUNREACH', 'ENETUNREACH', 'ENETDOWN', 'EAI_FAIL', 'UND_ERR_CONNECT_TIMEOUT', 'CERT_HAS_EXPIRED']);
|
|
73
|
+
/**
|
|
74
|
+
* 从**错误链**里挖网络类证据。
|
|
75
|
+
*
|
|
76
|
+
* 为什么不能只看 `err.code`: `fetch()` 抛出来的是 `TypeError: fetch failed`, 真正的 socket 错误挂在
|
|
77
|
+
* `err.cause.code` (undici)。只看 `err.code` ⇒ 连不上的端口会被判成 http_error / registry_unavailable,
|
|
78
|
+
* 于是"源不可达"这一条在真跑里变成**分类错误**(真跑抓到过: 死端口 → registry_unavailable)。
|
|
79
|
+
* 浏览器侧则是 `message: 'Failed to fetch'` / `'Load failed'`。
|
|
80
|
+
*/
|
|
81
|
+
function collectNetEvidence(err) {
|
|
82
|
+
const codes = [];
|
|
83
|
+
const msgs = [];
|
|
84
|
+
let cur = err;
|
|
85
|
+
for (let depth = 0; cur && depth < 6; depth++) {
|
|
86
|
+
// AggregateError (多地址并发失败) 的成员各带一个 code
|
|
87
|
+
const inner = Array.isArray(cur.errors) ? cur.errors : [];
|
|
88
|
+
for (const e of inner) {
|
|
89
|
+
if (e?.code)
|
|
90
|
+
codes.push(String(e.code));
|
|
91
|
+
if (e?.message)
|
|
92
|
+
msgs.push(String(e.message));
|
|
93
|
+
}
|
|
94
|
+
if (cur.code)
|
|
95
|
+
codes.push(String(cur.code));
|
|
96
|
+
if (cur.errno)
|
|
97
|
+
codes.push(String(cur.errno));
|
|
98
|
+
if (cur.message)
|
|
99
|
+
msgs.push(String(cur.message));
|
|
100
|
+
cur = cur.cause;
|
|
101
|
+
}
|
|
102
|
+
const code = codes.find((c) => exports.OFFLINE_CODES.has(c)) || codes[0] || '';
|
|
103
|
+
const message = msgs.join(' · ');
|
|
104
|
+
const offline = codes.some((c) => exports.OFFLINE_CODES.has(c))
|
|
105
|
+
|| /timeout|timed out|ENOTFOUND|getaddrinfo|network|socket hang up|超时|Failed to fetch|fetch failed|NetworkError|Load failed|ECONNREFUSED|ECONNRESET/i.test(message);
|
|
106
|
+
return { code, message, offline };
|
|
107
|
+
}
|
|
108
|
+
/** 网络类 → offline; 403/429 → rate_limited; 404 → not_found; 其它 → http_error。 */
|
|
109
|
+
function classifyGithubError(err, httpStatus, headers = {}) {
|
|
110
|
+
const retryAt = headers['x-ratelimit-reset']
|
|
111
|
+
? new Date(Number(headers['x-ratelimit-reset']) * 1000).toISOString()
|
|
112
|
+
: null;
|
|
113
|
+
const net = collectNetEvidence(err);
|
|
114
|
+
if (net.offline) {
|
|
115
|
+
return { kind: 'github_unavailable', reason: 'offline', detail: `${net.code || net.message || '网络不可达'}`, retryAt: null };
|
|
116
|
+
}
|
|
117
|
+
if (httpStatus === 403 || httpStatus === 429) {
|
|
118
|
+
return { kind: 'github_unavailable', reason: 'rate_limited', detail: `GitHub 返回 HTTP ${httpStatus} (限流/权限)`, retryAt };
|
|
119
|
+
}
|
|
120
|
+
if (httpStatus === 404) {
|
|
121
|
+
return { kind: 'github_unavailable', reason: 'not_found', detail: `GitHub 上没有 ${version_identity_js_1.GITHUB_UPSTREAM_SLUG} 的该项记录 (HTTP 404)`, retryAt: null };
|
|
122
|
+
}
|
|
123
|
+
if (httpStatus && httpStatus >= 400) {
|
|
124
|
+
return { kind: 'github_unavailable', reason: 'http_error', detail: `GitHub 返回 HTTP ${httpStatus}`, retryAt };
|
|
125
|
+
}
|
|
126
|
+
return { kind: 'github_unavailable', reason: 'http_error', detail: net.code || net.message || '未知错误', retryAt: null };
|
|
127
|
+
}
|
|
128
|
+
/** registry 侧错误的分类 (§3) —— 与 `classifyGithubError` **并列, 不合并**。 */
|
|
129
|
+
function classifyRegistryError(err, httpStatus) {
|
|
130
|
+
const net = collectNetEvidence(err);
|
|
131
|
+
if (net.offline) {
|
|
132
|
+
return { kind: 'offline', detail: `${net.code || net.message || '网络不可达'}` };
|
|
133
|
+
}
|
|
134
|
+
if (httpStatus && httpStatus >= 500)
|
|
135
|
+
return { kind: 'registry_unavailable', detail: `registry 返回 HTTP ${httpStatus}` };
|
|
136
|
+
if (httpStatus === 404)
|
|
137
|
+
return { kind: 'registry_unavailable', detail: `registry 上没有该包 (HTTP 404)` };
|
|
138
|
+
if (httpStatus && httpStatus >= 400)
|
|
139
|
+
return { kind: 'registry_unavailable', detail: `registry 返回 HTTP ${httpStatus}` };
|
|
140
|
+
return { kind: 'registry_unavailable', detail: net.code || net.message || '未知错误' };
|
|
141
|
+
}
|
|
142
|
+
// ── 版本标签比较 ────────────────────────────────────────────────────────────
|
|
143
|
+
/** GitHub 上出现过的最高版本号 (Release ∪ Tag, 去掉 v 前缀)。没有 → null。 */
|
|
144
|
+
function newestGithubVersion(facts) {
|
|
145
|
+
const all = [...facts.releases, ...facts.tags.map((t) => t.name)]
|
|
146
|
+
.map((n) => String(n).trim().replace(/^v/, ''))
|
|
147
|
+
.filter((n) => /^\d+\.\d+\.\d+/.test(n));
|
|
148
|
+
if (all.length === 0)
|
|
149
|
+
return null;
|
|
150
|
+
return all.sort((a, b) => (numericCompare(a, b) < 0 ? 1 : -1))[0];
|
|
151
|
+
}
|
|
152
|
+
/** 只比数值段 (与 version-identity 的 compareVersions 同语义, 这里不再反向依赖它)。 */
|
|
153
|
+
function numericCompare(a, b) {
|
|
154
|
+
const p = (v) => v.split('-')[0].split('.').map((x) => parseInt(x.replace(/\D.*$/, ''), 10) || 0);
|
|
155
|
+
const pa = p(a);
|
|
156
|
+
const pb = p(b);
|
|
157
|
+
for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
|
|
158
|
+
const x = pa[i] ?? 0;
|
|
159
|
+
const y = pb[i] ?? 0;
|
|
160
|
+
if (x < y)
|
|
161
|
+
return -1;
|
|
162
|
+
if (x > y)
|
|
163
|
+
return 1;
|
|
164
|
+
}
|
|
165
|
+
return 0;
|
|
166
|
+
}
|
|
167
|
+
function hasName(names, v) {
|
|
168
|
+
const set = new Set(names.map((n) => String(n).trim().replace(/^v/, '')));
|
|
169
|
+
return set.has(v.replace(/^v/, ''));
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* stable 的交叉校验 (§12.1/§12.5): npm 仍是权威, GitHub 只回答"这次发布的记录在不在"。
|
|
173
|
+
*
|
|
174
|
+
* agree npm 的 latest 在 GitHub 上有同名 tag/Release → 两条记录指向同一版
|
|
175
|
+
* mismatch GitHub 记录了**更新的**版本而 registry 上没有 → 拒绝 (不许按 tag 去装)
|
|
176
|
+
* missing_record registry 有该版本但 GitHub 缺这条记录 → **提醒级, 不阻塞** (§12.5 原文:
|
|
177
|
+
* "报发布记录缺 Tag (提醒级, 不阻塞 stable 更新)")
|
|
178
|
+
* no_record_at_all GitHub 上一条版本记录都没有 → 如实报"暂无 tag 可交叉校验"(不编造路径)
|
|
179
|
+
*/
|
|
180
|
+
function crossCheckStable(registryLatest, facts) {
|
|
181
|
+
const common = {
|
|
182
|
+
registryLatest, githubVersion: newestGithubVersion(facts),
|
|
183
|
+
releases: facts.releases.length, tags: facts.tags.length,
|
|
184
|
+
};
|
|
185
|
+
if (!registryLatest) {
|
|
186
|
+
return { ...common, kind: 'no_record_at_all', hasTag: false, hasRelease: false, blocking: false, detail: 'npm 没有给出 latest, 无从交叉校验' };
|
|
187
|
+
}
|
|
188
|
+
const allNames = [...facts.releases, ...facts.tags.map((t) => t.name)];
|
|
189
|
+
const hasTag = hasName(facts.tags.map((t) => t.name), registryLatest);
|
|
190
|
+
const hasRelease = hasName(facts.releases, registryLatest);
|
|
191
|
+
const ghNewest = common.githubVersion;
|
|
192
|
+
/**
|
|
193
|
+
* **先判"GitHub 记录了比 registry 更新的发布"** —— 这是 §12.5 的 "Release 存在但 registry 上没有该版本 → cross_check_mismatch"。
|
|
194
|
+
* 放在 agree 之前: 即使 registry 的 latest 自己也有 tag, 只要 GitHub 上还多出一条更新的发布记录, 两个源对
|
|
195
|
+
* "当前最新是哪一版"就是不一致的 —— 这种不一致必须拦住, 不能因为"latest 有 tag"就宣布一致。
|
|
196
|
+
*/
|
|
197
|
+
if (ghNewest && numericCompare(ghNewest, registryLatest) > 0) {
|
|
198
|
+
return {
|
|
199
|
+
...common, kind: 'mismatch', hasTag, hasRelease, blocking: true,
|
|
200
|
+
detail: `GitHub 上有 ${ghNewest} 的发布记录, 但 npm registry 的 latest 还是 ${registryLatest} — 拒绝按 GitHub 的记录安装`,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
if (hasTag || hasRelease) {
|
|
204
|
+
return {
|
|
205
|
+
...common, kind: 'agree', hasTag, hasRelease, blocking: false,
|
|
206
|
+
detail: `npm latest=${registryLatest} 在 GitHub 上有同名记录 (${hasRelease ? `Release v${registryLatest}` : `Tag v${registryLatest}`}) — 两个源指向同一版`,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
if (allNames.length === 0) {
|
|
210
|
+
return {
|
|
211
|
+
...common, kind: 'no_record_at_all', hasTag: false, hasRelease: false, blocking: false,
|
|
212
|
+
detail: `GitHub 上暂无任何 tag / Release (0 个) — 暂无可交叉校验的记录, npm 仍是权威 (latest=${registryLatest})`,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
...common, kind: 'missing_record', hasTag, hasRelease, blocking: false,
|
|
217
|
+
detail: `npm latest=${registryLatest} 在 GitHub 上没有对应记录 (GitHub 最新版本标签 ${ghNewest || '无'}; Release ${facts.releases.length} 个 / Tag ${facts.tags.length} 个) — 发布记录缺 Tag, 不阻塞 stable 更新`,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
function compareDevSnapshots(installedSha, headSha, ref = `refs/heads/${version_identity_js_1.DEV_BRANCH}`) {
|
|
221
|
+
const short = (s) => (s ? s.slice(0, 7) : '未知');
|
|
222
|
+
if (!headSha) {
|
|
223
|
+
return { ref, headSha, installedSha, same: false, behind: false, detail: `${ref} 的 HEAD 读不到 — 无法判定 dev 快照新旧` };
|
|
224
|
+
}
|
|
225
|
+
if (!installedSha) {
|
|
226
|
+
return { ref, headSha, installedSha, same: false, behind: false, detail: `当前不是 dev 快照 (stable 安装) — 切到 dev 将得到 ${ref} @ ${short(headSha)}` };
|
|
227
|
+
}
|
|
228
|
+
const same = installedSha.slice(0, 7) === headSha.slice(0, 7);
|
|
229
|
+
return {
|
|
230
|
+
ref, headSha, installedSha, same, behind: !same,
|
|
231
|
+
detail: same
|
|
232
|
+
? `已是最新的 dev 快照 (${ref} @ ${short(headSha)}) — 同一个 commit`
|
|
233
|
+
: `dev 快照落后: 已装 ${short(installedSha)} → master HEAD ${short(headSha)} (按 commit sha 判定, 不看版本号)`,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=dual-source-facts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dual-source-facts.js","sourceRoot":"","sources":["../../../src/utils/dual-source-facts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* dual-source.ts — 双源 (npm registry + GitHub) 的**源事实** (2026-09-25, update-protocol §12)
|
|
4
|
+
*
|
|
5
|
+
* 为什么单独一个模块: §1.4 冻结的是 "npm 是唯一稳定渠道", §12 把它改成**双源但权威顺序不变**。
|
|
6
|
+
* 这件事不该塞进 update-manager (那会让"唯一决策者"同时变成"网络客户端"), 也不该让
|
|
7
|
+
* CLI / 健康检查各自造一份 GitHub 事实。所以:
|
|
8
|
+
*
|
|
9
|
+
* - 源事实 (GitHub 可达性 / tag / Release / master HEAD) 只在本模块查
|
|
10
|
+
* - 错误分类 `classifyGithubError` 与 §3 的 `classifyRegistryError` **并列, 不合并**
|
|
11
|
+
* - dev 快照的**取源与构建**也在这里 (update-manager 只负责"切换 + 验证 + 回滚", 不另造一套)
|
|
12
|
+
*
|
|
13
|
+
* 2026-09-26 拆分 (手机端要复用同一份语义): **纯语义那一半**去 `dual-source-facts.ts`
|
|
14
|
+
* (分类 / 交叉校验 / dev 快照比较 —— 无 `node:`, 因此能打进手机端 WebView bundle);
|
|
15
|
+
* 本文件只留**需要网络与子进程**的那一半 (真调 api.github.com / codeload / 现场构建),
|
|
16
|
+
* 并把纯那一半的名字原样再导出 —— 既有 `from './dual-source.js'` 的 import 一行不用改。
|
|
17
|
+
*
|
|
18
|
+
* 硬口径 (§12.5, 验收核心):
|
|
19
|
+
* - 源不可达 / 版本不存在 → **拒绝并说清** (带具体分类), 绝不静默装回旧版
|
|
20
|
+
* - 不编造不存在的路径: 本仓 GitHub 上**真的没有 Release** (0 个), 所以 "Release 缺" 时
|
|
21
|
+
* 如实报 "发布记录缺 Tag / Release" (提醒级), **不是** fake 一个 Release 出来
|
|
22
|
+
*/
|
|
23
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
26
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
27
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
28
|
+
}
|
|
29
|
+
Object.defineProperty(o, k2, desc);
|
|
30
|
+
}) : (function(o, m, k, k2) {
|
|
31
|
+
if (k2 === undefined) k2 = k;
|
|
32
|
+
o[k2] = m[k];
|
|
33
|
+
}));
|
|
34
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
35
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
36
|
+
}) : function(o, v) {
|
|
37
|
+
o["default"] = v;
|
|
38
|
+
});
|
|
39
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
40
|
+
var ownKeys = function(o) {
|
|
41
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
42
|
+
var ar = [];
|
|
43
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
44
|
+
return ar;
|
|
45
|
+
};
|
|
46
|
+
return ownKeys(o);
|
|
47
|
+
};
|
|
48
|
+
return function (mod) {
|
|
49
|
+
if (mod && mod.__esModule) return mod;
|
|
50
|
+
var result = {};
|
|
51
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
52
|
+
__setModuleDefault(result, mod);
|
|
53
|
+
return result;
|
|
54
|
+
};
|
|
55
|
+
})();
|
|
56
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
57
|
+
exports.DEV_CHANNEL_WARNING = exports.compareDevSnapshots = exports.crossCheckStable = exports.renderGithubReportLine = exports.toGithubReport = exports.numericCompare = exports.newestGithubVersion = exports.classifyRegistryError = exports.classifyGithubError = exports.OFFLINE_CODES = exports.GITHUB_REASONS = void 0;
|
|
58
|
+
exports.fetchGithubFacts = fetchGithubFacts;
|
|
59
|
+
exports.prepareDevSnapshot = prepareDevSnapshot;
|
|
60
|
+
const fs = __importStar(require("fs"));
|
|
61
|
+
const fsp = __importStar(require("fs/promises"));
|
|
62
|
+
const path = __importStar(require("path"));
|
|
63
|
+
const http = __importStar(require("http"));
|
|
64
|
+
const https = __importStar(require("https"));
|
|
65
|
+
const child_process_1 = require("child_process");
|
|
66
|
+
const version_info_js_1 = require("./version-info.js");
|
|
67
|
+
const dual_source_facts_js_1 = require("./dual-source-facts.js");
|
|
68
|
+
/**
|
|
69
|
+
* 纯语义那一半 (错误分类 / 交叉校验 / dev 快照比较 / 报告渲染) —— **唯一一份在
|
|
70
|
+
* `dual-source-facts.ts`** (桌面与手机端共用)。这里原样再导出: 桌面既有 import 路径不变,
|
|
71
|
+
* 手机端 WebView 直接 import 那份纯模块 (没有 `node:` ⇒ 能进 bundle)。
|
|
72
|
+
*/
|
|
73
|
+
var dual_source_facts_js_2 = require("./dual-source-facts.js");
|
|
74
|
+
Object.defineProperty(exports, "GITHUB_REASONS", { enumerable: true, get: function () { return dual_source_facts_js_2.GITHUB_REASONS; } });
|
|
75
|
+
Object.defineProperty(exports, "OFFLINE_CODES", { enumerable: true, get: function () { return dual_source_facts_js_2.OFFLINE_CODES; } });
|
|
76
|
+
Object.defineProperty(exports, "classifyGithubError", { enumerable: true, get: function () { return dual_source_facts_js_2.classifyGithubError; } });
|
|
77
|
+
Object.defineProperty(exports, "classifyRegistryError", { enumerable: true, get: function () { return dual_source_facts_js_2.classifyRegistryError; } });
|
|
78
|
+
Object.defineProperty(exports, "newestGithubVersion", { enumerable: true, get: function () { return dual_source_facts_js_2.newestGithubVersion; } });
|
|
79
|
+
Object.defineProperty(exports, "numericCompare", { enumerable: true, get: function () { return dual_source_facts_js_2.numericCompare; } });
|
|
80
|
+
Object.defineProperty(exports, "toGithubReport", { enumerable: true, get: function () { return dual_source_facts_js_2.toGithubReport; } });
|
|
81
|
+
Object.defineProperty(exports, "renderGithubReportLine", { enumerable: true, get: function () { return dual_source_facts_js_2.renderGithubReportLine; } });
|
|
82
|
+
Object.defineProperty(exports, "crossCheckStable", { enumerable: true, get: function () { return dual_source_facts_js_2.crossCheckStable; } });
|
|
83
|
+
Object.defineProperty(exports, "compareDevSnapshots", { enumerable: true, get: function () { return dual_source_facts_js_2.compareDevSnapshots; } });
|
|
84
|
+
Object.defineProperty(exports, "DEV_CHANNEL_WARNING", { enumerable: true, get: function () { return dual_source_facts_js_2.DEV_CHANNEL_WARNING; } });
|
|
85
|
+
/** 可选 GitHub token (只为提配额: 匿名 60 次/小时, 认证 5000 次/小时)。**永不打印、永不入库**。 */
|
|
86
|
+
function githubToken(env = process.env) {
|
|
87
|
+
const t = env.GITHUB_TOKEN || env.GH_TOKEN || env.BOLLOON_GITHUB_TOKEN;
|
|
88
|
+
return t && String(t).trim() ? String(t).trim() : null;
|
|
89
|
+
}
|
|
90
|
+
function httpGetRaw(url, timeoutMs, token) {
|
|
91
|
+
return new Promise((resolve, reject) => {
|
|
92
|
+
const client = url.startsWith('https') ? https : http;
|
|
93
|
+
const req = client.get(url, {
|
|
94
|
+
timeout: timeoutMs,
|
|
95
|
+
headers: {
|
|
96
|
+
Accept: 'application/vnd.github+json, application/json',
|
|
97
|
+
'User-Agent': 'bolloon-update',
|
|
98
|
+
// token 只进请求头, 不进日志/状态/输出 (凭证红线)
|
|
99
|
+
...(token ? { Authorization: `Bearer ${token}` } : {}),
|
|
100
|
+
},
|
|
101
|
+
}, (res) => {
|
|
102
|
+
let data = '';
|
|
103
|
+
res.on('data', (c) => { data += c; });
|
|
104
|
+
res.on('end', () => resolve({ status: res.statusCode || 0, body: data, headers: (res.headers || {}) }));
|
|
105
|
+
});
|
|
106
|
+
req.on('error', reject);
|
|
107
|
+
req.on('timeout', () => { req.destroy(new Error('timeout')); });
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 查 GitHub 的三个事实: Releases / Tags / master HEAD。
|
|
112
|
+
* **任何一个请求失败 → 整条 `github_unavailable`** (带分类), 但把已拿到的那部分 facts 一起带回去
|
|
113
|
+
* (上层因此能说清"哪些拿到了、哪些没拿到", 而不是一句"更新失败")。
|
|
114
|
+
*/
|
|
115
|
+
async function fetchGithubFacts(opts = {}) {
|
|
116
|
+
const base = (opts.apiBase || version_info_js_1.GITHUB_API_BASE).replace(/\/+$/, '');
|
|
117
|
+
const slug = opts.slug || version_info_js_1.GITHUB_UPSTREAM_SLUG;
|
|
118
|
+
const timeout = opts.timeoutMs ?? 10000;
|
|
119
|
+
// 有 token 就用 (配额 60/h → 5000/h); 没有也能跑, 只是可能 403 限流
|
|
120
|
+
const token = opts.token !== undefined ? opts.token : githubToken();
|
|
121
|
+
const missing = [];
|
|
122
|
+
let releases = [];
|
|
123
|
+
let tags = [];
|
|
124
|
+
let headSha = null;
|
|
125
|
+
/** 失败累积 (第一个失败决定分类, 但所有失败都记进 missing) */
|
|
126
|
+
const failures = [];
|
|
127
|
+
const note = (e, what) => {
|
|
128
|
+
missing.push(what);
|
|
129
|
+
failures.push({ reason: e.reason, detail: `${what}: ${e.detail}`, retryAt: e.retryAt });
|
|
130
|
+
};
|
|
131
|
+
// 1. Releases (本仓真的没有 → 200 + [] , 不是错误)
|
|
132
|
+
try {
|
|
133
|
+
const r = await httpGetRaw(`${base}/repos/${slug}/releases?per_page=100`, timeout, token);
|
|
134
|
+
if (r.status >= 200 && r.status < 300) {
|
|
135
|
+
const arr = JSON.parse(r.body);
|
|
136
|
+
releases = Array.isArray(arr) ? arr.map((x) => String(x?.tag_name || '')).filter(Boolean) : [];
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
note((0, dual_source_facts_js_1.classifyGithubError)(null, r.status, r.headers), 'releases');
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch (e) {
|
|
143
|
+
note((0, dual_source_facts_js_1.classifyGithubError)(e), 'releases');
|
|
144
|
+
}
|
|
145
|
+
// 2. Tags
|
|
146
|
+
try {
|
|
147
|
+
const r = await httpGetRaw(`${base}/repos/${slug}/tags?per_page=100`, timeout, token);
|
|
148
|
+
if (r.status >= 200 && r.status < 300) {
|
|
149
|
+
const arr = JSON.parse(r.body);
|
|
150
|
+
tags = Array.isArray(arr)
|
|
151
|
+
? arr.map((x) => ({ name: String(x?.name || ''), sha: x?.commit?.sha ? String(x.commit.sha) : null })).filter((t) => t.name)
|
|
152
|
+
: [];
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
note((0, dual_source_facts_js_1.classifyGithubError)(null, r.status, r.headers), 'tags');
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch (e) {
|
|
159
|
+
note((0, dual_source_facts_js_1.classifyGithubError)(e), 'tags');
|
|
160
|
+
}
|
|
161
|
+
// 3. master HEAD (dev 通道的身份来源)
|
|
162
|
+
try {
|
|
163
|
+
const r = await httpGetRaw(`${base}/repos/${slug}/commits/${version_info_js_1.DEV_BRANCH}`, timeout, token);
|
|
164
|
+
if (r.status >= 200 && r.status < 300) {
|
|
165
|
+
const j = JSON.parse(r.body);
|
|
166
|
+
headSha = j?.sha ? String(j.sha) : null;
|
|
167
|
+
if (!headSha)
|
|
168
|
+
note({ reason: 'parse_error', detail: 'commits/master 没有 sha 字段', retryAt: null }, 'head');
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
// 404 在这里的语义就是"没有 master 分支"(§12.3)
|
|
172
|
+
note((0, dual_source_facts_js_1.classifyGithubError)(null, r.status, r.headers), 'head');
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch (e) {
|
|
176
|
+
note((0, dual_source_facts_js_1.classifyGithubError)(e), 'head');
|
|
177
|
+
}
|
|
178
|
+
const facts = {
|
|
179
|
+
slug, ref: `refs/heads/${version_info_js_1.DEV_BRANCH}`, headSha, releases, tags,
|
|
180
|
+
fetchedAt: new Date().toISOString(), partial: missing.length > 0, missing,
|
|
181
|
+
};
|
|
182
|
+
if (failures.length > 0) {
|
|
183
|
+
const first = failures[0];
|
|
184
|
+
return { ok: false, kind: 'github_unavailable', reason: first.reason, detail: first.detail, retryAt: first.retryAt, facts };
|
|
185
|
+
}
|
|
186
|
+
return { ok: true, facts };
|
|
187
|
+
}
|
|
188
|
+
function defaultRunNpm(args, cwd) {
|
|
189
|
+
const r = (0, child_process_1.spawnSync)('npm', args, { cwd, encoding: 'utf-8', timeout: 900_000, maxBuffer: 32 * 1024 * 1024 });
|
|
190
|
+
return { code: r.status ?? 1, stdout: r.stdout || '', stderr: r.stderr || '' };
|
|
191
|
+
}
|
|
192
|
+
/** 从 GitHub 取 master 的源码快照 (codeload tarball); 解到 destParent。 */
|
|
193
|
+
async function downloadGithubSnapshot(sha, destParent, env, timeoutMs) {
|
|
194
|
+
const template = env.BOLLOON_DEV_TARBALL_URL
|
|
195
|
+
|| `https://codeload.github.com/${version_info_js_1.GITHUB_UPSTREAM_SLUG}/tar.gz/{sha}`;
|
|
196
|
+
const url = template.replace('{sha}', sha).replace('{branch}', version_info_js_1.DEV_BRANCH);
|
|
197
|
+
await fsp.mkdir(destParent, { recursive: true });
|
|
198
|
+
const file = path.join(destParent, `dev-${sha.slice(0, 7)}.tar.gz`);
|
|
199
|
+
try {
|
|
200
|
+
const buf = await new Promise((resolve, reject) => {
|
|
201
|
+
const client = url.startsWith('https') ? https : http;
|
|
202
|
+
const tk = githubToken(env);
|
|
203
|
+
const req = client.get(url, { timeout: timeoutMs, headers: { 'User-Agent': 'bolloon-update', ...(tk ? { Authorization: `Bearer ${tk}` } : {}) } }, (res) => {
|
|
204
|
+
if ((res.statusCode || 0) >= 400) {
|
|
205
|
+
reject((0, dual_source_facts_js_1.classifyGithubError)(null, res.statusCode, res.headers));
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
const chunks = [];
|
|
209
|
+
res.on('data', (c) => chunks.push(c));
|
|
210
|
+
res.on('end', () => resolve(Buffer.concat(chunks)));
|
|
211
|
+
});
|
|
212
|
+
req.on('error', reject);
|
|
213
|
+
req.on('timeout', () => { req.destroy(new Error('timeout')); });
|
|
214
|
+
});
|
|
215
|
+
await fsp.writeFile(file, buf);
|
|
216
|
+
}
|
|
217
|
+
catch (e) {
|
|
218
|
+
const cls = e?.kind === 'github_unavailable' ? e : (0, dual_source_facts_js_1.classifyGithubError)(e);
|
|
219
|
+
return { ok: false, kind: 'github_unavailable', reason: cls.reason, detail: `取 ${url} 失败: ${cls.detail}` };
|
|
220
|
+
}
|
|
221
|
+
const extract = path.join(destParent, 'src');
|
|
222
|
+
await fsp.mkdir(extract, { recursive: true });
|
|
223
|
+
const tar = (0, child_process_1.spawnSync)('tar', ['-xzf', file, '-C', extract], { encoding: 'utf-8', timeout: 300_000 });
|
|
224
|
+
if (tar.status !== 0)
|
|
225
|
+
return { ok: false, kind: 'github_unavailable', reason: 'http_error', detail: `解压快照失败: ${String(tar.stderr || '').slice(0, 200)}` };
|
|
226
|
+
const kids = (await fsp.readdir(extract)).filter((f) => !f.startsWith('.'));
|
|
227
|
+
if (kids.length !== 1)
|
|
228
|
+
return { ok: false, kind: 'github_unavailable', reason: 'http_error', detail: `快照解压后目录数不是 1 (${kids.length})` };
|
|
229
|
+
return { ok: true, dir: path.join(extract, kids[0]), source: 'github-tarball' };
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* 把 master HEAD 的一个 commit 变成**可安装的 dev 快照 tarball**:
|
|
233
|
+
* 取源码 → 校验 sha (本地源码树必须对得上) → 版本改成 `<base>+dev.<sha7>` → 需要时构建 → npm pack
|
|
234
|
+
*
|
|
235
|
+
* 复用原则 (§5 的刻意偏差): **不另造一套替换机制** —— 产物仍是 tarball, 仍交给 npm 替换,
|
|
236
|
+
* 仍然"切换后验证 + 失败回滚"。这里只负责"从哪个源取、装出来是什么身份"。
|
|
237
|
+
*/
|
|
238
|
+
async function prepareDevSnapshot(opts) {
|
|
239
|
+
const env = opts.env ?? process.env;
|
|
240
|
+
const runNpm = opts.runNpm || defaultRunNpm;
|
|
241
|
+
const stage = (s, d) => { try {
|
|
242
|
+
opts.onStage?.(s, d);
|
|
243
|
+
}
|
|
244
|
+
catch { /* 回调不许影响流程 */ } };
|
|
245
|
+
const sha = String(opts.sha || '').trim();
|
|
246
|
+
if (!/^[0-9a-f]{7,40}$/i.test(sha)) {
|
|
247
|
+
return { ok: false, kind: 'github_unavailable', reason: 'not_found', detail: `master HEAD 的 sha 不合法 (${sha || '空'}) — 拒绝按未知 commit 安装` };
|
|
248
|
+
}
|
|
249
|
+
let dir = '';
|
|
250
|
+
let source = '';
|
|
251
|
+
const envDir = env.BOLLOON_DEV_SOURCE_DIR;
|
|
252
|
+
if (envDir) {
|
|
253
|
+
if (!fs.existsSync(path.join(envDir, 'package.json'))) {
|
|
254
|
+
return { ok: false, kind: 'dev_source_failed', reason: 'source_dir_missing', detail: `BOLLOON_DEV_SOURCE_DIR=${envDir} 下没有 package.json` };
|
|
255
|
+
}
|
|
256
|
+
// 本地源码树必须**真的**是这个 commit —— 否则不许把它当 master HEAD 的快照
|
|
257
|
+
const local = (0, child_process_1.spawnSync)('git', ['-C', envDir, 'rev-parse', 'HEAD'], { encoding: 'utf-8', timeout: 10_000, stdio: ['ignore', 'pipe', 'ignore'] });
|
|
258
|
+
const localSha = (local.stdout || '').trim();
|
|
259
|
+
if (local.status !== 0 || !localSha) {
|
|
260
|
+
if (env.BOLLOON_DEV_ALLOW_UNVERIFIED_SOURCE !== '1') {
|
|
261
|
+
return { ok: false, kind: 'dev_source_failed', reason: 'sha_unverifiable', detail: `${envDir} 不是 git 检出, 无法核对 sha=${sha.slice(0, 7)} (要强制使用请设 BOLLOON_DEV_ALLOW_UNVERIFIED_SOURCE=1)` };
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
else if (!localSha.startsWith(sha.slice(0, 7)) && !sha.startsWith(localSha.slice(0, 7))) {
|
|
265
|
+
return { ok: false, kind: 'dev_source_failed', reason: 'sha_mismatch', detail: `${envDir} 的 HEAD 是 ${localSha.slice(0, 7)}, 与 master HEAD ${sha.slice(0, 7)} 不是同一个 commit — 拒绝用错的源码做 dev 快照` };
|
|
266
|
+
}
|
|
267
|
+
dir = envDir;
|
|
268
|
+
source = `local-tree@${(localSha || sha).slice(0, 7)}`;
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
stage('downloading', `取 GitHub master @ ${sha.slice(0, 7)}`);
|
|
272
|
+
const dl = await downloadGithubSnapshot(sha, opts.workDir, env, opts.timeoutMs ?? 120_000);
|
|
273
|
+
if (!dl.ok)
|
|
274
|
+
return dl;
|
|
275
|
+
dir = dl.dir;
|
|
276
|
+
source = dl.source;
|
|
277
|
+
}
|
|
278
|
+
// 身份 = 源码树自己的版本号 + dev.<sha>
|
|
279
|
+
const pkg = (0, version_info_js_1.readPackageAt)(dir);
|
|
280
|
+
if (!pkg?.version)
|
|
281
|
+
return { ok: false, kind: 'dev_source_failed', reason: 'no_version', detail: `${dir}/package.json 读不到版本` };
|
|
282
|
+
const baseVersion = (0, version_info_js_1.baseVersionOf)(String(pkg.version));
|
|
283
|
+
const identity = (0, version_info_js_1.devIdentity)(baseVersion, sha);
|
|
284
|
+
stage('staged', `打上 dev 身份 ${identity}`);
|
|
285
|
+
// 需要时构建 (GitHub tarball 里没有 dist/; 本地树通常已构建)
|
|
286
|
+
let built = false;
|
|
287
|
+
if (!fs.existsSync(path.join(dir, 'dist', 'cli-entry.js'))) {
|
|
288
|
+
stage('staged', '源码树缺少 dist/, 先装依赖再构建 (npm run build:main)');
|
|
289
|
+
if (!fs.existsSync(path.join(dir, 'node_modules'))) {
|
|
290
|
+
/**
|
|
291
|
+
* 验收加速开关: 把已有 node_modules 直接软链进来, 跳过 `npm install` (本仓依赖 889MB)。
|
|
292
|
+
* **只省"装依赖"这一步**, 构建与打包仍然真跑 —— 刻意留给验收脚本用, 别在生产路径上设。
|
|
293
|
+
*/
|
|
294
|
+
const reuse = env.BOLLOON_DEV_REUSE_NODE_MODULES;
|
|
295
|
+
if (reuse && fs.existsSync(path.join(reuse, '.bin'))) {
|
|
296
|
+
stage('staged', `复用现成依赖 (${reuse}) 跳过 npm install`);
|
|
297
|
+
try {
|
|
298
|
+
fs.symlinkSync(reuse, path.join(dir, 'node_modules'), 'dir');
|
|
299
|
+
}
|
|
300
|
+
catch { /* 已存在就跳过 */ }
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
const inst = runNpm(['install', '--no-audit', '--no-fund', '--loglevel=error', '--fetch-retries=5'], dir);
|
|
304
|
+
if (inst.code !== 0) {
|
|
305
|
+
return { ok: false, kind: 'dev_source_failed', reason: 'npm_install_failed', detail: `dev 快照装依赖失败: ${(inst.stderr || inst.stdout).slice(0, 400)}` };
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* 从 git 源码树构建要**两步** (真跑踩到的坑):
|
|
311
|
+
* ① `npm run build --workspaces --if-present` —— 先建 workspace 依赖 (@bolloon/constraint-runtime),
|
|
312
|
+
* 否则根包 tsc 会因为 `../constraint-runtime/dist/tools/...` 不存在而直接报 TS2307;
|
|
313
|
+
* ② `npm run build:main` —— 再建根包 (tsc + copy-constraint-runtime)。
|
|
314
|
+
* 原来只跑 ②, 在**干净源码树**上必失败 —— 这个坑只有真从 git 建一次才会暴露。
|
|
315
|
+
*/
|
|
316
|
+
const buildWs = runNpm(['run', 'build', '--workspaces', '--if-present', '--loglevel=error'], dir);
|
|
317
|
+
if (buildWs.code !== 0) {
|
|
318
|
+
return { ok: false, kind: 'dev_source_failed', reason: 'build_failed', detail: `dev 快照构建 workspace 依赖失败: ${(buildWs.stderr || buildWs.stdout).slice(0, 400)}` };
|
|
319
|
+
}
|
|
320
|
+
const build = runNpm(['run', 'build:main'], dir);
|
|
321
|
+
if (build.code !== 0) {
|
|
322
|
+
return { ok: false, kind: 'dev_source_failed', reason: 'build_failed', detail: `dev 快照构建失败: ${(build.stderr || build.stdout).slice(0, 400)}` };
|
|
323
|
+
}
|
|
324
|
+
built = true;
|
|
325
|
+
}
|
|
326
|
+
// 写身份 (改 package.json 的版本身份 + 一个可核对的标记文件)
|
|
327
|
+
const pkgPath = path.join(dir, 'package.json');
|
|
328
|
+
const raw = JSON.parse(await fsp.readFile(pkgPath, 'utf8'));
|
|
329
|
+
raw.version = identity;
|
|
330
|
+
await fsp.writeFile(pkgPath, JSON.stringify(raw, null, 2) + '\n', 'utf8');
|
|
331
|
+
await fsp.writeFile(path.join(dir, '.bolloon-dev-snapshot.json'), JSON.stringify({
|
|
332
|
+
channel: 'dev', ref: `refs/heads/${version_info_js_1.DEV_BRANCH}`, sha, identity, source, built,
|
|
333
|
+
builtAt: new Date().toISOString(),
|
|
334
|
+
warning: version_info_js_1.DEV_CHANNEL_WARNING,
|
|
335
|
+
}, null, 2) + '\n', 'utf8');
|
|
336
|
+
// 打包 (产物仍是 tarball → 交给 npm 替换, 不另造一套)
|
|
337
|
+
const pack = runNpm(['pack', dir, '--pack-destination', opts.workDir, '--loglevel=error'], opts.workDir);
|
|
338
|
+
if (pack.code !== 0) {
|
|
339
|
+
return { ok: false, kind: 'dev_source_failed', reason: 'pack_failed', detail: `dev 快照打包失败: ${(pack.stderr || pack.stdout).slice(0, 400)}` };
|
|
340
|
+
}
|
|
341
|
+
const tgzs = (await fsp.readdir(opts.workDir)).filter((f) => f.endsWith('.tgz') && f.includes('bolloon-agent'));
|
|
342
|
+
if (tgzs.length === 0)
|
|
343
|
+
return { ok: false, kind: 'dev_source_failed', reason: 'no_tarball', detail: 'npm pack 没有产出 tarball' };
|
|
344
|
+
const tarball = path.join(opts.workDir, tgzs.sort()[tgzs.length - 1]);
|
|
345
|
+
return { ok: true, dir, tarball, identity, sha, baseVersion, source, built };
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=dual-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dual-source.js","sourceRoot":"","sources":["../../../src/utils/dual-source.ts"],"names":[],"mappings":"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"}
|