tailii-host 0.3.0 → 0.5.0

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.
Files changed (75) hide show
  1. package/README.md +1 -0
  2. package/dist/approval/hook.js +10 -0
  3. package/dist/approval/hook.js.map +1 -1
  4. package/dist/backend/herdr.d.ts +48 -4
  5. package/dist/backend/herdr.js +130 -15
  6. package/dist/backend/herdr.js.map +1 -1
  7. package/dist/backend/tmux.d.ts +1 -1
  8. package/dist/backend/tmux.js +11 -2
  9. package/dist/backend/tmux.js.map +1 -1
  10. package/dist/chat/subagentTailer.d.ts +41 -0
  11. package/dist/chat/subagentTailer.js +306 -26
  12. package/dist/chat/subagentTailer.js.map +1 -1
  13. package/dist/chat/transcriptTailer.d.ts +9 -0
  14. package/dist/chat/transcriptTailer.js +55 -1
  15. package/dist/chat/transcriptTailer.js.map +1 -1
  16. package/dist/cli.js +10 -1
  17. package/dist/cli.js.map +1 -1
  18. package/dist/codex/codexAppServer.js +20 -0
  19. package/dist/codex/codexAppServer.js.map +1 -1
  20. package/dist/commands/doctor.d.ts +2 -6
  21. package/dist/commands/doctor.js +2 -29
  22. package/dist/commands/doctor.js.map +1 -1
  23. package/dist/commands/launch.d.ts +2 -0
  24. package/dist/commands/launch.js +5 -0
  25. package/dist/commands/launch.js.map +1 -1
  26. package/dist/commands/selfUpdate.d.ts +71 -0
  27. package/dist/commands/selfUpdate.js +536 -0
  28. package/dist/commands/selfUpdate.js.map +1 -0
  29. package/dist/engine/engine.js +41 -22
  30. package/dist/engine/engine.js.map +1 -1
  31. package/dist/engine/handlers/index.js +2 -0
  32. package/dist/engine/handlers/index.js.map +1 -1
  33. package/dist/engine/handlers/selfUpdate.d.ts +2 -0
  34. package/dist/engine/handlers/selfUpdate.js +52 -0
  35. package/dist/engine/handlers/selfUpdate.js.map +1 -0
  36. package/dist/engine/handlers/session.js +5 -3
  37. package/dist/engine/handlers/session.js.map +1 -1
  38. package/dist/engine/handlers/workspace.js +38 -1
  39. package/dist/engine/handlers/workspace.js.map +1 -1
  40. package/dist/hub/effortDialog.d.ts +20 -0
  41. package/dist/hub/effortDialog.js +40 -0
  42. package/dist/hub/effortDialog.js.map +1 -0
  43. package/dist/hub/hubDaemon.js +12 -1
  44. package/dist/hub/hubDaemon.js.map +1 -1
  45. package/dist/hub/questionInjection.js +2 -1
  46. package/dist/hub/questionInjection.js.map +1 -1
  47. package/dist/hub/reaper.d.ts +5 -0
  48. package/dist/hub/reaper.js +25 -7
  49. package/dist/hub/reaper.js.map +1 -1
  50. package/dist/hub/sessionHub.js +83 -11
  51. package/dist/hub/sessionHub.js.map +1 -1
  52. package/dist/protocol/decode.js +54 -1
  53. package/dist/protocol/decode.js.map +1 -1
  54. package/dist/protocol/encode.js +2 -0
  55. package/dist/protocol/encode.js.map +1 -1
  56. package/dist/protocol/messages.d.ts +60 -1
  57. package/dist/services/fileService.d.ts +19 -1
  58. package/dist/services/fileService.js +126 -0
  59. package/dist/services/fileService.js.map +1 -1
  60. package/dist/services/keychainMirror.d.ts +9 -0
  61. package/dist/services/keychainMirror.js +64 -0
  62. package/dist/services/keychainMirror.js.map +1 -0
  63. package/dist/services/officialApps.d.ts +3 -0
  64. package/dist/services/officialApps.js +28 -7
  65. package/dist/services/officialApps.js.map +1 -1
  66. package/dist/services/planUsageFetcher.d.ts +18 -2
  67. package/dist/services/planUsageFetcher.js +75 -16
  68. package/dist/services/planUsageFetcher.js.map +1 -1
  69. package/dist/shared/cliVersions.d.ts +14 -0
  70. package/dist/shared/cliVersions.js +38 -0
  71. package/dist/shared/cliVersions.js.map +1 -0
  72. package/dist/shared/lineWriter.d.ts +7 -0
  73. package/dist/shared/lineWriter.js +26 -0
  74. package/dist/shared/lineWriter.js.map +1 -1
  75. package/package.json +3 -3
@@ -0,0 +1,536 @@
1
+ // selfUpdate.ts — host の自己更新(アプリのピン値へ収束させる pull 型アップデータ)
2
+ //
3
+ // iPhone アプリが channel_hello の serverVersion と自分のピン値を照合し、
4
+ // host が古ければ host_update_request → engine が本コマンドを detached で起動する。
5
+ // 本コマンドは「今走っている旧バージョンのコード」で新バージョンを設置する
6
+ // 自己完結トランザクション(新旧バージョン間の CLI 契約は `--version` のみ。凍結)。
7
+ //
8
+ // トランザクション:
9
+ // 検証(managed/ダウングレード/lock) → registry メタ取得 → engines.node 事前検査
10
+ // → tarball DL + SRI 検証(アプリ同梱 integrity を優先) → system tar で展開
11
+ // → deps(ws / qrcode-terminal / QUIC prebuilt) を registry から配置
12
+ // → スモーク(新 cli --version) → シム atomic swap(旧シムは .prev に保存)
13
+ // → QUIC LaunchAgent 再設置(設置済みホストのみ) → 旧版 GC
14
+ //
15
+ // 常駐プロセスの世代交代は既存機構に委ねる: アプリ再接続で旧 engine は EOF 死、
16
+ // 新 engine の ensureHubDaemon が version 不一致の旧 hub を SIGTERM で退かせる。
17
+ //
18
+ // 失敗は ~/.tailii/host/last-update.json に記録し、次回 channel_hello の
19
+ // updateError としてアプリへ届く(成功は serverVersion の変化そのものが証明)。
20
+ import { execFile, spawn } from "node:child_process";
21
+ import * as crypto from "node:crypto";
22
+ import * as fs from "node:fs";
23
+ import * as os from "node:os";
24
+ import * as path from "node:path";
25
+ import { defaultShimBinDir, resolveOwnCliPath, shimContent } from "./doctor.js";
26
+ import { readPackageVersion } from "../shared/version.js";
27
+ import { installQuicLaunchAgent, quicLaunchAgentPlistPath, } from "../services/quicGateway.js";
28
+ const PACKAGE_NAME = "tailii-host";
29
+ /** npm registry のベース URL(`TAILII_NPM_REGISTRY` でミラー/テスト差し替え可)。 */
30
+ function registryBase() {
31
+ const override = process.env["TAILII_NPM_REGISTRY"];
32
+ return override !== undefined && override !== "" ? override.replace(/\/$/, "") : "https://registry.npmjs.org";
33
+ }
34
+ // MARK: - 置き場所
35
+ /** self-update の管理ルート(この下だけを所有・GC する)。 */
36
+ export function selfUpdateRoot() {
37
+ return path.join(os.homedir(), ".tailii", "host");
38
+ }
39
+ export function versionsDir() {
40
+ return path.join(selfUpdateRoot(), "versions");
41
+ }
42
+ export function updateLockPath() {
43
+ return path.join(selfUpdateRoot(), "update.lock");
44
+ }
45
+ export function lastUpdatePath() {
46
+ return path.join(selfUpdateRoot(), "last-update.json");
47
+ }
48
+ export function updateLogPath() {
49
+ return path.join(selfUpdateRoot(), "update.log");
50
+ }
51
+ // MARK: - semver(依存ゼロの最小実装。tailii-host の実運用範囲 = 素の x.y.z と ^x.y.z のみ)
52
+ /** "x.y.z" を数値トリプルへ。プレリリース等の非対応形式は null。 */
53
+ export function parseTriple(version) {
54
+ const m = /^(\d+)\.(\d+)\.(\d+)$/.exec(version.trim());
55
+ if (m === null)
56
+ return null;
57
+ return [Number(m[1]), Number(m[2]), Number(m[3])];
58
+ }
59
+ /** トリプル比較(a<b: -1, a==b: 0, a>b: 1)。 */
60
+ export function compareTriple(a, b) {
61
+ for (let i = 0; i < 3; i++) {
62
+ if (a[i] !== b[i])
63
+ return a[i] < b[i] ? -1 : 1;
64
+ }
65
+ return 0;
66
+ }
67
+ /**
68
+ * caret / 完全一致 range を満たす最大バージョンを候補から選ぶ。
69
+ * 対応 range は "x.y.z" と "^x.y.z" のみ(package.json の実依存で使う形だけ)。
70
+ * 非対応 range は null(呼び出し元が明示エラーにする — 黙って別解釈をしない)。
71
+ */
72
+ export function maxSatisfying(versions, range) {
73
+ const caret = range.startsWith("^");
74
+ const base = parseTriple(caret ? range.slice(1) : range);
75
+ if (base === null)
76
+ return null;
77
+ let best = null;
78
+ let bestRaw = null;
79
+ for (const raw of versions) {
80
+ const v = parseTriple(raw);
81
+ if (v === null)
82
+ continue;
83
+ if (caret) {
84
+ // ^x.y.z: 同 major(major=0 は同 minor)かつ base 以上。
85
+ if (base[0] === 0 ? v[0] !== 0 || v[1] !== base[1] : v[0] !== base[0])
86
+ continue;
87
+ if (compareTriple(v, base) < 0)
88
+ continue;
89
+ }
90
+ else if (compareTriple(v, base) !== 0) {
91
+ continue;
92
+ }
93
+ if (best === null || compareTriple(v, best) > 0) {
94
+ best = v;
95
+ bestRaw = raw;
96
+ }
97
+ }
98
+ return bestRaw;
99
+ }
100
+ /**
101
+ * engines.node(">=x" / ">=x.y" / ">=x.y.z")から最低バージョンを読む。
102
+ * 解釈できない形式は null(スモークテストが実挙動の最終ゲートなので、ここは fast-fail 用)。
103
+ */
104
+ export function parseEnginesNodeMinimum(range) {
105
+ if (range === undefined)
106
+ return null;
107
+ const m = /^\s*>=\s*(\d+)(?:\.(\d+))?(?:\.(\d+))?\s*$/.exec(range);
108
+ if (m === null)
109
+ return null;
110
+ return [Number(m[1]), Number(m[2] ?? "0"), Number(m[3] ?? "0")];
111
+ }
112
+ // MARK: - 整合性検証
113
+ /** SRI sha512 を計算する(npm dist.integrity と同形式)。 */
114
+ export function sriSha512(data) {
115
+ return "sha512-" + crypto.createHash("sha512").update(data).digest("base64");
116
+ }
117
+ /** SRI(sha512-…)または旧 shasum(sha1 hex)で tarball を検証する。 */
118
+ export function verifyTarball(data, expected) {
119
+ if (expected.integrity !== undefined) {
120
+ const actual = sriSha512(data);
121
+ if (expected.integrity.startsWith("sha512-")) {
122
+ return actual === expected.integrity
123
+ ? { ok: true, detail: "sha512" }
124
+ : { ok: false, detail: `integrity 不一致 expected=${expected.integrity} actual=${actual}` };
125
+ }
126
+ // sha512 以外の SRI は検証不能として shasum へフォールバックする。
127
+ }
128
+ if (expected.shasum !== undefined) {
129
+ const actual = crypto.createHash("sha1").update(data).digest("hex");
130
+ return actual === expected.shasum
131
+ ? { ok: true, detail: "sha1" }
132
+ : { ok: false, detail: `shasum 不一致 expected=${expected.shasum} actual=${actual}` };
133
+ }
134
+ return { ok: false, detail: "registry に検証可能なハッシュがありません" };
135
+ }
136
+ /**
137
+ * 現在の実行元が自動更新の対象かを判定する。
138
+ * dev-install — パッケージルートに src/ や .git がある(git clone 開発機)。
139
+ * published tarball は dist のみなので、この検査で確実に区別できる。
140
+ * no-shim — アプリが実行するシムが無い(差し替え対象が存在しない)。
141
+ * foreign-shim — シムはあるがマーカーが無い(ユーザー手動管理。壊さない)。
142
+ */
143
+ export function resolveInstallState(cliPath = resolveOwnCliPath(), shimBinDir = defaultShimBinDir()) {
144
+ const pkgRoot = path.join(path.dirname(cliPath), "..");
145
+ if (fs.existsSync(path.join(pkgRoot, "src")) || fs.existsSync(path.join(pkgRoot, ".git"))) {
146
+ return { managed: false, reason: "dev-install" };
147
+ }
148
+ const shimPath = path.join(shimBinDir, "tailii-host");
149
+ let shim;
150
+ try {
151
+ shim = fs.readFileSync(shimPath, "utf8");
152
+ }
153
+ catch {
154
+ return { managed: false, reason: "no-shim" };
155
+ }
156
+ if (!shim.includes("Tailii host launcher"))
157
+ return { managed: false, reason: "foreign-shim" };
158
+ return { managed: true, reason: "ok" };
159
+ }
160
+ export function writeLastUpdate(record, filePath = lastUpdatePath()) {
161
+ try {
162
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
163
+ fs.writeFileSync(filePath, JSON.stringify(record));
164
+ }
165
+ catch {
166
+ // 記録は best-effort(更新自体の成否には影響させない)。
167
+ }
168
+ }
169
+ /**
170
+ * 直近の更新失敗を読む(24h 以内 かつ 現行版が目標に達していない場合のみ)。
171
+ * hello に載せてアプリのバナーへ届けるための供給源。
172
+ */
173
+ export function readRecentUpdateError(currentVersion, filePath = lastUpdatePath()) {
174
+ try {
175
+ const parsed = JSON.parse(fs.readFileSync(filePath, "utf8"));
176
+ if (typeof parsed !== "object" || parsed === null)
177
+ return undefined;
178
+ const record = parsed;
179
+ if (record.ok !== false || typeof record.error !== "string")
180
+ return undefined;
181
+ if (typeof record.tsMs !== "number" || Date.now() - record.tsMs > 24 * 3600_000)
182
+ return undefined;
183
+ if (typeof record.target === "string" && record.target === currentVersion)
184
+ return undefined;
185
+ return record.error;
186
+ }
187
+ catch {
188
+ return undefined;
189
+ }
190
+ }
191
+ function readLock() {
192
+ try {
193
+ const parsed = JSON.parse(fs.readFileSync(updateLockPath(), "utf8"));
194
+ if (typeof parsed.pid !== "number" || typeof parsed.target !== "string")
195
+ return null;
196
+ return { pid: parsed.pid, target: parsed.target, tsMs: typeof parsed.tsMs === "number" ? parsed.tsMs : 0 };
197
+ }
198
+ catch {
199
+ return null;
200
+ }
201
+ }
202
+ function pidAlive(pid) {
203
+ try {
204
+ process.kill(pid, 0);
205
+ return true;
206
+ }
207
+ catch {
208
+ return false;
209
+ }
210
+ }
211
+ /** 進行中の更新があるか(RPC ハンドラの in_progress 判定と共有)。 */
212
+ export function updateInProgress() {
213
+ const lock = readLock();
214
+ return lock !== null && pidAlive(lock.pid);
215
+ }
216
+ /** lock を獲得する。獲得できなければ false(進行中)。stale lock は奪う。 */
217
+ function acquireLock(target) {
218
+ fs.mkdirSync(selfUpdateRoot(), { recursive: true });
219
+ const payload = JSON.stringify({ pid: process.pid, target, tsMs: Date.now() });
220
+ try {
221
+ fs.writeFileSync(updateLockPath(), payload, { flag: "wx" });
222
+ return true;
223
+ }
224
+ catch {
225
+ const lock = readLock();
226
+ if (lock !== null && pidAlive(lock.pid))
227
+ return false;
228
+ // 死んだ更新の残骸。上書きで奪う。
229
+ fs.writeFileSync(updateLockPath(), payload);
230
+ return true;
231
+ }
232
+ }
233
+ function releaseLock() {
234
+ try {
235
+ fs.unlinkSync(updateLockPath());
236
+ }
237
+ catch {
238
+ // 無ければそれでよい。
239
+ }
240
+ }
241
+ async function fetchJSON(url, timeoutMs) {
242
+ const response = await fetch(url, {
243
+ signal: AbortSignal.timeout(timeoutMs),
244
+ headers: { accept: "application/vnd.npm.install-v1+json, application/json" },
245
+ });
246
+ if (!response.ok)
247
+ throw new Error(`GET ${url} → HTTP ${response.status}`);
248
+ return response.json();
249
+ }
250
+ async function fetchVersionMeta(name, version) {
251
+ const url = `${registryBase()}/${encodeURIComponent(name).replace("%2F", "/")}/${version}`;
252
+ const raw = (await fetchJSON(url, 30_000));
253
+ if (raw === null || typeof raw !== "object" || raw.dist?.tarball === undefined) {
254
+ throw new Error(`${name}@${version} の registry メタデータが不正です`);
255
+ }
256
+ return raw;
257
+ }
258
+ /** packument からバージョン一覧を取る(range 解決用・corgi 形式で軽量に)。 */
259
+ async function fetchVersionList(name) {
260
+ const url = `${registryBase()}/${encodeURIComponent(name).replace("%2F", "/")}`;
261
+ const raw = (await fetchJSON(url, 30_000));
262
+ if (raw === null || typeof raw !== "object" || raw.versions === undefined) {
263
+ throw new Error(`${name} の packument が不正です`);
264
+ }
265
+ return Object.keys(raw.versions);
266
+ }
267
+ async function downloadTarball(url) {
268
+ const response = await fetch(url, { signal: AbortSignal.timeout(180_000) });
269
+ if (!response.ok)
270
+ throw new Error(`GET ${url} → HTTP ${response.status}`);
271
+ return Buffer.from(await response.arrayBuffer());
272
+ }
273
+ // MARK: - 展開
274
+ function tarBinary() {
275
+ return fs.existsSync("/usr/bin/tar") ? "/usr/bin/tar" : "tar";
276
+ }
277
+ /** npm tarball(gzip, ルート package/)を destDir へ展開する。 */
278
+ async function extractTarball(tgzPath, destDir) {
279
+ fs.mkdirSync(destDir, { recursive: true });
280
+ await new Promise((resolve, reject) => {
281
+ execFile(tarBinary(), ["-xzf", tgzPath, "-C", destDir], { timeout: 120_000 }, (error) => {
282
+ if (error)
283
+ reject(new Error(`tar 展開失敗: ${String(error)}`));
284
+ else
285
+ resolve();
286
+ });
287
+ });
288
+ }
289
+ async function installPackageTree(target, appIntegrity, io) {
290
+ // 1. 目標バージョンのメタデータ。未 publish はここで確実に落ちる。
291
+ const meta = await fetchVersionMeta(PACKAGE_NAME, target);
292
+ // 2. アプリ同梱 integrity と registry の食い違いは供給網の警報(続行しない)。
293
+ if (appIntegrity !== undefined && meta.dist.integrity !== undefined && appIntegrity !== meta.dist.integrity) {
294
+ throw new Error(`integrity がアプリのピンと registry で食い違っています(供給網警報): app=${appIntegrity} registry=${meta.dist.integrity}`);
295
+ }
296
+ // 3. engines.node の fast-fail(最終ゲートは後段のスモーク)。
297
+ const minimum = parseEnginesNodeMinimum(meta.engines?.node);
298
+ const current = parseTriple(process.versions.node);
299
+ if (minimum !== null && current !== null && compareTriple(current, minimum) < 0) {
300
+ throw new Error(`Node.js が不足しています(必要 ${meta.engines?.node}, 現在 ${process.versions.node})。` +
301
+ "ホストの Node.js を更新してから再試行してください");
302
+ }
303
+ // 4. 本体 tarball の取得と検証(アプリ提供 integrity を優先)。
304
+ io.log(`tarball 取得: ${meta.dist.tarball}`);
305
+ const tarball = await downloadTarball(meta.dist.tarball);
306
+ const verification = verifyTarball(tarball, {
307
+ integrity: appIntegrity ?? meta.dist.integrity,
308
+ shasum: meta.dist.shasum,
309
+ });
310
+ if (!verification.ok)
311
+ throw new Error(`本体 tarball の検証失敗: ${verification.detail}`);
312
+ // 5. 展開先を組み立てる(既存の中途半端な残骸は作り直す)。
313
+ const installDir = path.join(versionsDir(), target);
314
+ fs.rmSync(installDir, { recursive: true, force: true });
315
+ fs.mkdirSync(installDir, { recursive: true });
316
+ const tgzPath = path.join(installDir, "package.tgz");
317
+ fs.writeFileSync(tgzPath, tarball);
318
+ await extractTarball(tgzPath, installDir);
319
+ fs.rmSync(tgzPath, { force: true });
320
+ const packageDir = path.join(installDir, "package");
321
+ if (!fs.existsSync(path.join(packageDir, "dist", "cli.js"))) {
322
+ throw new Error("展開結果に dist/cli.js がありません");
323
+ }
324
+ // 6. deps の配置。通常 deps は全部、optional は現プラットフォームの QUIC prebuilt のみ。
325
+ const nodeModules = path.join(packageDir, "node_modules");
326
+ const wantedDeps = Object.entries(meta.dependencies ?? {});
327
+ const arch = os.arch() === "arm64" ? "arm64" : "x64";
328
+ const platformQuicPkg = `@tailii/quic-gw-darwin-${arch}`;
329
+ for (const [name, range] of Object.entries(meta.optionalDependencies ?? {})) {
330
+ if (process.platform === "darwin" && name === platformQuicPkg)
331
+ wantedDeps.push([name, range]);
332
+ }
333
+ for (const [name, range] of wantedDeps) {
334
+ const resolved = maxSatisfying(await fetchVersionList(name), range);
335
+ if (resolved === null) {
336
+ throw new Error(`依存 ${name}@${range} を解決できません(self-update は素の x.y.z と ^x.y.z のみ対応)`);
337
+ }
338
+ const depMeta = await fetchVersionMeta(name, resolved);
339
+ io.log(`依存を配置: ${name}@${resolved}`);
340
+ const depTarball = await downloadTarball(depMeta.dist.tarball);
341
+ const depVerification = verifyTarball(depTarball, { integrity: depMeta.dist.integrity, shasum: depMeta.dist.shasum });
342
+ if (!depVerification.ok)
343
+ throw new Error(`依存 ${name} の検証失敗: ${depVerification.detail}`);
344
+ const depTmp = path.join(installDir, "dep.tgz");
345
+ fs.writeFileSync(depTmp, depTarball);
346
+ const depExtract = path.join(installDir, "dep-extract");
347
+ fs.rmSync(depExtract, { recursive: true, force: true });
348
+ await extractTarball(depTmp, depExtract);
349
+ const depDest = path.join(nodeModules, name);
350
+ fs.mkdirSync(path.dirname(depDest), { recursive: true });
351
+ fs.rmSync(depDest, { recursive: true, force: true });
352
+ fs.renameSync(path.join(depExtract, "package"), depDest);
353
+ fs.rmSync(depExtract, { recursive: true, force: true });
354
+ fs.rmSync(depTmp, { force: true });
355
+ }
356
+ // 7. 実行ビット(bin 利用と手動起動の保険。シム経由は node 引数渡しなので必須ではない)。
357
+ fs.chmodSync(path.join(packageDir, "dist", "cli.js"), 0o755);
358
+ return packageDir;
359
+ }
360
+ /** 新 cli が現行 node で起動し正しい版を名乗るか(swap 前の最終ゲート)。 */
361
+ async function smokeTest(cliPath, expectVersion) {
362
+ const stdout = await new Promise((resolve, reject) => {
363
+ execFile(process.execPath, [cliPath, "--version"], { timeout: 30_000 }, (error, out) => {
364
+ if (error)
365
+ reject(new Error(`スモーク失敗(新版が起動しません): ${String(error)}`));
366
+ else
367
+ resolve(out);
368
+ });
369
+ });
370
+ if (stdout.trim() !== expectVersion) {
371
+ throw new Error(`スモーク失敗: --version が ${stdout.trim()}(期待 ${expectVersion})`);
372
+ }
373
+ }
374
+ /** シムを新 cli へ向け直す。旧シムは .prev として保存(アプリ側の起動フォールバック用)。 */
375
+ function swapShim(newCliPath, shimBinDir = defaultShimBinDir()) {
376
+ const shimPath = path.join(shimBinDir, "tailii-host");
377
+ const next = shimContent(process.execPath, newCliPath);
378
+ const staging = shimPath + ".new";
379
+ fs.writeFileSync(staging, next, { mode: 0o755 });
380
+ try {
381
+ fs.copyFileSync(shimPath, shimPath + ".prev");
382
+ fs.chmodSync(shimPath + ".prev", 0o755);
383
+ }
384
+ catch {
385
+ // 初回など .prev を作れなくても swap は続行する(保険が減るだけ)。
386
+ }
387
+ fs.renameSync(staging, shimPath);
388
+ }
389
+ /** シム内容から exec 先 cli パスを読む(GC の保護対象決定用)。 */
390
+ export function cliPathFromShim(content) {
391
+ const m = /^exec "[^"]+" "([^"]+)"/m.exec(content);
392
+ return m === null ? null : m[1];
393
+ }
394
+ /** 設置済みホストに限り QUIC gateway を新版へ載せ替える(QUIC 未使用ホストでは何もしない)。 */
395
+ async function refreshQuicGateway(packageDir, io) {
396
+ if (process.platform !== "darwin")
397
+ return;
398
+ if (!fs.existsSync(quicLaunchAgentPlistPath()))
399
+ return;
400
+ const arch = os.arch() === "arm64" ? "arm64" : "x64";
401
+ const prebuilt = path.join(packageDir, "node_modules", `@tailii/quic-gw-darwin-${arch}`, "bin", "tailii-quic-gw");
402
+ if (!fs.existsSync(prebuilt)) {
403
+ io.log("QUIC prebuilt が新版に無いため gateway は据え置き");
404
+ return;
405
+ }
406
+ fs.chmodSync(prebuilt, 0o755);
407
+ // installQuicGatewayBinary の「サイズ一致なら据え置き」最適化は npm tarball の
408
+ // 正規化 mtime(過去日付)と噛み合い偽陰性になり得るため、更新時は必ずコピーする。
409
+ await installQuicLaunchAgent({
410
+ gatewayPath: prebuilt,
411
+ installBinary: (source) => {
412
+ const dest = path.join(os.homedir(), ".tailii", "bin", "tailii-quic-gw");
413
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
414
+ fs.copyFileSync(source, dest);
415
+ fs.chmodSync(dest, 0o755);
416
+ return dest;
417
+ },
418
+ });
419
+ io.log("QUIC gateway を新版へ載せ替え");
420
+ }
421
+ /** 目標と .prev が指す版以外の管理ディレクトリを消す(管理外の設置には触れない)。 */
422
+ function gcOldVersions(target, shimBinDir = defaultShimBinDir()) {
423
+ let keepPrev = null;
424
+ try {
425
+ const prev = fs.readFileSync(path.join(shimBinDir, "tailii-host.prev"), "utf8");
426
+ const cli = cliPathFromShim(prev);
427
+ if (cli !== null && cli.startsWith(versionsDir() + path.sep)) {
428
+ keepPrev = cli.slice((versionsDir() + path.sep).length).split(path.sep)[0] ?? null;
429
+ }
430
+ }
431
+ catch {
432
+ keepPrev = null;
433
+ }
434
+ let entries;
435
+ try {
436
+ entries = fs.readdirSync(versionsDir());
437
+ }
438
+ catch {
439
+ return;
440
+ }
441
+ for (const entry of entries) {
442
+ if (entry === target || entry === keepPrev)
443
+ continue;
444
+ fs.rmSync(path.join(versionsDir(), entry), { recursive: true, force: true });
445
+ }
446
+ }
447
+ /**
448
+ * self-update の CLI エントリ。usage: tailii self-update <version> [--integrity <sri>]
449
+ * 冪等: 既に目標版なら成功(0)。進行中なら成功(0)。検証失敗・環境不備は 1。
450
+ */
451
+ export async function runSelfUpdateCommand(argv) {
452
+ const positional = [];
453
+ let integrity;
454
+ for (let i = 0; i < argv.length; i++) {
455
+ if (argv[i] === "--integrity") {
456
+ integrity = argv[i + 1];
457
+ i++;
458
+ }
459
+ else {
460
+ positional.push(argv[i]);
461
+ }
462
+ }
463
+ const target = positional[0];
464
+ if (target === undefined || parseTriple(target) === null) {
465
+ process.stderr.write("usage: tailii self-update <x.y.z> [--integrity <sha512-…>]\n");
466
+ return 64;
467
+ }
468
+ const io = {
469
+ log: (line) => process.stdout.write(`[self-update] ${line}\n`),
470
+ };
471
+ const current = readPackageVersion();
472
+ if (current === target) {
473
+ io.log(`既に ${target} です`);
474
+ return 0;
475
+ }
476
+ const currentTriple = current !== null ? parseTriple(current) : null;
477
+ // 拒否のみで記録しない: last-update.json は実際に走った更新の成否専用
478
+ // (手動 CLI のダウングレード試行が channel_hello.updateError を汚さないように)。
479
+ if (currentTriple !== null && compareTriple(parseTriple(target), currentTriple) < 0) {
480
+ process.stderr.write(`[self-update] ダウングレードは行いません(現在 ${current} → 要求 ${target})\n`);
481
+ return 1;
482
+ }
483
+ const installState = resolveInstallState();
484
+ if (!installState.managed) {
485
+ process.stderr.write(`[self-update] 自動更新の対象外です(${installState.reason})。手動で更新してください\n`);
486
+ return 1;
487
+ }
488
+ if (!acquireLock(target)) {
489
+ io.log("別の更新が進行中のため何もしません");
490
+ return 0;
491
+ }
492
+ try {
493
+ const packageDir = await installPackageTree(target, integrity, io);
494
+ const newCliPath = path.join(packageDir, "dist", "cli.js");
495
+ await smokeTest(newCliPath, target);
496
+ swapShim(newCliPath);
497
+ io.log(`シムを ${target} へ切替`);
498
+ await refreshQuicGateway(packageDir, io);
499
+ gcOldVersions(target);
500
+ writeLastUpdate({ target, ok: true, tsMs: Date.now() });
501
+ io.log(`完了: ${current ?? "?"} → ${target}(次回接続から新版)`);
502
+ return 0;
503
+ }
504
+ catch (error) {
505
+ const message = error instanceof Error ? error.message : String(error);
506
+ process.stderr.write(`[self-update] 失敗: ${message}\n`);
507
+ writeLastUpdate({ target, ok: false, error: message, tsMs: Date.now() });
508
+ return 1;
509
+ }
510
+ finally {
511
+ releaseLock();
512
+ }
513
+ }
514
+ // MARK: - engine からの起動(RPC ハンドラ用)
515
+ /**
516
+ * updater を現行 cli から detached で起動する(engine の生死と切り離す)。
517
+ * ログは ~/.tailii/host/update.log へ追記。
518
+ */
519
+ export function spawnDetachedSelfUpdate(version, integrity) {
520
+ fs.mkdirSync(selfUpdateRoot(), { recursive: true });
521
+ const logFd = fs.openSync(updateLogPath(), "a");
522
+ try {
523
+ const args = [resolveOwnCliPath(), "self-update", version];
524
+ if (integrity !== undefined)
525
+ args.push("--integrity", integrity);
526
+ const child = spawn(process.execPath, args, {
527
+ detached: true,
528
+ stdio: ["ignore", logFd, logFd],
529
+ });
530
+ child.unref();
531
+ }
532
+ finally {
533
+ fs.closeSync(logFd);
534
+ }
535
+ }
536
+ //# sourceMappingURL=selfUpdate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selfUpdate.js","sourceRoot":"","sources":["../../src/commands/selfUpdate.ts"],"names":[],"mappings":"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"}